()
| 308 | |
| 309 | //===================连接方式一========================= |
| 310 | var connWebM=function(){ |
| 311 | //尝试开启MediaRecorder录制webm+pcm处理 |
| 312 | var MR=window[MediaRecorderTxt]; |
| 313 | var onData="ondataavailable"; |
| 314 | var webmType="audio/webm; codecs=pcm"; |
| 315 | isWebM=stream.isWebM=Recorder[ConnectEnableWebM]; |
| 316 | |
| 317 | var supportMR=MR && (onData in MR.prototype) && MR.isTypeSupported(webmType); |
| 318 | webMTips=supportMR?"":"(此浏览器不支持"+MRWebMPCM+")"; |
| 319 | if(!isUserMedia || !isWebM || !supportMR){ |
| 320 | connWorklet(); //非麦克风录音(MediaRecorder采样率不可控) 或 被禁用 或 不支持MediaRecorder 或 不支持webm+pcm |
| 321 | return; |
| 322 | } |
| 323 | |
| 324 | var mrNext=function(){//可以继续,没有调用断开 |
| 325 | return isWebM && stream._ra; |
| 326 | }; |
| 327 | var mrAlive=stream._ra=function(){ |
| 328 | //start时会调用,只要没有收到数据就断定MediaRecorder有问题,降级处理 |
| 329 | if(badInt!==""){//没有回调过数据 |
| 330 | clearTimeout(badInt); |
| 331 | badInt=setTimeout(function(){ |
| 332 | //badInt=0; 保留给nodeAlive继续判断 |
| 333 | if(mrNext()){ |
| 334 | CLog(MediaRecorderTxt+"未返回任何音频,降级使用"+audioWorklet,3); |
| 335 | connWorklet(); |
| 336 | }; |
| 337 | },500); |
| 338 | }; |
| 339 | }; |
| 340 | |
| 341 | var mrSet=Object.assign({mimeType:webmType}, Recorder.ConnectWebMOptions); |
| 342 | var mr=stream._r=new MR(stream, mrSet); |
| 343 | var webmData=stream._rd={sampleRate:ctx[sampleRateTxt]}; |
| 344 | mr[onData]=function(e){ |
| 345 | //提取webm中的pcm数据,提取失败就等着badInt超时降级处理 |
| 346 | var reader=new FileReader(); |
| 347 | reader.onloadend=function(){ |
| 348 | if(mrNext()){ |
| 349 | var f32arr=WebM_Extract(new Uint8Array(reader.result),webmData); |
| 350 | if(!f32arr)return; |
| 351 | if(f32arr==-1){//无法提取,立即降级 |
| 352 | connWorklet(); |
| 353 | return; |
| 354 | }; |
| 355 | |
| 356 | if(badInt){ |
| 357 | clearTimeout(badInt);badInt=""; |
| 358 | }; |
| 359 | onReceive(f32arr); |
| 360 | }else if(!isWebM){ |
| 361 | CLog(MediaRecorderTxt+"多余回调",3); |
| 362 | }; |
| 363 | }; |
| 364 | reader.readAsArrayBuffer(e.data); |
| 365 | }; |
| 366 | mr.start(~~(bufferSize/48));//按48k时的回调间隔 |
| 367 | CLog("Connect采用"+MRWebMPCM+",设置"+RecTxt+"."+ConnectEnableWebM+"=false可恢复使用"+audioWorklet+"或老式"+scriptProcessor); |
no test coverage detected
searching dependent graphs…