最近实现录音功能,主要涉及到录音的上传和下载,以及转码问题。微信,QQ默认的的音频文件是amr格式的,而播放器却不识别amr格式的音频,必须尽行转码。amr文件分为两种,一种是通用的amr格式,这种文件可以用任意播放器打开播放。但是还有另外一种amr文件,这种文件的后缀虽然是amr,但其实其内部并不是真正的amr格式。有不对的地方有请各方大神批评指正,具体实现如下:

1.调用微信录音接口(开始录音,暂停录音,上传录音,)

具体接口请你参考 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

(1)record.jsp

$(function(){
//调用微信开始录音接口
wx.ready(function(){
//开始录音
alert("开始录音");
wx.startRecord();
});
//结束录音
wx.ready(function(){
wx.stopRecord({
success: function (res) {
var localId = res.localId;
alert("录音结束");
saveAlert(localId);
}
});
});
//声音标题,声音描述
var voiceTitle = $("#voiceTitle").val();
var voiceDesc = $("#voiceDesc").val();
//将录音上传腾讯服务器
wx.ready(function(){
wx.uploadVoice({
localId: id, // 需要上传的音频的本地ID,由stopRecord接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var serverId = res.serverId; // 返回音频的服务器端ID
saveIntoLocation(serverId,voiceTitle,voiceDesc);
}
});
});
}
function saveIntoLocation(id,title,desc){
var channelId = $("#channelIdResult").val();
var proId = $("#procastIdResult").val();
//alert(proId);
var url = "/taiyang/fm/saveInfoJson.action";
var postData = {
"en1.channelId" : channelId,
"en1.proTitle" : title,
"en1.proDesc" : desc,
"en1.podcastId" : proId,
"serverId" : id,
"appid" : appId
};
$.post(url, postData, function (data) {
if(data.success){
openSuccessLayer(data.message);
}else{
openFailureLayer(data.message);
}
},'json');
}
(2)WXFM.XML

 <package name="xiaovFmJson" extends="wxJsonData" namespace="/xiaov/fm">
!--微电台:保存录音标题到本地数据库-->
<action name="saveInfoJson" class="com.jerehsoft.taiyang.fm.action.weixin.WxRadioStationAction" method="saveInfo">
<result type="json"></result>
</action>
</package>

  

(3)WxRadioStationAction.java

public class WxRadioStationAction extends ActionSupport {
Log log = LogFactory.getLog(this.getClass());
private Map<String, Object> map1 = new HashMap<String, Object>(); ActionContext ac = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST); private Long memberid;
private String appid;
private String openid;
private String serverId; private boolean success;
private String message; @EntityInject
private WxFmProgramComment en;
@EntityInject
private WxFmProgrem en1; @Resource
IWxFmProgremService programService; /**
* 微电台录音:保存录音标题到本地数据库
*
* @return
* @throws Exception
*/
public String saveInfo() throws Exception {
//设置播客id
try {
//下载腾讯素材
if (serverId != null && !serverId.equals("")) {
CommAttachmentDetail file = mediaSer.downLoadFile(getAppid(), serverId);
if (file != null) {
//picPath:amr文件存放的全路径
String path = SystemConfig.get("sys.upload.dir");
String picPath = path + File.separator + file.getPathName() + file.getFileName();
//音频转换
Conversion conversion = new Conversion(); conversion.ToMp3("D:" + File.separator + "Program Files", picPath); String fileName = file.getFileName().substring(0, file.getFileName().indexOf(".")); String picPathDataBase = file.getPathName() + fileName + ".mp3"; en1.setFileAddr(picPathDataBase);
}
}
en1.setAppId(getAppid());
//时间
WxFmProgrem Progrem = programService.save(en1);
success = true;
map1.put("success", true);
map1.put("message", "提交成功");
} catch (Exception e) {
message = "提交失败";
success = false;
e.getStackTrace();
e.printStackTrace();
} return SUCCESS;
}
public String getAppid() {
return appid;
} public void setAppid(String appid) {
this.appid = appid;
}
public String getServerId() {
return serverId;
} public void setServerId(String serverId) {
this.serverId = serverId;
}
}

  

(4) Conversion.java

public class Conversion {
/**
* 将上传的录音转为mp3格式
* @param webroot 项目的根目录
* @param sourcePath 文件的相对地址
*/
public static void ToMp3(String webroot, String sourcePath){
//File file = new File(sourcePath);
String [] a =sourcePath.split("\\.");
String targetPath = a[0]+".mp3";//转换后文件的存储地址,直接将原来的文件名后加mp3后缀名
Runtime run = null;
try {
run = Runtime.getRuntime();
long start=System.currentTimeMillis();
//Process p=run.exec(webroot+"files/ffmpeg -i "+webroot+sourcePath+" -acodec libmp3lame "+webroot+targetPath);
// 执行ffmpeg.exe,前面是ffmpeg.exe的地址,中间是需要转换的文件地址,后面是转换后的文件地址。-i是转换方式,意思是可编码解码,mp3编码方式采用的是libmp3lame
Process p=run.exec(webroot+"/ffmpeg/bin/ffmpeg -i "+sourcePath+" -acodec libmp3lame "+targetPath);
//释放进程
p.getOutputStream().close();
p.getInputStream().close();
p.getErrorStream().close();
p.waitFor();
long end=System.currentTimeMillis();
//System.out.println(sourcePath+" convert success, costs:"+(end-start)+"ms");
//删除原来的文件
/*if(file.exists()){
file.delete();
}*/
} catch (Exception e) {
e.printStackTrace();
}finally{
//run调用lame解码器最后释放内存
run.freeMemory();
}
} public static void main(String[] args) {
ToMp3("D:\\Program Files","E:\\a.amr");
}
}

  (5)注意点:

3个地址:webroot,sourcePath为绝对路径,webroot+"/ffmpeg/bin/ffmpeg"是自己电脑安装的ffmpeg的安装路径

电脑要安装FFMPEG,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

FFMPEG的安装请参考:http://www.bubuko.com/infodetail-786878.html

  

微信录音接口的调用以及amr文件转码MP3文件的实现的更多相关文章

  1. 读取SD卡文件夹下的MP3文件和播放MP3文件

    首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中): /** * 读取目录中的Mp3文件的名字和大小 */ public Lis ...

  2. 微信 msg_sec_check接口PHP 调用

    $checkContent = '要检测的内容'; $url = 'https://api.weixin.qq.com/wxa/msg_sec_check?access_token='. $res[& ...

  3. ape 文件 转化为mp3 文件

    试了很多软件,最后才发觉 any-audio-converter最好用. 可以吧ape 按 cue切割好,然后转化成 MP3 官网可以免费下载: https://www.any-audio-conve ...

  4. 微信录音文件上传到服务器以及amr转化成MP3格式

    微信公众号音频接口开发 根据业务需求,我们可能需要将微信录音保存到服务器,而通过微信上传语音接口上传到微信服务器的语音文件的有效期只有3天,所以需要将文件下载到我们自己的服务器. 上传语音接口 wx. ...

  5. 微信录音文件上传到服务器以及amr转化成MP3格式,linux上转换简单方法

    微信公众号音频接口开发 根据业务需求,我们可能需要将微信录音保存到服务器,而通过微信上传语音接口上传到微信服务器的语音文件的有效期只有3天,所以需要将文件下载到我们自己的服务器. 上传语音接口 wx. ...

  6. 微信JS-SDK 接口调用与 php 遇到的坑

    问题:config:invalid signature一直爆这个错误 解决: 看我把这些坑都总结了一下:要命的invalid signature. https://segmentfault.com/q ...

  7. 【微信小程序】调用wx.request接口需要注意的问题

    写在前面 之前写了一篇<微信小程序实现各种特效实例>,上次的小程序的项目我负责大部分前端后台接口的对接,然后学长帮我改了一些问题.总的来说,收获了不少吧! 现在项目已经完成,还是要陆陆续续 ...

  8. 调用微信JS-SDK接口上传图片

    最近要在微信上做个问卷调查,有个上传图片功能,折腾找了半天资料,都不好弄,最终打算调用微信提供的上传图片接口,实现上传图片功能!此功能最大的好处是可以在微信服务器上暂存图片,减少本地服务器图片的缓存, ...

  9. 利用JS-SDK微信分享接口调用(后端.NET)

    一直都想研究一下JS-SDK微信分享的接口调用,由于最近工作需要,研究了一下,目前只是实现了部分接口的调用:其他接口调用也是类似的: 在开发之前,需要提前准备一个微信公众号,并且域名JSAPI 配置接 ...

随机推荐

  1. web端功能测试总结(二)

    一.输入框测试 在web测试中,我们经常遇到这种输入框的测试,输入框测试看似简单,实际上包含了很多的测试基本的方法,思考逻辑,下面就是我总结出来的一些注意点: 1)验证输入输出信息的一致性 2)输入框 ...

  2. MBR与GPT

    mrb用于win平台gpt主要用于mac(苹果),MBR分区表与GPT分区表的关系 与支持最大卷为2 TB(Terabytes)并且每个磁盘最多有4个主分区(或3个主分区,1个扩展分区和无限制的逻辑驱 ...

  3. J2EE,J2SE,J2ME,JDK,SDK,JRE,JVM区别

    转自:http://www.metsky.com/archives/547.html 一.J2EE.J2SE.J2ME区别 J2EE——全称Java 2 Enterprise Edition,是Jav ...

  4. EasyUI datagrildview导出excel报表

    $.extend($.fn.datagrid.methods, { toExcel: function(jq, filename){ return jq.each(function(){ var ur ...

  5. ts 格式化日期输出

    功能 像C#中DateTime的ToString的格式化输出一样,在js/ts中输出格式化的日期字符串 网上很多正则的,不加分隔符就不行了,和C#的格式也不一样 刚接触js/ts没两月,可能会有问题. ...

  6. 微信小程序之小豆瓣图书

    最近微信小程序被炒得很火热,本人也抱着试一试的态度下载了微信web开发者工具,开发工具比较简洁,功能相对比较少,个性化设置也没有.了解完开发工具之后,顺便看了一下小程序的官方开发文档,大概了解了小程序 ...

  7. Android开发自学笔记(Android Studio)—4.4 AdapterView及其子类

    一.引言       AdapterView本身是一个抽象类,而它派生的子类在用法上也基本相似,只是在显示上有一定区别,因此把他们也归为一类.       AdapterView具有如下特征: Ada ...

  8. Ubuntu下sphinx使用

    Ubuntu安装 参考文档 进入sphinx mysql -h0 -P9306 查询 select * from 索引名

  9. Thinking in java学习笔记之迭代器

    Map<String,String> map = new HashMap<String,String>(); List list = new ArrayList(); list ...

  10. 收集的在线图片压缩(jpg/png)

    http://www.yasuotu.com/ http://www.jpegmini.com/ http://www.tumiaoya.com/ https://tinypng.com/(推荐) h ...