UNPKG

recorder-core

Version:

Recorder库: html5 js 录音 mp3 wav ogg webm amr g711a g711u 格式,支持pc和Android、iOS部分浏览器、Hybrid App(提供Android iOS App源码)、微信,提供ASR语音识别转文字 H5版语音通话聊天示例 DTMF编码解码

6 lines 30.1 kB
/* 录音 https://github.com/xiangyuecn/Recorder src: recorder-core.js,engine/wav.js */ !function(e){"use strict";var t=!1,r="object"==typeof window&&window.document,n=r&&r.documentElement,a=Object["Recorder-Core-IsBrowser"];if(null!=a)t=!!a;else if(n&&n.style)try{var o=r.createElement("div").style;o.cssText="margin:6px !important",t="6px"==o.marginTop}catch(e){}var i=t?window:Object,s=Object["Recorder-Core-Alias"],f=s||"Recorder";!function(e,t,S){var x=function(){},u=function(e){return"number"==typeof e},A=function(e){return JSON.stringify(e)},ee=function(e){return new c(e)},I=ee.LM="2026-07-08 20:16",k="https://github.com/xiangyuecn/Recorder",L="Recorder",M="getUserMedia",U="srcSampleRate",G="sampleRate",i="bitRate",T="catch",r=e[t];if(r&&r.LM==I)return r.CLog(r.i18n.$T("K8zP::重复导入{1}",0,L+(L==t?"":"@"+t)),3);ee.IsBrowser=S,ee.LoadTime=Date.now(),ee.IsOpen=function(){var e=ee.Stream;if(e){var t=W(e),r=t[0];if(r){var n=r.readyState;return"live"==n||n==r.LIVE}}return!1},ee.BufferSize=4096,ee.Destroy=function(){for(var e in te(L+" Destroy"),P(),n)n[e]()};var n={};ee.BindDestroy=function(e,t){n[e]=t},ee.Support=function(){if(!S)return!1;var e=navigator.mediaDevices||{};return e[M]||(e=navigator)[M]||(e[M]=e.webkitGetUserMedia||e.mozGetUserMedia||e.msGetUserMedia),!!e[M]&&(ee.Scope=e,!!ee.GetContext())},ee.GetContext=function(e){if(!S)return null;var t=window.AudioContext;if(t||(t=window.webkitAudioContext),!t)return null;var r=ee.Ctx,n=0;return r||(r=ee.Ctx=new t,n=1,ee.NewCtxs=ee.NewCtxs||[],ee.BindDestroy("Ctx",function(){var e=ee.Ctx;e&&e.close&&(a(e),ee.Ctx=0);var t=ee.NewCtxs;ee.NewCtxs=[];for(var r=0;r<t.length;r++)a(t[r])})),e&&r.close&&(n||(r._useC||a(r),r=new t),r._useC=1,ee.NewCtxs.push(r)),r},ee.CloseNewCtx=function(e){if(e&&e.close){a(e);for(var t=ee.NewCtxs||[],r=t.length,n=0;n<t.length;n++)if(t[n]==e){t.splice(n,1);break}te(re("mSxV::剩{1}个GetContext未close",0,r+"-1="+t.length),t.length?3:0)}};var a=function(e){if(e&&e.close&&!e._isC&&(e._isC=1,"closed"!=e.state))try{e.close()}catch(e){te("ctx close err",1,e)}},R=ee.ResumeCtx=function(r,n,a,o){var i=0,s=0,f=0,c=0,u="EventListener",l="ResumeCtx ",v=function(e,t){s&&p(),i||(i=1,e&&o(e,c),t&&a(c)),t&&(!r._LsSC&&r["add"+u]&&r["add"+u]("statechange",h),r._LsSC=1,f=1)},p=function(e){if(!e||!s){s=e?1:0;for(var t=["focus","mousedown","mouseup","touchstart","touchend"],r=0;r<t.length;r++)window[(e?"add":"remove")+u](t[r],h,!0)}},h=function(){var e=r.state,t=g(e);if(!i&&!n(t?++c:c))return v();t?(f&&te(l+"sc "+e,3),p(1),r.resume().then(function(){f&&te(l+"sc "+r.state),v(0,1)})[T](function(e){te(l+"error",1,e),g(r.state)||v(e.message||"error")})):"closed"==e?(f&&!r._isC&&te(l+"sc "+e,1),v("ctx closed")):v(0,1)};h()},g=ee.CtxSpEnd=function(e){return"suspended"==e||"interrupted"==e},O=function(e){var t=e.state,r="ctx.state="+t;return g(t)&&(r+=re("nMIy::(注意:ctx不是running状态,rec.open和start至少要有一个在用户操作(触摸、点击等)时进行调用,否则将在rec.start时尝试进行ctx.resume,可能会产生兼容性问题(仅iOS),请参阅文档中runningContext配置)")),r},E="ConnectEnableWebM";ee[E]=!0;var D="ConnectEnableWorklet";ee[D]=!1;var z=function(e){var f=e.BufferSize||ee.BufferSize,c=e.Stream,i=c._c,u=i[G],l={},t=W(c),r=t[0],n=null,a="";if(r&&r.getSettings){var o=(n=r.getSettings())[G];o&&o!=u&&(a=re("eS8i::Stream的采样率{1}不等于{2},将进行采样率转换(注意:音质不会变好甚至可能变差),主要在移动端未禁用回声消除时会产生此现象,浏览器有回声消除时可能只会返回16k采样率的音频数据,",0,o,u))}c._ts=n,te(a+"Stream TrackSet: "+A(n),a?3:0);var v,s,p,h=function(e){var t=c._m=i.createMediaStreamSource(c),r=i.destination,n="createMediaStreamDestination";i[n]&&(r=c._d=i[n]()),t.connect(e),e.connect(r)},g="",d=c._call,m=function(e,t){for(var r in d){if(t!=u){l.index=0;var n=(l=ee.SampleData([e],t,u,l,{_sum:1})).data,a=l._sum}else{l={};for(var o=e.length,n=new Int16Array(o),a=0,i=0;i<o;i++){var s=e[i];s<-1?s=-1:1<s&&(s=1),s=s<0?32768*s:32767*s,n[i]=s,a+=s<0?-s:s}}for(var f in d)d[f](n,a);return}},C="ScriptProcessor",w="audioWorklet",y=L+" "+w,_="RecProc",b="MediaRecorder",S=b+".WebM.PCM",x=i.createScriptProcessor||i.createJavaScriptNode,I=re("ZGlf::。由于{1}内部1秒375次回调,在移动端可能会有性能问题导致回调丢失录音变短,PC端无影响,暂不建议开启{1}。",0,w),k=function(){s=c.isWorklet=!1,F(c),te(re("7TU0::Connect采用老的{1},",0,C)+H.get(re(ee[D]?"JwCL::但已设置{1}尝试启用{2}":"VGjB::可设置{1}尝试启用{2}",2),[L+"."+D+"=true",w])+g+I,3);var e=c._p=x.call(i,f,1,1);h(e),e.onaudioprocess=function(e){var t=e.inputBuffer.getChannelData(0);m(t,u)}},M=function(){v=c.isWebM=!1,N(c),s=c.isWorklet=!x||ee[D];var t=window.AudioWorkletNode;if(s&&i[w]&&t){var n=function(){return s&&c._na},a=c._na=function(){""!==p&&(clearTimeout(p),p=setTimeout(function(){p=0,n()&&(te(re("MxX1::{1}未返回任何音频,恢复使用{2}",0,w,C),3),x&&k())},500))},o=function(){if(n()){var e=c._n=new t(i,_,{processorOptions:{bufferSize:f}});h(e),e.port.onmessage=function(e){p&&(clearTimeout(p),p=""),n()?m(e.data.val,u):s||te(re("XUap::{1}多余回调",0,w),3)},te(re("yOta::Connect采用{1},设置{2}可恢复老式{3}",0,w,L+"."+D+"=false",C)+g+I,3)}},e=function(){if(n())if(i[_])o();else{var e,t,r=(t="class "+_+" extends AudioWorkletProcessor{",t+="constructor "+(e=function(e){return e.toString().replace(/^function|DEL_/g,"").replace(/\$RA/g,y)})(function(e){DEL_super(e);var t=this,r=e.processorOptions.bufferSize;t.bufferSize=r,t.buffer=new Float32Array(2*r),t.pos=0,t.port.onmessage=function(e){e.data.kill&&(t.kill=!0,$C.log("$RA kill call"))},$C.log("$RA .ctor call",e)}),t+="process "+e(function(e,t,r){var n=this,a=n.bufferSize,o=n.buffer,i=n.pos;if((e=(e[0]||[])[0]||[]).length){o.set(e,i);var s=~~((i+=e.length)/a)*a;if(s){this.port.postMessage({val:o.slice(0,s)});var f=o.subarray(s,i);(o=new Float32Array(2*a)).set(f),i=f.length,n.buffer=o}n.pos=i}return!n.kill}),t=(t+='}try{registerProcessor("'+_+'", '+_+')}catch(e){$C.error("'+y+' Reg Error",e)}').replace(/\$C\./g,"console."),"data:text/javascript;base64,"+btoa(unescape(encodeURIComponent(t))));i[w].addModule(r).then(function(e){n()&&(i[_]=1,o(),p&&a())})[T](function(e){te(w+".addModule Error",1,e),n()&&k()})}};R(i,function(){return n()},e,e)}else k()};!function(){var e=window[b],t="ondataavailable",r="audio/webm; codecs=pcm";v=c.isWebM=ee[E];var n=e&&t in e.prototype&&e.isTypeSupported(r);if(g=n?"":re("VwPd::(此浏览器不支持{1})",0,S),!v||!n)return M();var a=function(){return v&&c._ra};c._ra=function(){""!==p&&(clearTimeout(p),p=setTimeout(function(){a()&&(te(re("vHnb::{1}未返回任何音频,降级使用{2}",0,b,w),3),M())},500))};var o=Object.assign({mimeType:r},ee.ConnectWebMOptions),i=c._r=new e(c,o),s=c._rd={};i[t]=function(e){var t=new FileReader;t.onloadend=function(){if(a()){var e=B(new Uint8Array(t.result),s);if(!e)return;if(-1==e)return void M();p&&(clearTimeout(p),p=""),m(e,s.webmSR)}else v||te(re("O9P7::{1}多余回调",0,b),3)},t.readAsArrayBuffer(e.data)};try{i.start(~~(f/48)),te(re("LMEm::Connect采用{1},设置{2}可恢复使用{3}或老式{4}",0,S,L+"."+E+"=false",w,C))}catch(e){te("mr start err",1,e),M()}}()},o=function(e){e._na&&e._na(),e._ra&&e._ra()},F=function(e){e._na=null,e._n&&(e._n.port.postMessage({kill:!0}),e._n.disconnect(),e._n=null)},N=function(e){if(e._ra=null,e._r){try{e._r.stop()}catch(e){te("mr stop err",1,e)}e._r=null}},P=function(e){var t=(e=e||ee)==ee,r=e.Stream;r&&(r._m&&(r._m.disconnect(),r._m=null),!r._RC&&r._c&&ee.CloseNewCtx(r._c),r._RC=null,r._c=null,r._d&&(s(r._d.stream),r._d=null),r._p&&(r._p.disconnect(),r._p.onaudioprocess=r._p=null),F(r),N(r),t&&s(r)),e.Stream=0},s=ee.StopS_=function(e){for(var t=W(e),r=0;r<t.length;r++){var n=t[r];n.stop&&n.stop()}e.stop&&e.stop()},W=function(e){var t=0,r=0,n=[];e.getAudioTracks&&(t=e.getAudioTracks(),r=e.getVideoTracks()),t||(t=e.audioTracks,r=e.videoTracks);for(var a=0,o=t?t.length:0;a<o;a++)n.push(t[a]);for(var a=0,o=r?r.length:0;a<o;a++)n.push(r[a]);return n};ee.SampleData=function(e,t,r,n,a){var o="SampleData";n||(n={});var i=n.index||0,s=n.offset||0,f=n.raisePrev||0,c=n.downPrev,u=n.filter;u&&u.fn&&(u.sr&&u.sr!=t||u.srn&&u.srn!=r)&&(u=null,te(re("d48C::{1}的filter采样率变了,重设滤波",0,o),3)),u||(u=r<t?{fn:ee.IIRFilter(!0,t,r/2)}:t<r?{fn:ee.IIRFilter(!0,r,t/2)}:{fn:null}),u.sr=t,u.srn=r;var l=u.fn,v=n.frameNext||[];a||(a={});var p=a.frameSize||1;a.frameType&&(p="mp3"==a.frameType?1152:1);var h=a._sum,g=0,d=e.length;d+1<i&&te(re("tlbC::{1}似乎传入了未重置chunk {2}",0,o,i+">"+d),3);for(var m=0,C=i;C<d;C++)m+=e[C].length;var w=t/r;if(1<w){m=Math.max(0,m-s);var y=(m/=w)%1*w;m=Math.ceil(m),w%1&&0<y&&y<1&&m--,c&&m++}else if(w<1){var _=1/w;m+=s,m=Math.floor(m*_)}m+=v.length;for(var b=new Int16Array(m),S=0,x=0,I=0,C=0;C<v.length;C++)b[I]=v[C],I++;for(;i<d;i++){var k=e[i],M=k instanceof Float32Array,C=s,A=k.length,L=l&&l.Embed,T=0,R=0;if(1==w){for(var O=0;O<A;O++){var E=k[O];M&&(E<-1?E=-1:1<E&&(E=1),E=E<0?32768*E:32767*E),b[I]=E,I++}s=0}else if(w<1){for(var D=I+C,z=D,F=f,O=0;O<A;O++){var E=k[O];M&&(E<-1?E=-1:1<E&&(E=1),E=E<0?32768*E:32767*E);for(var U=~~D,G=~~(D=z+(O+1)*_),N=(E-F)/(G-U),P=1;U<G;U++,P++){var W=~~(F+P*N);L?(T=W,R=L.b0*T+L.b1*L.x1+L.b0*L.x2-L.a1*L.y1-L.a2*L.y2,L.x2=L.x1,L.x1=T,L.y2=L.y1,L.y1=R,W=R):W=l?l(W):W,32767<W?W=32767:W<-32768&&(W=-32768),h&&(g+=W<0?-W:W),b[U]=W,I++}F=f=E,C=s+(O+1)*_}s=C%1}else{for(var B=0,j=0,O=0,V=0;O<A;O++,V++){if(V<A){var E=k[V];M&&(E<-1?E=-1:1<E&&(E=1),E=E<0?32768*E:32767*E),L?(T=E,R=L.b0*T+L.b1*L.x1+L.b0*L.x2-L.a1*L.y1-L.a2*L.y2,L.x2=L.x1,L.x1=T,L.y2=L.y1,L.y1=R):R=l?l(E):E}var $=j;j=R;var J=!0;if(0==V){if(O--,!c)continue;B--,$=c.v,$+=(j-$)*c.at,c=null}else{var H=~~C;if(O!=H)continue;if(H!=C){var X=H+1,K=C-H;A<=X?(J=!1,c={v:$,at:K}):$+=(j-$)*K}}if(J){if(32767<$?$=32767:$<-32768&&($=-32768),h&&(g+=$<0?-$:$),I==m){S||(S=m),x++,m++;var Q=new Int16Array(b.length+1);Q.set(b),b=Q}b[I]=$,I++}C=s+ ++B*w}s=Math.max(0,C-A)}}I<m?(S||(S=m),x++,m=I,b=new Int16Array(b.buffer.slice(0,2*m))):m<I&&(x=-1),(S||I!=m)&&te(o+" idx:"+I+" != size:"+(S?S+" resize:"+m:m),3),v=null;var q=m%p;if(0<q){var Y=2*(m-q);v=new Int16Array(b.buffer.slice(Y)),b=new Int16Array(b.buffer.slice(0,Y))}var Z={index:i,offset:s,raisePrev:f,downPrev:c,resizeCount:-1==n.resizeCount||-1==x?-1:(n.resizeCount||0)+x,filter:u,frameNext:v,sampleRate:r,data:b};return h&&(Z._sum=g),Z},ee.IIRFilter=ee.IIRFilter_Default=function(e,t,r){e&&(r=Math.max(3*r/4,r-Math.abs(t/2-r)/2));var n=2*Math.PI*r/t,a=Math.sin(n),o=Math.cos(n),i=a/2,s=1+i,f=-2*o/s,c=(1-i)/s;if(e)var u=(1-o)/2/s,l=(1-o)/s;else var u=(1+o)/2/s,l=-(1+o)/s;var v=0,p=0,h=0,g=0,d=0,m=function(e){return h=u*e+l*v+u*p-f*g-c*d,p=v,v=e,d=g,g=h};return m.Embed={x1:0,x2:0,y1:0,y2:0,b0:u,b1:l,a1:f,a2:c},m},ee.PowerLevel=function(e,t){var r=e/t||0;return r<1251?Math.round(r/1250*10):Math.round(Math.min(100,Math.max(0,100*(1+Math.log(r/1e4)/Math.log(10)))))},ee.PowerDBFS=function(e,t){var r=Math.max(.1,e||0);return r=Math.min(r,32767),r=20*Math.log(r/32767)/Math.log(10),Math.max(-100,t?r:Math.round(r))},ee.CLog=function(e,t){if("object"==typeof console){var r=new Date,n=("0"+r.getMinutes()).substr(-2)+":"+("0"+r.getSeconds()).substr(-2)+"."+("00"+r.getMilliseconds()).substr(-3),a=this&&this.envIn&&this.envCheck&&this.id,o=["["+n+" "+L+(a?":"+a:"")+"]"+e],i=arguments,s=ee.CLog,f=2,c=s.log||console.log;for(u(t)?c=1==t?s.error||console.error:3==t?s.warn||console.warn:c:f=1;f<i.length;f++)o.push(i[f]);l?c&&c("[IsLoser]"+o[0],1<o.length?o:""):c.apply(console,o)}};var te=function(){ee.CLog.apply(this,arguments)},l=!0;try{l=!console.log.apply}catch(e){}var f=0;function c(e){var t=this;t.id=++f,v();var r={type:"mp3",onProcess:x};for(var n in e)r[n]=e[n];var a=(t.set=r)[i],o=r[G];(a&&!u(a)||o&&!u(o))&&t.CLog(re.G("IllegalArgs-1",[re("VtS4::{1}和{2}必须是数值",0,G,i)]),1,e),r[i]=+a||16,r[G]=+o||16e3,t.state=0,t._S=9,t.Sync={O:9,C:9}}ee.Sync={O:9,C:9},ee.prototype=c.prototype={CLog:te,_streamStore:function(){return this.set.sourceStream?this:ee},_streamGet:function(){return this._streamStore().Stream},_streamCtx:function(){var e=this._streamGet();return e&&e._c},open:function(e,r){var f=this,c=f.set,n=f._streamStore(),a=0;e=e||x;var o=function(e,t){t=!!t,f.CLog(re("5tWi::录音open失败:")+e+",isUserNotAllow:"+t,1),a&&ee.CloseNewCtx(a),r&&r(e,t)};f._streamTag=M;var i=function(){f.CLog("open ok, id:"+f.id+" stream:"+f._streamTag),e(),f._SO=0},s=n.Sync,u=++s.O,l=s.C;f._O=f._O_=u,f._SO=f._S;if(S){var t=f.envCheck({envName:"H5",canProcess:!0});if(t)o(re("A5bm::不能录音:")+t);else{var v,p=function(){(v=c.runningContext)||(v=a=ee.GetContext(!0))};if(c.sourceStream){if(f._streamTag="set.sourceStream",!ee.GetContext())return void o(re("1iU7::不支持此浏览器从流中获取录音"));p(),P(n);var h=f.Stream=c.sourceStream;h._c=v,h._RC=c.runningContext,h._call={};try{z(n)}catch(e){return P(n),void o(re("BTW2::从流中打开录音失败:")+e.message)}i()}else{var g=function(e,t){try{window.top.a}catch(e){return void o(re("Nclz::无权录音(跨域,请尝试给iframe添加麦克风访问策略,如{1})",0,'allow="camera;microphone"'))}d(1,e)&&(/Found/i.test(e)?o(t+re("jBa9::,无可用麦克风")):o(t))},d=function(e,t){if(/Permission|Allow/i.test(t))e&&o(re("gyO5::用户拒绝了录音权限"),!0);else{if(!1!==window.isSecureContext)return 1;e&&o(re("oWNo::浏览器禁止不安全页面录音,可开启https解决"))}};if(ee.IsOpen())i();else if(ee.Support()){p();var m,C,w=function(t){setTimeout(function(){t._call={};var e=ee.Stream;e&&(P(),t._call=e._call),(ee.Stream=t)._c=v,t._RC=c.runningContext,function(){if(l!=s.C||!f._O){var e=re("dFm8::open被取消");return u==s.O?f.close():e=re("VtJO::open被中断"),o(e),!0}}()||(ee.IsOpen()?(e&&f.CLog(re("upb8::发现同时多次调用open"),1),z(n),i()):o(re("Q1GA::录音功能无效:无音频流")))},100)},y=function(e){var t=e.name||e.message||e.code+":"+e,r="";1==_&&d(0,t)&&(r=re("KxE2::,将尝试禁用回声消除后重试"));var n=re("xEQR::请求录音权限错误"),a=re("bDOG::无法录音:");f.CLog(n+r+"|"+e,r||C?3:1,e),r?(m=t,C=e,b(1)):C?(f.CLog(n+"|"+C,1,C),g(m,a+C)):g(t,a+e)},_=0,b=function(e){_++;var t="audioTrackSet",r="autoGainControl",n="echoCancellation",a="noiseSuppression",o=JSON.parse(A(c[t]||!0));f.CLog("open... "+_+" "+t+":"+A(o)),e&&("object"!=typeof o&&(o={}),o[r]=!1,o[n]=!1,o[a]=!1),o[G]&&f.CLog(re("IjL3::注意:已配置{1}参数,可能会出现浏览器不能正确选用麦克风、移动端无法启用回声消除等现象",0,t+"."+G),3);var i={audio:o,video:c.videoTrackSet||!1};try{var s=ee.Scope[M](i,w,y)}catch(e){f.CLog(M,3,e),i={audio:!0,video:!1},s=ee.Scope[M](i,w,y)}f.CLog(M+"("+A(i)+") "+O(v)+" | "+re("RiWe::提示:未配置 {1} 时浏览器可能会自动启用回声消除(含降噪);未禁用回声消除时可能会导致:open打开录音会很耗时(禁用后打开变快),移动端降低系统播放音量(关闭录音后可恢复)、录音音量很小或忽大忽小、和可能只提供16k采样率的音频流(禁用后获得48k高音质流);请参阅文档中{2}配置",0,"audioTrackSet:{echoCancellation,noiseSuppression,autoGainControl}",t)+"("+k+") LM:"+I+" UA:"+navigator.userAgent),s&&s.then&&s.then(w)[T](y)};b()}else g("",re("COxc::此浏览器不支持录音"))}}}else o(re.G("NonBrowser-1",["open"])+re("EMJq::,可尝试使用RecordApp解决方案")+"("+k+"/tree/master/app-support-sample)")},close:function(e){e=e||x;var t=this,r=t._streamStore();t._stop();var n=" stream:"+t._streamTag,a=r.Sync;if(t._O=0,t._O_!=a.O)return t.CLog(re("hWVz::close被忽略(因为同时open了多个rec,只有最后一个会真正close)")+n,3),void e();a.C++,P(r),t.CLog("close,"+n),e()},mock:function(e,t){var r=this;return r._stop(),r.isMock=1,r.mockEnvInfo=null,r.buffers=[e],r.recSize=e.length,r._setSrcSR(t),r._streamTag="mock",r},_setSrcSR:function(e){var t=this.set,r=t[G],n="";e<r&&(t.allowUpsample?n="upsample!!":(n="!set.allowUpsample: "+r,t[G]=r=e)),this[U]=e,this.CLog(U+": "+e+" set."+G+": "+r+" "+n,n?3:0)},envCheck:function(e){var t,r=this.set,n="CPU_BE";if(t||ee[n]||"function"!=typeof Int8Array||new Int8Array(new Int32Array([1]).buffer)[0]||(v(n),t=re("Essp::不支持{1}架构",0,n)),!t){var a=r.type,o=this[a+"_envCheck"];r.takeoffEncodeChunk&&(o?e.canProcess||(t=re("7uMV::{1}环境不支持实时处理",0,e.envName)):t=re("2XBl::{1}类型不支持设置takeoffEncodeChunk",0,a)+(this[a]?"":re("LG7e::(未加载编码器)"))),!t&&o&&(t=this[a+"_envCheck"](e,r))}return t||""},envStart:function(e,t){var r=this,n=r.set;if(r.isMock=e?1:0,r.mockEnvInfo=e,r.buffers=[],r.recSize=0,e&&(r._streamTag="env$"+e.envName),r.state=1,r.envInLast=0,r.envInFirst=0,r.envInFix=0,r.envInFixTs=[],r._setSrcSR(t),r.engineCtx=0,r[n.type+"_start"]){var a=r.engineCtx=r[n.type+"_start"](n);a&&(a.pcmDatas=[],a.pcmSize=0)}},envResume:function(){this.envInFixTs=[]},envIn:function(e,t){var a=this,o=a.set,i=a.engineCtx;if(1==a.state){var r=a[U],n=e.length,s=ee.PowerLevel(t,n),f=a.buffers,c=f.length;f.push(e);var u=f,l=c,v=Date.now(),p=Math.round(n/r*1e3);a.envInLast=v,1==a.buffers.length&&(a.envInFirst=v-p);var h=a.envInFixTs;h.splice(0,0,{t:v,d:p});for(var g=v,d=0,m=0;m<h.length;m++){var C=h[m];if(3e3<v-C.t){h.length=m;break}g=C.t,d+=C.d}var w=h[1],y=v-g,_=y-d;if(y/3<_&&(w&&1e3<y||6<=h.length)){var b=v-w.t-p;if(p/5<b){var S=!o.disableEnvInFix;if(a.CLog("["+v+"]"+H.get(re(S?"4Kfd::补偿{1}ms":"bM5i::未补偿{1}ms",1),[b])+" | "+re("bM6i::提示:在onProcess中打印buffers等二进制数据、部分WebView在后台运行受限,均可能导致卡顿"),3),a.envInFix+=b,S){var x=new Int16Array(b*r/1e3);n+=x.length,f.push(x)}}}var I=a.recSize,k=n,M=I+k;if(a.recSize=M,i){var A=ee.SampleData(f,r,o[G],i.chunkInfo);i.chunkInfo=A,I=i.pcmSize,k=A.data.length,M=I+k,i.pcmSize=M,f=i.pcmDatas,c=f.length,f.push(A.data),r=A[G]}var L=Math.round(M/r*1e3),T=f.length,R=u.length,O=function(){for(var e=E?0:-k,t=null==f[0],r=c;r<T;r++){var n=f[r];null==n?t=1:(e+=n.length,i&&n.length&&a[o.type+"_encode"](i,n))}if(t&&i){var r=l;for(u[0]&&(r=0);r<R;r++)u[r]=null}t&&(e=E?k:0,f[0]=null),i?i.pcmSize+=e:a.recSize+=e},E=0,D="rec.set.onProcess";try{E=!0===(E=o.onProcess(f,s,L,r,c,O))}catch(e){console.error(D+re("gFUF::回调出错是不允许的,需保证不会抛异常"),e)}var z=Date.now()-v;if(10<z&&1e3<a.envInFirst-v&&a.CLog(D+re("2ghS::低性能,耗时{1}ms",0,z),3),E){for(var F=0,m=c;m<T;m++)null==f[m]?F=1:f[m]=new Int16Array(0);F?a.CLog(re("ufqH::未进入异步前不能清除buffers"),3):i?i.pcmSize-=k:a.recSize-=k}else O()}else a.state||a.CLog("envIn at state=0",3)},start:function(){var t=this,e=1;if(t.set.sourceStream?t.Stream||(e=0):ee.IsOpen()||(e=0),e){var r=t._streamCtx();if(t.CLog(re("kLDN::start 开始录音,")+O(r)+" stream:"+t._streamTag),t._stop(),t.envStart(null,r[G]),t.state=3,t._SO&&t._SO+1!=t._S)t.CLog(re("Bp2y::start被中断"),3);else{t._SO=0;var n=function(){3==t.state&&(t.state=1,t.resume())},a="AudioContext resume: ",o=t._streamGet();o._call[t.id]=function(){t.CLog(a+r.state+"|stream ok"),n()},R(r,function(e){return e&&t.CLog(a+"wait..."),3==t.state},function(e){e&&t.CLog(a+r.state),n()},function(e){t.CLog(a+r.state+re("upkE::,可能无法录音:")+e,1),n()})}}else t.CLog(re("6WmN::start失败:未open"),1)},pause:function(){var e=this,t=e._streamGet();e.state&&(e.state=2,e.CLog("pause"),t&&delete t._call[e.id])},resume:function(){var r=this,t=r._streamGet(),n="resume(wait ctx)";if(3==r.state)r.CLog(n);else if(r.state){r.state=1,r.CLog("resume"),r.envResume(),t&&(t._call[r.id]=function(e,t){1==r.state&&r.envIn(e,t)},o(t));var a=r._streamCtx();a&&R(a,function(e){return e&&r.CLog(n+"..."),1==r.state},function(e){e&&r.CLog(n+a.state),o(t)},function(e){r.CLog(n+a.state+"[err]"+e,1)})}},_stop:function(e){var t=this,r=t.set;t.isMock||t._S++,t.state&&(t.pause(),t.state=0),!e&&t[r.type+"_stop"]&&(t[r.type+"_stop"](t.engineCtx),t.engineCtx=0)},stop:function(l,t,e){var v,p=this,h=p.set,r=p.envInLast-p.envInFirst,n=r&&p.buffers.length;p.CLog(re("Xq4s::stop 和start时差:")+(r?r+"ms "+re("3CQP::补偿:")+p.envInFix+"ms envIn:"+n+" fps:"+(n/r*1e3).toFixed(1):"-")+" stream:"+p._streamTag+" ("+k+") LM:"+I);var g=function(){p._stop(),e&&p.close()},d=function(e){p.CLog(re("u8JG::结束录音失败:")+e,1),t&&t(e),g()},a=function(e,t,r){var n="arraybuffer",a="dataType",o="DefaultDataType",i=p[a]||ee[o]||"blob",s=a+"="+i,f=e instanceof ArrayBuffer,c=0,u=f?e.byteLength:e.size;if(i==n?f||(c=1):"blob"==i?"function"!=typeof Blob?c=re.G("NonBrowser-1",[s])+re("1skY::,请设置{1}",0,L+"."+o+'="'+n+'"'):(f&&(e=new Blob([e],{type:t})),e instanceof Blob||(c=1),t=e.type||t):c=re.G("NotSupport-1",[s]),p.CLog(re("Wv7l::结束录音 编码花{1}ms 音频时长{2}ms 文件大小{3}b",0,Date.now()-v,r,u)+" "+s+","+t),c)d(1!=c?c:re("Vkbd::{1}编码器返回的不是{2}",0,h.type,i)+", "+s);else{if(h.takeoffEncodeChunk)p.CLog(re("QWnr::启用takeoffEncodeChunk后stop返回的blob长度为0不提供音频数据"),3);else if(u<Math.max(50,r/5))return void d(re("Sz2H::生成的{1}无效",0,h.type));l&&l(e,r,t),g()}};if(!p.isMock){var o=3==p.state;if(!p.state||o)return void d(re("wf9t::未开始录音")+(o?re("Dl2c::,开始录音前无用户交互导致AudioContext未运行"):""))}p._stop(!0);var i=p.recSize;if(i)if(p[h.type]){if(p.isMock){var s=p.envCheck(p.mockEnvInfo||{envName:"mock",canProcess:!1});if(s)return void d(re("AxOH::录音错误:")+s)}var f=p.engineCtx;if(p[h.type+"_complete"]&&f){var c=Math.round(f.pcmSize/h[G]*1e3);return v=Date.now(),void p[h.type+"_complete"](f,function(e,t){a(e,t,c)},d)}if(v=Date.now(),p.buffers[0]){var u=ee.SampleData(p.buffers,p[U],h[G]);h[G]=u[G];var m=u.data,c=Math.round(m.length/h[G]*1e3);p.CLog(re("CxeT::采样:{1} 花:{2}ms",0,i+"->"+m.length,Date.now()-v)),setTimeout(function(){v=Date.now(),p[h.type](m,function(e,t){a(e,t,c)},function(e){d(e)})})}else d(re("xkKd::音频buffers被释放"))}else d(re("xGuI::未加载{1}编码器,请尝试到{2}的src/engine内找到{1}的编码器并加载",0,h.type,L));else d(re("Ltz3::未采集到录音"))}};var B=function(e,t){t.pos||(t.pos=[0],t.tracks={},t.bytes=[]);var r=t.tracks,n=[t.pos[0]],a=function(){t.pos[0]=n[0]},o=t.bytes.length,i=new Uint8Array(o+e.length);if(i.set(t.bytes),i.set(e,o),t.bytes=i,!t._ht){if($(i,n),J(i,n),!j($(i,n),[24,83,128,103]))return;for($(i,n);n[0]<i.length;){var s=$(i,n),f=J(i,n),c=[0],u=0;if(!f)return;if(j(s,[22,84,174,107])){for(;c[0]<f.length;){var l=$(f,c),v=J(f,c),p=[0],h={channels:0,sampleRate:0};if(j(l,[174]))for(;p[0]<v.length;){var g=$(v,p),d=J(v,p),m=[0];if(j(g,[215])){var C=V(d);h.number=C,r[C]=h}else if(j(g,[131])){var C=V(d);1==C?h.type="video":2==C?(h.type="audio",u||(t.track0=h),h.idx=u++):h.type="Type-"+C}else if(j(g,[134])){for(var w="",y=0;y<d.length;y++)w+=String.fromCharCode(d[y]);h.codec=w}else if(j(g,[225]))for(;m[0]<d.length;){var _=$(d,m),b=J(d,m);if(j(_,[181])){var C=0,S=new Uint8Array(b.reverse()).buffer;4==b.length?C=new Float32Array(S)[0]:8==b.length?C=new Float64Array(S)[0]:te("WebM Track !Float",1,b),h[G]=Math.round(C)}else j(_,[98,100])?h.bitDepth=V(b):j(_,[159])&&(h.channels=V(b))}}}t._ht=1,te("WebM Tracks",r),a();break}}}var x=t.track0;if(x){var I=x[G];if(t.webmSR=I,16==x.bitDepth&&/FLOAT/i.test(x.codec)&&(x.bitDepth=32,te("WebM 16->32 bit",3)),I<8e3||32!=x.bitDepth||x.channels<1||!/(\b|_)PCM\b/i.test(x.codec))return t.bytes=[],t.bad||te("WebM Track Unexpected",3,t),-(t.bad=1);for(var k=[],M=0;n[0]<i.length;){var l=$(i,n),v=J(i,n);if(!v)break;if(j(l,[163])){var A=15&v[0],h=r[A];if(!h)return te("WebM !Track"+A,1,r),-1;if(0===h.idx){for(var L=new Uint8Array(v.length-4),y=4;y<v.length;y++)L[y-4]=v[y];k.push(L),M+=L.length}}a()}if(M){var T=new Uint8Array(i.length-t.pos[0]);T.set(i.subarray(t.pos[0])),t.bytes=T,t.pos[0]=0;for(var L=new Uint8Array(M),y=0,R=0;y<k.length;y++)L.set(k[y],R),R+=k[y].length;var S=new Float32Array(L.buffer);if(1<x.channels){for(var O=[],y=0;y<S.length;)O.push(S[y]),y+=x.channels;S=new Float32Array(O)}return S}}},j=function(e,t){if(!e||e.length!=t.length)return!1;if(1==e.length)return e[0]==t[0];for(var r=0;r<e.length;r++)if(e[r]!=t[r])return!1;return!0},V=function(e){for(var t="",r=0;r<e.length;r++){var n=e[r];t+=(n<16?"0":"")+n.toString(16)}return parseInt(t,16)||0},$=function(e,t,r){var n=t[0];if(!(n>=e.length)){var a=e[n],o=("0000000"+a.toString(2)).substr(-8),i=/^(0*1)(\d*)$/.exec(o);if(i){var s=i[1].length,f=[];if(!(n+s>e.length)){for(var c=0;c<s;c++)f[c]=e[n],n++;return r&&(f[0]=parseInt(i[2]||"0",2)),t[0]=n,f}}}},J=function(e,t){var r=$(e,t,1);if(r){var n=V(r),a=t[0],o=[];if(n<2147483647){if(a+n>e.length)return;for(var i=0;i<n;i++)o[i]=e[a],a++}return t[0]=a,o}},H=ee.i18n={lang:"zh-CN",alias:{"zh-CN":"zh","en-US":"en"},locales:{},data:{},put:function(e,t){var r=L+".i18n.put: ",n=e.overwrite;n=null==n||n;var a=e.lang;if(!(a=H.alias[a]||a))throw new Error(r+"set.lang?");var o=H.locales[a];o||(o={},H.locales[a]=o);for(var i,s=/^([\w\-]+):/,f=0;f<t.length;f++){var c=t[f];if(i=s.exec(c)){var u=i[1],c=c.substr(u.length+1);!n&&o[u]||(o[u]=c)}else te(r+"'key:'? "+c,3,e)}},get:function(){return H.v_G.apply(null,arguments)},v_G:function(n,a,e){a=a||[],e=e||H.lang,e=H.alias[e]||e;var t=H.locales[e],o=t&&t[n]||"";return o||"zh"==e?(H.lastLang=e,"=Empty"==o?"":o.replace(/\{(\d+)(\!?)\}/g,function(e,t,r){return e=a[(t=+t||0)-1],(t<1||t>a.length)&&(e="{?}",te("i18n["+n+"] no {"+t+"}: "+o,3)),r?"":e})):"en"==e?H.v_G(n,a,"zh"):H.v_G(n,a,"en")},$T:function(){return H.v_T.apply(null,arguments)},v_T:function(){for(var e,t=arguments,r="",n=[],a=0,o=L+".i18n.$T:",i=/^([\w\-]*):/,s=0;s<t.length;s++){var f=t[s];if(0==s){if(e=i.exec(f),!(r=e&&e[1]))throw new Error(o+"0 'key:'?");f=f.substr(r.length+1)}if(-1===a)n.push(f);else{if(a)throw new Error(o+" bad args");if(0===f)a=-1;else if(u(f)){if(f<1)throw new Error(o+" bad args");a=f}else{var c=1==s?"en":s?"":"zh";if((e=i.exec(f))&&(c=e[1]||c,f=f.substr(e[1].length+1)),!e||!c)throw new Error(o+s+" 'lang:'?");H.put({lang:c,overwrite:!1},[r+":"+f])}}}return r?0<a?r:H.v_G(r,n):""}},re=H.$T;re.G=H.get,re("NonBrowser-1::非浏览器环境,不支持{1}",1),re("IllegalArgs-1::参数错误:{1}",1),re("NeedImport-2::调用{1}需要先导入{2}",2),re("NotSupport-1::不支持:{1}",1),ee.TrafficImgUrl="//ia.51.la/go1?id=20469973&pvFlag=1";var v=ee.Traffic=function(e){if(S){e=e?"/"+L+"/Report/"+e:"";var t=ee.TrafficImgUrl;if(t)try{var r=ee.Traffic,n=/^(https?:..[^\/#]*\/?)[^#]*/i.exec(location.href)||[],a=n[1]||"http://file/",o=(n[0]||a)+e;if(0==t.indexOf("//")&&(t=/^https:/i.test(o)?"https:"+t:"http:"+t),e&&(t=t+"&cu="+encodeURIComponent(a+e)),!r[o]){r[o]=1;var i=new Image,s="complete"==document.readyState?0:15e3-(Date.now()-ee.LoadTime);0<s?setTimeout(function(){i.src=t},s):i.src=t,te("Traffic Analysis Image: "+(e||L+".TrafficImgUrl="+ee.TrafficImgUrl))}}catch(e){}}};r&&(te(re("8HO5::覆盖导入{1}",0,L+(L==t?"":"@"+t)),1),r.Destroy&&r.Destroy(),ee.Export_Overwrite=r);e[t]=ee}(i,f,t);var c=i[f];Object[s||"Recorder-Core-Export"]=c,"function"==typeof define&&define.amd&&define(function(){return c}),"object"==typeof module&&module.exports&&(module.exports=c)}(),function(e){var t=Object[Object["Recorder-Core-Alias"]||"Recorder-Core-Export"];if(!t)throw new Error("Must import recorder-core first");!function(p,S,e){"use strict";p.prototype.enc_wav={stable:!0,fast:!0,getTestMsg:function(){return S("gPSE::支持位数8位、16位(填在比特率里面),采样率取值无限制;此编码器仅在pcm数据前加了一个44字节的wav头,编码出来的16位wav文件去掉开头的44字节即可得到pcm(注:其他wav编码器可能不是44字节)")}};p.prototype.wav=function(e,t,r){var n=this.set;!function(e){var t=e.bitRate,r=8==t?8:16;t!=r&&p.CLog(S("wyw9::WAV Info: 不支持{1}位,已更新成{2}位",0,t,r),3);e.bitRate=r}(n);var a=e.length,o=n.sampleRate,i=n.bitRate,s=a*(i/8),f=p.wav_header(1,1,o,i,s),c=f.length,u=new Uint8Array(c+s);if(u.set(f),8==i)for(var l=0;l<a;l++){var v=128+(e[l]>>8);u[c++]=v}else(u=new Int16Array(u.buffer)).set(e,c/2);t(u.buffer,"audio/wav")},p.wav_header=function(e,t,r,n,a){var o=1==e?0:2,i=new ArrayBuffer(44+o),s=new DataView(i),f=0,c=function(e){for(var t=0;t<e.length;t++,f++)s.setUint8(f,e.charCodeAt(t))},u=function(e){s.setUint16(f,e,!0),f+=2},l=function(e){s.setUint32(f,e,!0),f+=4};return c("RIFF"),l(36+o+a),c("WAVE"),c("fmt "),l(16+o),u(e),u(t),l(r),l(r*(t*n/8)),u(t*n/8),u(n),1!=e&&u(0),c("data"),l(a),new Uint8Array(i)},p.wav_decode=function(e,_,b){var t=function(e){var t,r,n,a,o,i=new Uint8Array(e),s=function(e,t){for(var r=0;r<t.length;r++)if(i[e+r]!=t.charCodeAt(r))return!1;return!0};if(s(0,"RIFF")&&s(8,"WAVEfmt ")){a=i[22];var f=1==i[20],c=3==i[20];if((f||c)&&(1==a||2==a)){r=i[24]+(i[25]<<8)+(i[26]<<16)+(i[27]<<24),n=i[34]+(i[35]<<8),o=0;for(var u=12,l=i.length-8;u<=l;){if(100==i[u]&&97==i[u+1]&&116==i[u+2]&&97==i[u+3]){o=u+8;break}u+=4,u+=4+i[u]+(i[u+1]<<8)+(i[u+2]<<16)+(i[u+3]<<24)}if(o){var v=i.length-o;if(f&&16==n)t=new Int16Array(i.buffer.slice(o));else if(f&&8==n){t=new Int16Array(v);for(var p=o,h=0,g=i.length;p<g;p++,h++){var d=i[p];t[h]=d-128<<8}}else if(f&&24==n){t=new Int16Array(v/3);for(var p=o,h=0,g=i.length;p<g;){var m=(i[p++]|i[p++]<<8|i[p++]<<16)<<8>>8;m/=16777216,t[h++]=m<0?32768*m:32767*m}}else if(c&&32==n){var C=new Float32Array(i.buffer.slice(o,o+(v-v%4)));t=new Int16Array(C.length);for(var p=0,g=C.length;p<g;p++){var w=Math.max(-1,Math.min(1,C[p]));w=w<0?32768*w:32767*w,t[p]=w}}}if(t&&2==a){for(var y=new Int16Array(t.length/2),u=0,g=y.length;u<g;u++)y[u]=(t[2*u]+t[2*u+1])/2;t=y}}}t?_&&_(t,r,{bitRate:n,numChannels:a,dataPos:o}):b&&b(S("jXp3::非单或双声道wav raw pcm格式wav,不支持解码"))};if(e instanceof ArrayBuffer)t(e);else{var r=new FileReader;r.onloadend=function(){t(r.result)},r.readAsArrayBuffer(e)}}}(t,t.i18n.$T,t.IsBrowser)}();