最近实现录音功能,主要涉及到录音的上传和下载,以及转码问题。微信,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# 传递Null的string值导致的调用C++的dll报错 Attempted to read or write protected memory.

    c# 调用C++的dll报错 Attempted to read or write protected memory:   原因是:c# 传递Null的string值导致的,将Null改为string ...

  2. dockerRegistry搭建

    docker registry安装: 官方仓库下载registry     pull镜像: fu@ubuntu:~$ sudo docker pull registry    运行镜像 : sudo ...

  3. 51nod DP 最大子段和

    #include<iostream> #include<algorithm> #include<cstdio> #define MAXN 50000 using n ...

  4. canvas弹动效果

    弹动效果,用物体与目标的距离乘上系数再累加至速度上,让物体呈加速度运动,再让速度乘与摩擦力系数,让物体最终停止运动 代码如下所示 var canvas = document.getElementByI ...

  5. Java链栈

    package com.lxm.customDataStructure; public class LinkStack<T>{ class Node<T>{ T data; N ...

  6. 利用phpize 外挂php扩展

    如果你的php是手动编译安装的 ,可能有一些扩展一开始并没有开启,以后需要某扩展的时候又不想重新编译php,使用phpize可以动态添加扩展 以Ubuntu为例, 如果你是我这样安装php的  apt ...

  7. Spinner

    资源的方式添加 安卓中的下拉框 Spinner可以通过xml string中配置 <string-array name="spingarr"> <item> ...

  8. Java中 NIO与IO的区别

    当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...

  9. Java文件写入,换行

    import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOExce ...

  10. AE开发中栅格图层实现分级渲染

    GP工具IDW执行后,生成的栅格图层是黑白二色,需要手动进行分级渲染,似乎不是所有栅格图层都可以进行分级渲染,注意异常处理.注意ARCMAP中是有颜色的,无需自己处理. IRasterClassify ...