标题微信公众号如何实现录音功能(包含下载到服务器+AMR转化为MP3格式)
我们在微信公众号开发的过程中,总会遇到各种各样的需求和难题,然而最大的难题是微信公众号的开发文档,说多了都是泪,总结起来就是一个‘虚’字了得,不过项目还是要做的,下面是我在开发过程中的一点心得,希望对大家能有帮助,不足之处,请大家多多指正,共同学习。
一、 微信音频接口说明
具体以最新官方文档为准原文地址: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#23
1.1.1 权限的声明
在使用前需要申明相对应的权限,具体使用以个人卡发需求为主。
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: appId, // 必填,公众号的唯一标识
timestamp: timestamp, // 必填,生成签名的时间戳
nonceStr: nonceStr, // 必填,生成签名的随机串
signature: signature,// 必填,签名,见附录1
jsApiList: [
'startRecord',
'stopRecord',
'onVoiceRecordEnd',
'downloadVoice',
'uploadVoice'
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
1.1.2 开始录音接口
wx.startRecord();
1.1.3 停止录音接口
wx.stopRecord({
success: function (res) {
var localId = res.localId;
}
});
1.1.4 监听录音自动停止接口
wx.onVoiceRecordEnd({
// 录音时间超过一分钟没有停止的时候会执行 complete 回调
complete: function (res) {
var localId = res.localId;
}
});
1.1.5 播放语音接口
wx.playVoice({
localId: '' // 需要播放的音频的本地ID,由stopRecord接口获得
});
1.1.6 暂停播放接口
wx.pauseVoice({
localId: '' // 需要暂停的音频的本地ID,由stopRecord接口获得
});
1.1.7 停止播放接口
wx.stopVoice({
localId: '' // 需要停止的音频的本地ID,由stopRecord接口获得
});
1.1.8 监听语音播放完毕接口
wx.onVoicePlayEnd({
success: function (res) {
var localId = res.localId; // 返回音频的本地ID
}
});
1.1.9 上传语音接口
wx.uploadVoice({
localId: '', // 需要上传的音频的本地ID,由stopRecord接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var serverId = res.serverId; // 返回音频的服务器端ID
}
});
备注:上传语音有效期3天,可用微信多媒体接口下载语音到自己的服务器,此处获得的 serverId 即 media_id,参考文档 .目前多媒体文件下载接口的频率限制为10000次/天,如需要调高频率,请登录微信公众平台,在开发 - 接口权限的列表中,申请提高临时上限。
1.2.0下载语音接口
wx.downloadVoice({
serverId: '', // 需要下载的音频的服务器端ID,由uploadVoice接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var localId = res.localId; // 返回音频的本地ID
}
});
1.2.1智能接口
识别音频并返回识别结果接口
wx.translateVoice({
localId: '', // 需要识别的音频的本地Id,由录音相关接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
alert(res.translateResult); // 语音识别的结果
}
});
二、 H5页面功能实现
封装一下录音 的方法,在需要用的地址直接调用就可以。
WechatEvent: {
//开始录音
Wechat_StartRecord: function () {
wx.startRecord({
cancel: function () {
//用户取消权限的处理...
}
});
},
//停止录音
Wechat_StopRecord: function () {
wx.stopRecord({
success: function (res) {
var localId = res.localId;
//上传录音文件到微信服务器
wx.uploadVoice({
localId: localId, // 需要上传的音频的本地ID,由stopRecord接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var serverId = res.serverId; // 返回音频的服务器端ID
WechatEvent.DownLoadAudio(serverId );//上传到自己服务器下载的方法....
}
});
}
});
},
//自己服务器下载微信服务器录音文件的方法(服务器的方法)
DownLoadAudio: function (serverId) {
jQuery.ajax({
type: "POST",//使用get方法访问后台
dataType: "json",
url: "自己的接口地址",
data: { "serverId": serverId}, //上传到微信服务器后返回的serverId
success: function (data) {
//服务器处理成功的时候页面自己处理
},
}
});
},
三、服务器端下载微信音频文件部分
服务器利用ffmpeg.exe 将从微信服务器上获取的录音文件**,转化为自己想要的格式**
核心代码:
3.1.1 下载微信服务器的录音文件到服务器指定的文件夹下
核心代码:
string url =@”https://api.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}“;
url = string.Format(url, files.Content, files.FileSize); // 微信服务器下载录音问价的地址
string strpath = string.Empty;
string savepath = string.Empty;
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{
HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();
strpath = myResponse.ResponseUri.ToString();//下载录音文件的地址
WebClient mywebclient = new WebClient();
savepath = "服务器上文件夹的路径"+ ”录音文件的名字“ + ".amr";//微信服务器下载的 录音文件保存的地址
try
{
mywebclient.DownloadFile(strpath, savepath);//下载录音文件
}
catch (Exception ex)
{
}
}
```
**备注:因为编码方式不同,测试的时候要在真机上测试,在微信开发者工具上会存在一定问题。**
**3.1.2 录音文件格式的转化**
(1) 核心工具ffmpeg.exe ,百度自己下载即可
```csharp
string outStr = "";
Process process = new Process();
try
{
string filepath = System.AppDomain.CurrentDomain.BaseDirectory;
process.StartInfo.FileName = filepath+"ffmpeg" + "\\" + "ffmpeg.exe"; // 这里也可以指定 ffmpeg的绝对路径
process.StartInfo.Arguments = @" -i " + "下载到服务器的录音地址" + " " + (要转化到的地址) + ".mp3";
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardError = true;
process.Start();
process.BeginErrorReadLine(); // 开始异步读取
process.WaitForExit(); // 等待转码完成
if (process.ExitCode == 0)
{
outStr = process.StandardOutput.ReadToEnd();
}
else
{
outStr = "";
}
}
catch (Exception ex)
{
outStr = "";
}
finally
{
process.Close();
process.Dispose();
}
return outStr;
(2) 利用ffmpeg.exe 获取音频文件的时长
string duration = "";//时长
try
{
using (Process pro = new Process())
{
pro.StartInfo.UseShellExecute = false;
pro.StartInfo.ErrorDialog = false;
pro.StartInfo.RedirectStandardError = true;
pro.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + "ffmpeg" + "\\" + "ffmpeg.exe";
pro.StartInfo.Arguments = " -i " + ”要获取时长的音频文件的绝对地址“;
pro.Start();
System.IO.StreamReader errorreader = pro.StandardError;
pro.WaitForExit(1000);
string result = errorreader.ReadToEnd();
if (!string.IsNullOrEmpty(result))
{
//获取到的时长
result = result.Substring(result.IndexOf("Duration: ") + ("Duration: ").Length, ("00:00:00").Length);
duration = result;
}
}
}
catch (Exception ex)
{
}
return duration;
写在最后:本文只是列举了一下大概的实现,没有把全部代码放出来,大家可以根据核心代码自行封装即可