Skip to content

Commit

Permalink
微信录音解除1分钟限制
Browse files Browse the repository at this point in the history
  • Loading branch information
xiangyuecn committed Apr 24, 2019
1 parent be0c733 commit 544552e
Show file tree
Hide file tree
Showing 6 changed files with 214 additions and 84 deletions.
3 changes: 2 additions & 1 deletion app-support-sample/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ IOS其他浏览器||

## 限制功能

- `IOS-Weixin`不支持实时回调、`微信JsSDK`限制录音最长为60秒;因此当在IOS微信上录音时,实时音量反馈、实时波形等功能不会有效果,录音超过60秒还未调用`Stop`进行停止录音时,停止时也仅仅会返回60秒录音;并且微信素材下载接口下载的amr音频音质勉强能听(总比没有好,自行实现时也许可以使用它的高清接口,不过需要服务器端转码)。
- `IOS-Weixin`不支持实时回调,因此当在IOS微信上录音时,实时音量反馈、实时波形等功能不会有效果;并且微信素材下载接口下载的amr音频音质勉强能听(总比没有好,自行实现时也许可以使用它的高清接口,不过需要服务器端转码)。
- `IOS-Weixin`使用的`微信JsSDK`单次调用录音最长为60秒,底层已屏蔽了这个限制,超时后会立即重启接续录音,因此当在IOS微信上录音时,超过60秒还未停止,将重启录音,中间可能会导致短暂的停顿感觉。
- 如果开启了`Native`支持,并且环境支持App原生录音,`Recorder`对象将不可用,因为不会加载`Recorder`库。


Expand Down
33 changes: 23 additions & 10 deletions app-support-sample/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -261,12 +261,14 @@
var bit=+$(".bit").val();
var sample=+$(".sample").val();
var wave,waveSet=$(".recwaveSet")[0].checked;
curSet={
var set={
type:type
,bitRate:bit
,sampleRate:sample
};
RecordApp.Start(curSet,function(){
curSet=null;
RecordApp.Start(set,function(){
curSet=set;
reclog(RecordApp.Current.Key+"已打开:"+type+" "+bit+"kbps");

wave=Recorder.WaveView({elem:".recwave"});
Expand Down Expand Up @@ -298,15 +300,26 @@
reclog(tag+":"+intp(set.bitRate,3)+"kbps "+intp(set.sampleRate,5)+"hz 花"+intp(Date.now()-t1,4)+"ms编码"+intp(blob.size,6)+"b ["+set.type+"]"+intp(time,6)+'ms <button onclick="recdown(\''+id+'\')">下载</button> <button onclick="recplay(\''+id+'\')">播放</button> <span class="p'+id+'"></span> <span class="d'+id+'"></span>');
};

var obj=setData.DownWxMediaData;//微信JsSDK 下载到的音频源文件
if(obj){
var bstr=atob(obj.data),n=bstr.length,u8arr=new Uint8Array(n);
while(n--){
u8arr[n]=bstr.charCodeAt(n);
var wxData=setData.DownWxMediaData;//微信JsSDK 下载到的音频源文件
if(wxData){
var list=wxData.list;
delete wxData.list;

reclog("<span style='color:#fb0'>发现微信JsSDK服务器端下载下来的音频源文件,播放可能需要上面点击换到amr类型,加载amr解码器<span>");
reclog("共"+list.length+"段,时间统计:"+JSON.stringify(wxData));

var t1x=t1;
t1=Date.now();
for(var i=0;i<list.length;i++){
var obj=list[i];
var bstr=atob(obj.data),n=bstr.length,u8arr=new Uint8Array(n);
while(n--){
u8arr[n]=bstr.charCodeAt(n);
};
var blob2=new Blob([u8arr], {type:obj.mime});
add("<span style='color:#0b1'>微信源片段"+(i+1)+"</span>",blob2,{type:/\/(\w+)/.exec(obj.mime)[1]});
};
var blob2=new Blob([u8arr], {type:obj.mime});
reclog("发现微信JsSDK服务器端下载下来的音频源文件,播放可能需要上面点击换到amr类型,加载amr解码器");
add("微信下载源",blob2,{type:/\/(\w+)/.exec(obj.mime)[1]});
t1=t1x;
};
add("已录制",blob,setData);
},function(s){
Expand Down
21 changes: 15 additions & 6 deletions app-support-sample/ios-weixin-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,23 +64,32 @@ config.WxReady=function(call){
config.DownWxMedia=function(param,success,fail){
/*下载微信录音素材,服务器端接口文档: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738727
param:{//接口调用参数
mediaId:"" 录音接口上传得到的微信服务器上的ID
type:"mp3" 录音set中的类型,用于转码参考,正常情况下这个参数用不到。如果接口返回的mime不是audio/amr,那必须是:audio/type(如:audio/mp3);因为amr可以在js中完成转码,其他类型目前只能靠服务器端转码。另外素材下载的amr音质很渣,也许可以通过高清接口获得清晰点的音频,那么这个参数就有用武之地。
mediaId:"" 录音接口上传得到的微信服务器上的ID,用于下载单个素材(如果录音分了多段,会循环调用DownWxMedia);如果服务器会进行转码,请忽略这个参数
transform_mediaIds:"mediaId,mediaId,mediaId" 1个及以上mediaId,半角逗号分隔,用于服务器端进行转码用的,正常情况下这个参数用不到。如果服务器端会进行转码,需要把这些素材全部下载下来,然后按顺序合并为一个音频文件
transform_type:"mp3" 录音set中的类型,用于转码结果类型,正常情况下这个参数用不到。如果服务器端会进行转码,接口返回的mime必须是:audio/type(如:audio/mp3)。
transform_bitRate:123 建议的比特率,转码用的,同transform_type
transform_sampleRate:123 建议的采样率,转码用的,同transform_type
* 素材下载的amr音质很渣,也许可以通过高清接口获得清晰点的音频,那么后两个参数就有用武之地。
}
success: fn(obj) 下载成功返回结果
obj:{
mime:"audio/amr" //这个值是服务器端请求临时素材接口返回的Content-Type响应头
,data:"base64文本" //服务器端下载到的文件二进制内容进行base64编码
mime:"audio/amr" //这个值是服务器端请求临时素材接口返回的Content-Type响应头,未转码必须是audio/amr;如果服务器进行了转码,是转码后的类型mime,并且提供duration
,data:"base64文本" //服务器端下载到或转码的文件二进制内容进行base64编码
,duration:0 //音频时长,这个是可选的,如果服务器端进行了转码,返回的mime不是amr类型,必须提供这个参数
,duration:0 //音频时长,这个是可选的,如果服务器端进行了转码,必须提供这个参数
}
fail: fn(msg) 下载出错回调
*/

ajax(MyWxApi,{
action:"wxdown"
,mediaID:param.mediaId
,type:param.type
,transform_mediaIds:param.transform_mediaIds
,transform_type:param.transform_type
,transform_bitRate:param.transform_bitRate
,transform_sampleRate:param.transform_sampleRate
},function(data){
success(data.v);
},function(msg){
Expand Down
2 changes: 1 addition & 1 deletion dist/app-support/app.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 544552e

Please sign in to comment.