(streamStore,isUserMedia)
| 115 | |
| 116 | /*初始化H5音频采集连接。如果自行提供了sourceStream将只进行一次简单的连接处理。如果是普通麦克风录音,此时的Stream是全局的,Safari上断开后就无法再次进行连接使用,表现为静音,因此使用全部使用全局处理避免调用到disconnect;全局处理也有利于屏蔽底层细节,start时无需再调用底层接口,提升兼容、可靠性。*/ |
| 117 | var Connect=function(streamStore,isUserMedia){ |
| 118 | var bufferSize=streamStore.BufferSize||Recorder.BufferSize; |
| 119 | |
| 120 | var ctx=Recorder.Ctx,stream=streamStore.Stream; |
| 121 | var mediaConn=function(node){ |
| 122 | var media=stream._m=ctx.createMediaStreamSource(stream); |
| 123 | var ctxDest=ctx.destination,cmsdTxt="createMediaStreamDestination"; |
| 124 | if(ctx[cmsdTxt]){ |
| 125 | ctxDest=ctx[cmsdTxt](); |
| 126 | }; |
| 127 | media.connect(node); |
| 128 | node.connect(ctxDest); |
| 129 | } |
| 130 | var isWebM,isWorklet,badInt,webMTips=""; |
| 131 | var calls=stream._call; |
| 132 | |
| 133 | //浏览器回传的音频数据处理 |
| 134 | var onReceive=function(float32Arr){ |
| 135 | for(var k0 in calls){//has item |
| 136 | var size=float32Arr.length; |
| 137 | |
| 138 | var pcm=new Int16Array(size); |
| 139 | var sum=0; |
| 140 | for(var j=0;j<size;j++){//floatTo16BitPCM |
| 141 | var s=Math.max(-1,Math.min(1,float32Arr[j])); |
| 142 | s=s<0?s*0x8000:s*0x7FFF; |
| 143 | pcm[j]=s; |
| 144 | sum+=Math.abs(s); |
| 145 | }; |
| 146 | |
| 147 | for(var k in calls){ |
| 148 | calls[k](pcm,sum); |
| 149 | }; |
| 150 | |
| 151 | return; |
| 152 | }; |
| 153 | }; |
| 154 | |
| 155 | var scriptProcessor="ScriptProcessor";//一堆字符串名字,有利于压缩js |
| 156 | var audioWorklet="audioWorklet"; |
| 157 | var recAudioWorklet=RecTxt+" "+audioWorklet; |
| 158 | var RecProc="RecProc"; |
| 159 | var MediaRecorderTxt="MediaRecorder"; |
| 160 | var MRWebMPCM=MediaRecorderTxt+".WebM.PCM"; |
| 161 | |
| 162 | |
| 163 | //===================连接方式三========================= |
| 164 | //古董级别的 ScriptProcessor 处理,目前所有浏览器均兼容,虽然是过时的方法,但更稳健,移动端性能比AudioWorklet强 |
| 165 | var oldFn=ctx.createScriptProcessor||ctx.createJavaScriptNode; |
| 166 | var oldIsBest="。由于"+audioWorklet+"内部1秒375次回调,在移动端可能会有性能问题导致回调丢失录音变短,PC端无影响,暂不建议开启"+audioWorklet+"。"; |
| 167 | var oldScript=function(){ |
| 168 | isWorklet=stream.isWorklet=false; |
| 169 | _Disconn_n(stream); |
| 170 | CLog("Connect采用老的"+scriptProcessor+","+(Recorder[ConnectEnableWorklet]?"但已":"可")+"设置"+RecTxt+"."+ConnectEnableWorklet+"=true尝试启用"+audioWorklet+webMTips+oldIsBest,3); |
| 171 | |
| 172 | var process=stream._p=oldFn.call(ctx,bufferSize,1,1);//单声道,省的数据处理复杂 |
| 173 | mediaConn(process); |
| 174 |
no test coverage detected
searching dependent graphs…