最近实现录音功能,主要涉及到录音的上传和下载,以及转码问题。微信,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. c语言函数

    听着函数这两个字多多少少都会觉得有点复杂吧.因为一想到函数大多数人都会想到f(x),但其实c语言里面的函数不是那样的,老师教了一个很好的理解方法函数就是个机器人,而这个机器人是你自己做出来的.所有不用 ...

  2. ES5基础之正则表达式01:初次见面

    1.正则初次见面 测试地址:https://regexper.com 第一个正则:匹配 2006-10-11 或 2006/10/11 var reg = /^\d{4}[-/]\d{2}[-/]\d ...

  3. Jquery遮罩插件,想罩哪就罩哪!

    一  前言 在项目开发时发现没有一个用起来 爽一点的遮罩插件,看起来觉得不难 好吧那就利用空闲时间,自己折腾一个吧,也好把jquery再温习一下, 需要的功能如下 1 可以全屏遮 用于提交数据时 2 ...

  4. Ceph RGW 和 niginx 配置要点

    cat /etc/nginx/sites-enabled/rgw.conf server { listen 80 default; #server_name .com .com.cn .net .cn ...

  5. HTML form 表单

    1.id.name的关系 通常我们在写HTML代码时,会给控件指定一个id属性,这个属性只供JS和CSS使用,在表单提交时,它不起任何作用; 在HTML代码中我们会指定不同的value为各个不同的控件 ...

  6. layer弹窗监控键盘事件

    在开发中我们常常遇到客服各种其他问题,现在客服需要键盘按下关闭当前窗口事件和鼠标点击确定按钮事件一样. 我们需要在layer中编写一个监控事件.具体代码如下 layer.confirm('is not ...

  7. Python笔记(3)迭代器与生成器

    参考自:http://www.cnblogs.com/huxi/category/251137.html 迭代器 迭代器是访问集合内元素的一种方式,他不能倒退只能一直迭代下去.可以写到for循环in后 ...

  8. Python3 基本数据类型

    Python中的变量不需要声明,每个变量使用前必须赋值,变量赋值后才会被创建,在Python中变量就是变量,它没有类型.我们所说的"类型"是变量所指的内存中对象的类型. 等号(=) ...

  9. jsp中的<%%>和<!%%>的区别

    jsp 都是解析成.java文件` 具体代码请看 如果你写 <%int a=1;%> 生成的代码是 public class xxx_jsp { public void doProcess ...

  10. 【Codefoces487E/UOJ#30】Tourists Tarjan 点双连通分量 + 树链剖分

    E. Tourists time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard inpu ...