标题微信公众号如何实现录音功能(包含下载到服务器+AMR转化为MP3格式)

标题微信公众号如何实现录音功能(包含下载到服务器+AMR转化为MP3格式)

我们在微信公众号开发的过程中,总会遇到各种各样的需求和难题,然而最大的难题是微信公众号的开发文档,说多了都是泪,总结起来就是一个‘虚’字了得,不过项目还是要做的,下面是我在开发过程中的一点心得,希望对大家能有帮助,不足之处,请大家多多指正,共同学习。
标题微信公众号如何实现录音功能(包含下载到服务器+AMR转化为MP3格式)_第1张图片
一、 微信音频接口说明
具体以最新官方文档为准原文地址: 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;

写在最后:本文只是列举了一下大概的实现,没有把全部代码放出来,大家可以根据核心代码自行封装即可

你可能感兴趣的:(微信公众号开发那点小事)