051ccfe76da0fbcb5d54e029d054f7a4c380f207606641b1367005c39f0d059a.json 248 KB

1
  1. {"ast":null,"code":"/*\n录音\nhttps://github.com/xiangyuecn/Recorder\n*/\n(function (factory) {\n var browser = typeof window == \"object\" && !!window.document;\n var win = browser ? window : Object; //非浏览器环境,Recorder挂载在Object下面\n factory(win, browser);\n //umd returnExports.js\n if (typeof define == 'function' && define.amd) {\n define(function () {\n return win.Recorder;\n });\n }\n ;\n if (typeof module == 'object' && module.exports) {\n module.exports = win.Recorder;\n }\n ;\n})(function (Export, isBrowser) {\n \"use strict\";\n\n var NOOP = function () {};\n var IsNum = function (v) {\n return typeof v == \"number\";\n };\n var ToJson = function (v) {\n return JSON.stringify(v);\n };\n var Recorder = function (set) {\n return new initFn(set);\n };\n var LM = Recorder.LM = \"2024-10-20 22:15\";\n var GitUrl = \"https://github.com/xiangyuecn/Recorder\";\n var RecTxt = \"Recorder\";\n var getUserMediaTxt = \"getUserMedia\";\n var srcSampleRateTxt = \"srcSampleRate\";\n var sampleRateTxt = \"sampleRate\";\n var bitRateTxt = \"bitRate\";\n var CatchTxt = \"catch\";\n var WRec2 = Export[RecTxt]; //重复加载js\n if (WRec2 && WRec2.LM == LM) {\n WRec2.CLog(WRec2.i18n.$T(\"K8zP::重复导入{1}\", 0, RecTxt), 3);\n return;\n }\n ;\n\n //是否已经打开了全局的麦克风录音,所有工作都已经准备好了,就等接收音频数据了\n Recorder.IsOpen = function () {\n var stream = Recorder.Stream;\n if (stream) {\n var tracks = Tracks_(stream),\n track = tracks[0];\n if (track) {\n var state = track.readyState;\n return state == \"live\" || state == track.LIVE;\n }\n ;\n }\n ;\n return false;\n };\n /*H5录音时的AudioContext缓冲大小。会影响H5录音时的onProcess调用速率,相对于AudioContext.sampleRate=48000时,4096接近12帧/s,调节此参数可生成比较流畅的回调动画。\n \t取值256, 512, 1024, 2048, 4096, 8192, or 16384\n \t注意,取值不能过低,2048开始不同浏览器可能回调速率跟不上造成音质问题。\n \t一般无需调整,调整后需要先close掉已打开的录音,再open时才会生效。\n */\n Recorder.BufferSize = 4096;\n //销毁已持有的所有全局资源,当要彻底移除Recorder时需要显式的调用此方法\n Recorder.Destroy = function () {\n CLog(RecTxt + \" Destroy\");\n Disconnect(); //断开可能存在的全局Stream、资源\n\n for (var k in DestroyList) {\n DestroyList[k]();\n }\n ;\n };\n var DestroyList = {};\n //登记一个需要销毁全局资源的处理方法\n Recorder.BindDestroy = function (key, call) {\n DestroyList[key] = call;\n };\n //判断浏览器是否支持录音,随时可以调用。注意:仅仅是检测浏览器支持情况,不会判断和调起用户授权,不会判断是否支持特定格式录音。\n Recorder.Support = function () {\n if (!isBrowser) return false;\n var scope = navigator.mediaDevices || {};\n if (!scope[getUserMediaTxt]) {\n scope = navigator;\n scope[getUserMediaTxt] || (scope[getUserMediaTxt] = scope.webkitGetUserMedia || scope.mozGetUserMedia || scope.msGetUserMedia);\n }\n ;\n if (!scope[getUserMediaTxt]) {\n return false;\n }\n ;\n Recorder.Scope = scope;\n if (!Recorder.GetContext()) {\n return false;\n }\n ;\n return true;\n };\n //获取AudioContext对象,如果浏览器不支持将返回null。tryNew=false时返回全局的Recorder.Ctx,Ctx.state可能是closed,仅限用于解码等操作。tryNew=true时会尝试创建新的ctx(不支持close的老浏览器依旧返回全局的),注意用完必须自己调用CloseNewCtx(ctx)关闭;注意:非用户操作(触摸、点击等)时调用返回的ctx.state可能是suspended状态,需要在用户操作时调用ctx.resume恢复成running状态,参考rec的runningContext配置\n Recorder.GetContext = function (tryNew) {\n if (!isBrowser) return null;\n var AC = window.AudioContext;\n if (!AC) {\n AC = window.webkitAudioContext;\n }\n ;\n if (!AC) {\n return null;\n }\n ;\n var ctx = Recorder.Ctx,\n isNew = 0;\n if (!ctx) {\n //241020版本后不再保留打开状态的ctx,原因是iOS不全部关闭时新的ctx有可能不正常\n //不能反复构造,低版本number of hardware contexts reached maximum (6)\n ctx = Recorder.Ctx = new AC();\n isNew = 1;\n Recorder.NewCtxs = Recorder.NewCtxs || [];\n Recorder.BindDestroy(\"Ctx\", function () {\n var ctx = Recorder.Ctx;\n if (ctx && ctx.close) {\n //能关掉就关掉,关不掉就保留着\n CloseCtx(ctx);\n Recorder.Ctx = 0;\n }\n ;\n var arr = Recorder.NewCtxs;\n Recorder.NewCtxs = [];\n for (var i = 0; i < arr.length; i++) CloseCtx(arr[i]);\n });\n }\n ;\n if (tryNew && ctx.close) {\n //没法关闭的不允许再创建\n if (!isNew) {\n if (!ctx._useC) CloseCtx(ctx); //关闭全局的,不再保留打开状态\n ctx = new AC(); //如果是上面新建的就用上面的,不然就用全新的\n }\n ;\n ctx._useC = 1;\n Recorder.NewCtxs.push(ctx);\n }\n ;\n return ctx;\n };\n //关闭新创建的AudioContext(之前老版本如果是全局的不关闭,241020版本后全部关闭)\n Recorder.CloseNewCtx = function (ctx) {\n if (ctx && ctx.close) {\n CloseCtx(ctx);\n var arr = Recorder.NewCtxs || [],\n L = arr.length;\n for (var i = 0; i < arr.length; i++) {\n if (arr[i] == ctx) {\n arr.splice(i, 1);\n break;\n }\n }\n CLog($T(\"mSxV::剩{1}个GetContext未close\", 0, L + \"-1=\" + arr.length), arr.length ? 3 : 0);\n }\n };\n var CloseCtx = function (ctx) {\n if (ctx && ctx.close && !ctx._isC) {\n ctx._isC = 1;\n if (ctx.state != \"closed\") {\n try {\n ctx.close();\n } catch (e) {\n CLog(\"ctx close err\", 1, e);\n }\n }\n }\n };\n //当AudioContext的状态是suspended时,调用resume恢复状态,但如果没有用户操作resume可能没有回调,封装解决此回调问题;check(count)返回true继续尝试resume,返回false终止任务(不回调False)\n var ResumeCtx = Recorder.ResumeCtx = function (ctx, check, True, False) {\n var isEnd = 0,\n isBind = 0,\n isLsSC = 0,\n runC = 0,\n EL = \"EventListener\",\n Tag = \"ResumeCtx \";\n var end = function (err, ok) {\n if (isBind) {\n bind();\n }\n if (!isEnd) {\n isEnd = 1; //回调结果\n err && False(err, runC);\n ok && True(runC);\n }\n if (ok) {\n //监听后续状态变化\n if (!ctx._LsSC && ctx[\"add\" + EL]) ctx[\"add\" + EL](\"statechange\", run);\n ctx._LsSC = 1;\n isLsSC = 1;\n }\n };\n var bind = function (add) {\n if (add && isBind) return;\n isBind = add ? 1 : 0;\n var types = [\"focus\", \"mousedown\", \"mouseup\", \"touchstart\", \"touchend\"];\n for (var i = 0; i < types.length; i++) window[(add ? \"add\" : \"remove\") + EL](types[i], run, true);\n };\n var run = function () {\n var sVal = ctx.state,\n spEnd = CtxSpEnd(sVal);\n if (!isEnd && !check(spEnd ? ++runC : runC)) return end(); //终止,不回调\n if (spEnd) {\n if (isLsSC) CLog(Tag + \"sc \" + sVal, 3);\n bind(1); //绑定用户事件尝试恢复\n ctx.resume().then(function () {\n //resume回调不可靠\n if (isLsSC) CLog(Tag + \"sc \" + ctx.state);\n end(0, 1);\n })[CatchTxt](function (e) {\n //出错且无法恢复\n CLog(Tag + \"error\", 1, e);\n if (!CtxSpEnd(ctx.state)) {\n end(e.message || \"error\");\n }\n });\n } else if (sVal == \"closed\") {\n if (isLsSC && !ctx._isC) CLog(Tag + \"sc \" + sVal, 1); //无法恢复,打个日志\n end(\"ctx closed\");\n } else {\n end(0, 1);\n }\n ; //running 或老的无state\n };\n run();\n };\n var CtxSpEnd = Recorder.CtxSpEnd = function (v) {\n return v == \"suspended\" || v == \"interrupted\"; //后面这个仅iOS有\n };\n var CtxState = function (ctx) {\n var v = ctx.state,\n msg = \"ctx.state=\" + v;\n if (CtxSpEnd(v)) msg += $T(\"nMIy::(注意:ctx不是running状态,rec.open和start至少要有一个在用户操作(触摸、点击等)时进行调用,否则将在rec.start时尝试进行ctx.resume,可能会产生兼容性问题(仅iOS),请参阅文档中runningContext配置)\");\n return msg;\n };\n\n /*是否启用MediaRecorder.WebM.PCM来进行音频采集连接(如果浏览器支持的话),默认启用,禁用或者不支持时将使用AudioWorklet或ScriptProcessor来连接;MediaRecorder采集到的音频数据比其他方式更好,几乎不存在丢帧现象,所以音质明显会好很多,建议保持开启*/\n var ConnectEnableWebM = \"ConnectEnableWebM\";\n Recorder[ConnectEnableWebM] = true;\n\n /*是否启用AudioWorklet特性来进行音频采集连接(如果浏览器支持的话),默认禁用,禁用或不支持时将使用过时的ScriptProcessor来连接(如果方法还在的话),当前AudioWorklet的实现在移动端没有ScriptProcessor稳健;ConnectEnableWebM如果启用并且有效时,本参数将不起作用*/\n var ConnectEnableWorklet = \"ConnectEnableWorklet\";\n Recorder[ConnectEnableWorklet] = false;\n\n /*初始化H5音频采集连接。如果自行提供了sourceStream将只进行一次简单的连接处理。如果是普通麦克风录音,此时的Stream是全局的,Safari上断开后就无法再次进行连接使用,表现为静音,因此使用全部使用全局处理避免调用到disconnect;全局处理也有利于屏蔽底层细节,start时无需再调用底层接口,提升兼容、可靠性。*/\n var Connect = function (streamStore) {\n var bufferSize = streamStore.BufferSize || Recorder.BufferSize;\n var stream = streamStore.Stream;\n var ctx = stream._c,\n ctxSR = ctx[sampleRateTxt],\n srChunk = {};\n\n //获取音频流信息\n var tracks = Tracks_(stream),\n track = tracks[0],\n trackSet = null,\n tsMsg = \"\";\n if (track && track.getSettings) {\n trackSet = track.getSettings();\n var trackSR = trackSet[sampleRateTxt];\n if (trackSR && trackSR != ctxSR) {\n tsMsg = $T(\"eS8i::Stream的采样率{1}不等于{2},将进行采样率转换(注意:音质不会变好甚至可能变差),主要在移动端未禁用回声消除时会产生此现象,浏览器有回声消除时可能只会返回16k采样率的音频数据,\", 0, trackSR, ctxSR);\n }\n }\n stream._ts = trackSet;\n CLog(tsMsg + \"Stream TrackSet: \" + ToJson(trackSet), tsMsg ? 3 : 0);\n var mediaConn = function (node) {\n var media = stream._m = ctx.createMediaStreamSource(stream);\n var ctxDest = ctx.destination,\n cmsdTxt = \"createMediaStreamDestination\";\n if (ctx[cmsdTxt]) {\n ctxDest = stream._d = ctx[cmsdTxt]();\n }\n ;\n media.connect(node);\n node.connect(ctxDest);\n };\n var isWebM,\n isWorklet,\n badInt,\n webMTips = \"\";\n var calls = stream._call;\n\n //浏览器回传的音频数据处理\n var onReceive = function (float32Arr, arrSR) {\n for (var k0 in calls) {\n //has item\n if (arrSR != ctxSR) {\n //MediaRecorder录制的采样率可能和ctx的采样率不同(16k),转换采样率方便统一处理代码也更简单,但音质不会变好,甚至可能会变差一点\n srChunk.index = 0;\n srChunk = Recorder.SampleData([float32Arr], arrSR, ctxSR, srChunk, {\n _sum: 1\n });\n var pcm = srChunk.data;\n var sum = srChunk._sum;\n } else {\n //采样率相同,不需要转换采样率\n srChunk = {};\n var size = float32Arr.length;\n var pcm = new Int16Array(size);\n var sum = 0;\n for (var j = 0; j < size; j++) {\n //floatTo16BitPCM \n var s = Math.max(-1, Math.min(1, float32Arr[j]));\n s = s < 0 ? s * 0x8000 : s * 0x7FFF;\n pcm[j] = s;\n sum += Math.abs(s);\n }\n ;\n }\n ;\n for (var k in calls) {\n calls[k](pcm, sum);\n }\n ;\n return;\n }\n ;\n };\n var scriptProcessor = \"ScriptProcessor\"; //一堆字符串名字,有利于压缩js\n var audioWorklet = \"audioWorklet\";\n var recAudioWorklet = RecTxt + \" \" + audioWorklet;\n var RecProc = \"RecProc\";\n var MediaRecorderTxt = \"MediaRecorder\";\n var MRWebMPCM = MediaRecorderTxt + \".WebM.PCM\";\n\n //===================连接方式三=========================\n //古董级别的 ScriptProcessor 处理,目前所有浏览器均兼容,虽然是过时的方法,但更稳健,移动端性能比AudioWorklet强\n var oldFn = ctx.createScriptProcessor || ctx.createJavaScriptNode;\n var oldIsBest = $T(\"ZGlf::。由于{1}内部1秒375次回调,在移动端可能会有性能问题导致回调丢失录音变短,PC端无影响,暂不建议开启{1}。\", 0, audioWorklet);\n var oldScript = function () {\n isWorklet = stream.isWorklet = false;\n _Disconn_n(stream);\n CLog($T(\"7TU0::Connect采用老的{1},\", 0, scriptProcessor) + i18n.get(Recorder[ConnectEnableWorklet] ? $T(\"JwCL::但已设置{1}尝试启用{2}\", 2) : $T(\"VGjB::可设置{1}尝试启用{2}\", 2), [RecTxt + \".\" + ConnectEnableWorklet + \"=true\", audioWorklet]) + webMTips + oldIsBest, 3);\n var process = stream._p = oldFn.call(ctx, bufferSize, 1, 1); //单声道,省的数据处理复杂\n mediaConn(process);\n process.onaudioprocess = function (e) {\n var arr = e.inputBuffer.getChannelData(0);\n onReceive(arr, ctxSR);\n };\n };\n\n //===================连接方式二=========================\n var connWorklet = function () {\n //尝试开启AudioWorklet处理\n isWebM = stream.isWebM = false;\n _Disconn_r(stream);\n isWorklet = stream.isWorklet = !oldFn || Recorder[ConnectEnableWorklet];\n var AwNode = window.AudioWorkletNode;\n if (!(isWorklet && ctx[audioWorklet] && AwNode)) {\n oldScript(); //被禁用 或 不支持,直接使用老的\n return;\n }\n ;\n var clazzUrl = function () {\n var xf = function (f) {\n return f.toString().replace(/^function|DEL_/g, \"\").replace(/\\$RA/g, recAudioWorklet);\n };\n var clazz = 'class ' + RecProc + ' extends AudioWorkletProcessor{';\n clazz += \"constructor \" + xf(function (option) {\n DEL_super(option);\n var This = this,\n bufferSize = option.processorOptions.bufferSize;\n This.bufferSize = bufferSize;\n This.buffer = new Float32Array(bufferSize * 2); //乱给size搞乱缓冲区不管\n This.pos = 0;\n This.port.onmessage = function (e) {\n if (e.data.kill) {\n This.kill = true;\n $C.log(\"$RA kill call\");\n }\n };\n $C.log(\"$RA .ctor call\", option);\n });\n\n //https://developer.mozilla.org/en-US/docs/Web/API/AudioWorkletProcessor/process 每次回调128个采样数据,1秒375次回调,高频导致移动端性能问题,结果就是回调次数缺斤少两,进而导致丢失数据,PC端似乎没有性能问题\n clazz += \"process \" + xf(function (input, b, c) {\n //需要等到ctx激活后才会有回调\n var This = this,\n bufferSize = This.bufferSize;\n var buffer = This.buffer,\n pos = This.pos;\n input = (input[0] || [])[0] || [];\n if (input.length) {\n buffer.set(input, pos);\n pos += input.length;\n var len = ~~(pos / bufferSize) * bufferSize;\n if (len) {\n this.port.postMessage({\n val: buffer.slice(0, len)\n });\n var more = buffer.subarray(len, pos);\n buffer = new Float32Array(bufferSize * 2);\n buffer.set(more);\n pos = more.length;\n This.buffer = buffer;\n }\n This.pos = pos;\n }\n return !This.kill;\n });\n clazz += '}' + 'try{' + 'registerProcessor(\"' + RecProc + '\", ' + RecProc + ')' + '}catch(e){$C.error(\"' + recAudioWorklet + ' Reg Error\",e)}';\n clazz = clazz.replace(/\\$C\\./g, \"console.\"); //一些编译器会文本替换日志函数\n //URL.createObjectURL 本地有些浏览器会报 Not allowed to load local resource,直接用dataurl\n return \"data:text/javascript;base64,\" + btoa(unescape(encodeURIComponent(clazz)));\n };\n var awNext = function () {\n //可以继续,没有调用断开\n return isWorklet && stream._na;\n };\n var nodeAlive = stream._na = function () {\n //start时会调用,只要没有收到数据就断定AudioWorklet有问题,恢复用老的\n if (badInt !== \"\") {\n //没有回调过数据\n clearTimeout(badInt);\n badInt = setTimeout(function () {\n badInt = 0;\n if (awNext()) {\n CLog($T(\"MxX1::{1}未返回任何音频,恢复使用{2}\", 0, audioWorklet, scriptProcessor), 3);\n oldFn && oldScript(); //未来没有老的,可能是误判\n }\n ;\n }, 500);\n }\n ;\n };\n var createNode = function () {\n if (!awNext()) return;\n var node = stream._n = new AwNode(ctx, RecProc, {\n processorOptions: {\n bufferSize: bufferSize\n }\n });\n mediaConn(node);\n node.port.onmessage = function (e) {\n if (badInt) {\n clearTimeout(badInt);\n badInt = \"\";\n }\n ;\n if (awNext()) {\n onReceive(e.data.val, ctxSR);\n } else if (!isWorklet) {\n CLog($T(\"XUap::{1}多余回调\", 0, audioWorklet), 3);\n }\n ;\n };\n CLog($T(\"yOta::Connect采用{1},设置{2}可恢复老式{3}\", 0, audioWorklet, RecTxt + \".\" + ConnectEnableWorklet + \"=false\", scriptProcessor) + webMTips + oldIsBest, 3);\n };\n\n //如果start时的resume和下面的构造node同时进行,将会导致部分浏览器崩溃 (STATUS_ACCESS_VIOLATION),源码assets中 ztest_chrome_bug_AudioWorkletNode.html 可测试。所以,将所有代码套到resume里面(不管catch),避免出现这个问题\n var ctxOK = function () {\n if (!awNext()) return;\n if (ctx[RecProc]) {\n createNode();\n return;\n }\n ;\n var url = clazzUrl();\n ctx[audioWorklet].addModule(url).then(function (e) {\n if (!awNext()) return;\n ctx[RecProc] = 1;\n createNode();\n if (badInt) {\n //重新计时\n nodeAlive();\n }\n ;\n })[CatchTxt](function (e) {\n //fix 关键字,保证catch压缩时保持字符串形式\n CLog(audioWorklet + \".addModule Error\", 1, e);\n awNext() && oldScript();\n });\n };\n ResumeCtx(ctx, function () {\n return awNext();\n }, ctxOK, ctxOK);\n };\n\n //===================连接方式一=========================\n var connWebM = function () {\n //尝试开启MediaRecorder录制webm+pcm处理\n var MR = window[MediaRecorderTxt];\n var onData = \"ondataavailable\";\n var webmType = \"audio/webm; codecs=pcm\";\n isWebM = stream.isWebM = Recorder[ConnectEnableWebM];\n var supportMR = MR && onData in MR.prototype && MR.isTypeSupported(webmType);\n webMTips = supportMR ? \"\" : $T(\"VwPd::(此浏览器不支持{1})\", 0, MRWebMPCM);\n if (!isWebM || !supportMR) {\n connWorklet(); //被禁用 或 不支持MediaRecorder 或 不支持webm+pcm\n return;\n }\n var mrNext = function () {\n //可以继续,没有调用断开\n return isWebM && stream._ra;\n };\n stream._ra = function () {\n //start时会调用,只要没有收到数据就断定MediaRecorder有问题,降级处理\n if (badInt !== \"\") {\n //没有回调过数据\n clearTimeout(badInt);\n badInt = setTimeout(function () {\n //badInt=0; 保留给nodeAlive继续判断\n if (mrNext()) {\n CLog($T(\"vHnb::{1}未返回任何音频,降级使用{2}\", 0, MediaRecorderTxt, audioWorklet), 3);\n connWorklet();\n }\n ;\n }, 500);\n }\n ;\n };\n var mrSet = Object.assign({\n mimeType: webmType\n }, Recorder.ConnectWebMOptions);\n var mr = stream._r = new MR(stream, mrSet);\n var webmData = stream._rd = {};\n mr[onData] = function (e) {\n //提取webm中的pcm数据,提取失败就等着badInt超时降级处理\n var reader = new FileReader();\n reader.onloadend = function () {\n if (mrNext()) {\n var f32arr = WebM_Extract(new Uint8Array(reader.result), webmData);\n if (!f32arr) return;\n if (f32arr == -1) {\n //无法提取,立即降级\n connWorklet();\n return;\n }\n ;\n if (badInt) {\n clearTimeout(badInt);\n badInt = \"\";\n }\n ;\n onReceive(f32arr, webmData.webmSR);\n } else if (!isWebM) {\n CLog($T(\"O9P7::{1}多余回调\", 0, MediaRecorderTxt), 3);\n }\n ;\n };\n reader.readAsArrayBuffer(e.data);\n };\n mr.start(~~(bufferSize / 48)); //按48k时的回调间隔\n CLog($T(\"LMEm::Connect采用{1},设置{2}可恢复使用{3}或老式{4}\", 0, MRWebMPCM, RecTxt + \".\" + ConnectEnableWebM + \"=false\", audioWorklet, scriptProcessor));\n };\n connWebM();\n };\n var ConnAlive = function (stream) {\n if (stream._na) stream._na(); //检查AudioWorklet连接是否有效,无效就回滚到老的ScriptProcessor\n if (stream._ra) stream._ra(); //检查MediaRecorder连接是否有效,无效就降级处理\n };\n var _Disconn_n = function (stream) {\n stream._na = null;\n if (stream._n) {\n stream._n.port.postMessage({\n kill: true\n });\n stream._n.disconnect();\n stream._n = null;\n }\n ;\n };\n var _Disconn_r = function (stream) {\n stream._ra = null;\n if (stream._r) {\n try {\n stream._r.stop();\n } catch (e) {\n CLog(\"mr stop err\", 1, e);\n }\n stream._r = null;\n }\n ;\n };\n var Disconnect = function (streamStore) {\n streamStore = streamStore || Recorder;\n var isGlobal = streamStore == Recorder;\n var stream = streamStore.Stream;\n if (stream) {\n if (stream._m) {\n stream._m.disconnect();\n stream._m = null;\n }\n ;\n if (!stream._RC && stream._c) {\n //提供的runningContext不处理\n Recorder.CloseNewCtx(stream._c);\n }\n ;\n stream._RC = null;\n stream._c = null;\n if (stream._d) {\n StopS_(stream._d.stream);\n stream._d = null;\n }\n ;\n if (stream._p) {\n stream._p.disconnect();\n stream._p.onaudioprocess = stream._p = null;\n }\n ;\n _Disconn_n(stream);\n _Disconn_r(stream);\n if (isGlobal) {\n //全局的时候,要把流关掉(麦克风),直接提供的流不处理\n StopS_(stream);\n }\n ;\n }\n ;\n streamStore.Stream = 0;\n };\n //关闭一个音频流\n var StopS_ = Recorder.StopS_ = function (stream) {\n var tracks = Tracks_(stream);\n for (var i = 0; i < tracks.length; i++) {\n var track = tracks[i];\n track.stop && track.stop();\n }\n ;\n stream.stop && stream.stop();\n };\n //获取流中的所有轨道\n var Tracks_ = function (stream) {\n var arr1 = 0,\n arr2 = 0,\n arr = [];\n //stream.getTracks() 得到的sourceStream还得去排序 不然第一个可能是video\n if (stream.getAudioTracks) {\n arr1 = stream.getAudioTracks();\n arr2 = stream.getVideoTracks();\n }\n if (!arr1) {\n arr1 = stream.audioTracks;\n arr2 = stream.videoTracks;\n }\n for (var i = 0, L = arr1 ? arr1.length : 0; i < L; i++) arr.push(arr1[i]); //音频放前面,方便取[0]\n for (var i = 0, L = arr2 ? arr2.length : 0; i < L; i++) arr.push(arr2[i]);\n return arr;\n };\n\n /*对pcm数据的采样率进行转换\n pcmDatas: [[Int16,...]] pcm片段列表,二维数组里面是Int16Array,也可传Float32Array(会转成Int16Array)\n pcmSampleRate:48000 pcm数据的采样率\n newSampleRate:16000 需要转换成的采样率,241020版本后支持转成任意采样率,之前老版本newSampleRate>=pcmSampleRate时不会进行任何处理,小于时会进行重新采样\n prevChunkInfo:{} 可选,上次调用时的返回值,用于连续转换,本次调用将从上次结束位置开始进行处理。或可自行定义一个ChunkInfo从pcmDatas指定的位置开始进行转换\n option:{ 可选,配置项\n \t\tframeSize:123456 帧大小,每帧的PCM Int16的数量,采样率转换后的pcm长度为frameSize的整数倍,用于连续转换。目前仅在mp3格式时才有用,frameSize取值为1152,这样编码出来的mp3时长和pcm的时长完全一致,否则会因为mp3最后一帧录音不够填满时添加填充数据导致mp3的时长变长。\n \t\tframeType:\"\" 帧类型,一般为rec.set.type,提供此参数时无需提供frameSize,会自动使用最佳的值给frameSize赋值,目前仅支持mp3=1152(MPEG1 Layer3的每帧采采样数),其他类型=1。\n \t\t\t以上两个参数用于连续转换时使用,最多使用一个,不提供时不进行帧的特殊处理,提供时必须同时提供prevChunkInfo才有作用。最后一段数据处理时无需提供帧大小以便输出最后一丁点残留数据。\n \t}\n \n 返回ChunkInfo:{\n \t//可定义,从指定位置开始转换到结尾\n \tindex:0 pcmDatas已处理到的索引;比如每次都是单个pcm需要连续处理时,可每次调用前重置成0,pcmDatas仅需传入`[pcm]`固定一个元素\n \toffset:0.0 已处理到的index对应的pcm中的偏移的下一个位置(提升采样率时为结果的pcm)\n \traisePrev:null 提升采样率时的前一个pcm结果采样值\n \t\n \t//可定义,指定的一个滤波配置:默认使用Recorder.IIRFilter低通滤波(可有效抑制混叠产生的杂音,小采样率大于高采样率的75%时不默认滤波),如果提供了配置但fn为null时将不滤波;sr、srn为此滤波函数对应的初始化采样率,当采样率和参数的不一致时将重新设为默认函数\n \tfilter:null||{fn:fn(sample),sr:pcmSampleRate,srn:newSampleRate}\n \t\n \t//仅作为返回值\n \tframeNext:null||[Int16,...] 下一帧的部分数据,frameSize设置了的时候才可能会有\n \tsampleRate:16000 结果的采样率=newSampleRate,老版本<=newSampleRate\n \tdata:[Int16,...] 转换后的PCM结果;如果是连续转换,并且pcmDatas中并没有新数据时,data的长度可能为0\n }\n */\n Recorder.SampleData = function (pcmDatas, pcmSampleRate, newSampleRate, prevChunkInfo, option) {\n var Txt = \"SampleData\";\n prevChunkInfo || (prevChunkInfo = {});\n var index = prevChunkInfo.index || 0;\n var offset = prevChunkInfo.offset || 0;\n var raisePrev = prevChunkInfo.raisePrev || 0;\n var filter = prevChunkInfo.filter;\n if (filter && filter.fn && (filter.sr && filter.sr != pcmSampleRate || filter.srn && filter.srn != newSampleRate)) {\n filter = null;\n CLog($T(\"d48C::{1}的filter采样率变了,重设滤波\", 0, Txt), 3);\n }\n ;\n if (!filter) {\n //采样率差距比较大才开启低通滤波\n if (newSampleRate <= pcmSampleRate) {\n //降低采样率或不变,最高频率用新采样率频率的3/4\n var freq = newSampleRate > pcmSampleRate * 3 / 4 ? 0 : newSampleRate / 2 * 3 / 4;\n filter = {\n fn: freq ? Recorder.IIRFilter(true, pcmSampleRate, freq) : 0\n };\n } else {\n //提升采样率,最高频率用原始采样率频率的3/4\n var freq = pcmSampleRate > newSampleRate * 3 / 4 ? 0 : pcmSampleRate / 2 * 3 / 4;\n filter = {\n fn: freq ? Recorder.IIRFilter(true, newSampleRate, freq) : 0\n };\n }\n ;\n }\n ;\n filter.sr = pcmSampleRate;\n filter.srn = newSampleRate;\n var filterFn = filter.fn;\n var frameNext = prevChunkInfo.frameNext || [];\n option || (option = {});\n var frameSize = option.frameSize || 1;\n if (option.frameType) {\n frameSize = option.frameType == \"mp3\" ? 1152 : 1;\n }\n ;\n var useSum = option._sum,\n _sum = 0; //内部用的,sum不考虑配置了frame\n\n var nLen = pcmDatas.length;\n if (index > nLen + 1) {\n CLog($T(\"tlbC::{1}似乎传入了未重置chunk {2}\", 0, Txt, index + \">\" + nLen), 3);\n }\n ;\n var size = 0;\n for (var i = index; i < nLen; i++) {\n size += pcmDatas[i].length;\n }\n ;\n\n //采样 https://www.cnblogs.com/blqw/p/3782420.html\n var step = pcmSampleRate / newSampleRate;\n if (step > 1) {\n //新采样低于录音采样,进行抽样\n size = Math.max(0, size - Math.floor(offset));\n size = Math.floor(size / step);\n } else if (step < 1) {\n //新采样高于录音采样,插值处理\n var raiseStep = 1 / step;\n size = Math.floor(size * raiseStep);\n }\n ;\n size += frameNext.length;\n var res = new Int16Array(size);\n var idx = 0;\n //添加上一次不够一帧的剩余数据\n for (var i = 0; i < frameNext.length; i++) {\n res[idx] = frameNext[i];\n idx++;\n }\n ;\n //处理数据\n for (; index < nLen; index++) {\n var o = pcmDatas[index],\n isF32 = o instanceof Float32Array;\n var i = offset,\n il = o.length;\n var F = filterFn && filterFn.Embed,\n F1 = 0,\n F2 = 0,\n Fx = 0,\n Fy = 0; //低通滤波后的数据\n\n if (step < 1) {\n //提升采样率\n var idx1 = idx + i,\n prev = raisePrev;\n for (var i0 = 0; i0 < il; i0++) {\n var oVal = o[i0];\n if (isF32) {\n //floatTo16BitPCM \n oVal = Math.max(-1, Math.min(1, oVal));\n oVal = oVal < 0 ? oVal * 0x8000 : oVal * 0x7FFF;\n }\n var pos = Math.floor(idx1);\n idx1 += raiseStep;\n var end = Math.floor(idx1);\n\n //简单的从prev平滑填充到cur,有效减少转换引入的杂音\n var n = (oVal - prev) / (end - pos);\n for (var j = 1; pos < end; pos++, j++) {\n var s = Math.floor(prev + j * n);\n if (F) {\n //IIRFilter代码内置,比函数调用快4倍\n Fx = s;\n Fy = F.b0 * Fx + F.b1 * F.x1 + F.b0 * F.x2 - F.a1 * F.y1 - F.a2 * F.y2;\n F.x2 = F.x1;\n F.x1 = Fx;\n F.y2 = F.y1;\n F.y1 = Fy;\n s = Fy;\n } else {\n s = filterFn ? filterFn(s) : s;\n }\n if (s > 0x7FFF) s = 0x7FFF;else if (s < -0x8000) s = -0x8000; //Int16越界处理\n if (useSum) _sum += Math.abs(s);\n res[pos] = s;\n idx++;\n }\n ;\n prev = raisePrev = oVal;\n i += raiseStep; //插值\n }\n offset = i % 1;\n continue;\n }\n ;\n //降低采样率或不变\n for (var i0 = 0, i2 = 0; i0 < il; i0++, i2++) {\n if (i2 < il) {\n var oVal = o[i2];\n if (isF32) {\n //floatTo16BitPCM \n oVal = Math.max(-1, Math.min(1, oVal));\n oVal = oVal < 0 ? oVal * 0x8000 : oVal * 0x7FFF;\n }\n if (F) {\n //IIRFilter代码内置,比函数调用快4倍\n Fx = oVal;\n Fy = F.b0 * Fx + F.b1 * F.x1 + F.b0 * F.x2 - F.a1 * F.y1 - F.a2 * F.y2;\n F.x2 = F.x1;\n F.x1 = Fx;\n F.y2 = F.y1;\n F.y1 = Fy;\n } else {\n Fy = filterFn ? filterFn(oVal) : oVal;\n }\n }\n F1 = F2;\n F2 = Fy;\n if (i2 == 0) {\n i0--;\n continue;\n } //首次只计算o[0]\n\n //https://www.cnblogs.com/xiaoqi/p/6993912.html\n //当前点=当前点+到后面一个点之间的增量,音质比直接简单抽样好些\n var before = Math.floor(i);\n if (i0 != before) continue;\n var after = Math.ceil(i);\n var atPoint = i - before;\n var beforeVal = F1;\n var afterVal = after < il ? F2 : beforeVal; //后个点越界了,忽略不计\n var val = beforeVal + (afterVal - beforeVal) * atPoint;\n if (val > 0x7FFF) val = 0x7FFF;else if (val < -0x8000) val = -0x8000; //Int16越界处理\n if (useSum) _sum += Math.abs(val);\n res[idx] = val;\n idx++;\n i += step; //抽样\n }\n ;\n offset = Math.max(0, i - il); //不太可能出现负数\n }\n ;\n if (step < 1 && idx + 1 == size) {\n //提升采样率时可能缺1个,直接删除结尾1个\n size--;\n res = new Int16Array(res.buffer.slice(0, size * 2));\n }\n ;\n if (idx - 1 != size && idx != size) CLog(Txt + \" idx:\" + idx + \" != size:\" + size, 3); //越界1个\n\n //帧处理\n frameNext = null;\n var frameNextSize = size % frameSize;\n if (frameNextSize > 0) {\n var u8Pos = (size - frameNextSize) * 2;\n frameNext = new Int16Array(res.buffer.slice(u8Pos));\n res = new Int16Array(res.buffer.slice(0, u8Pos));\n }\n ;\n var obj = {\n index: index,\n offset: offset,\n raisePrev: raisePrev,\n filter: filter,\n frameNext: frameNext,\n sampleRate: newSampleRate,\n data: res\n };\n if (useSum) obj._sum = _sum;\n return obj;\n };\n\n /*IIR低通、高通滤波,移植自:https://gitee.com/52jian/digital-audio-filter AudioFilter.java\n \tuseLowPass: true或false,true为低通滤波,false为高通滤波\n \tsampleRate: 待处理pcm的采样率\n \tfreq: 截止频率Hz,最大频率为sampleRate/2,低通时会切掉高于此频率的声音,高通时会切掉低于此频率的声音,注意滤波并非100%的切掉不需要的声音,而是减弱频率对应的声音,离截止频率越远对应声音减弱越厉害,离截止频率越近声音就几乎无衰减\n \t返回的是一个函数,用此函数对pcm的每个采样值按顺序进行处理即可(不同pcm不可共用);注意此函数返回值可能会越界超过Int16范围,自行限制一下即可:Math.min(Math.max(val,-0x8000),0x7FFF)\n 可重新赋值一个函数,来改变Recorder的默认行为,比如SampleData中的低通滤波*/\n Recorder.IIRFilter = function (useLowPass, sampleRate, freq) {\n var ov = 2 * Math.PI * freq / sampleRate;\n var sn = Math.sin(ov);\n var cs = Math.cos(ov);\n var alpha = sn / 2;\n var a0 = 1 + alpha;\n var a1 = -2 * cs / a0;\n var a2 = (1 - alpha) / a0;\n if (useLowPass) {\n var b0 = (1 - cs) / 2 / a0;\n var b1 = (1 - cs) / a0;\n } else {\n var b0 = (1 + cs) / 2 / a0;\n var b1 = -(1 + cs) / a0;\n }\n var x1 = 0,\n x2 = 0,\n y = 0,\n y1 = 0,\n y2 = 0;\n var fn = function (x) {\n y = b0 * x + b1 * x1 + b0 * x2 - a1 * y1 - a2 * y2;\n x2 = x1;\n x1 = x;\n y2 = y1;\n y1 = y;\n return y;\n };\n fn.Embed = {\n x1: 0,\n x2: 0,\n y1: 0,\n y2: 0,\n b0: b0,\n b1: b1,\n a1: a1,\n a2: a2\n };\n return fn;\n };\n\n /*计算音量百分比的一个方法\n pcmAbsSum: pcm Int16所有采样的绝对值的和\n pcmLength: pcm长度\n 返回值:0-100,主要当做百分比用\n 注意:这个不是分贝,因此没用volume当做名称*/\n Recorder.PowerLevel = function (pcmAbsSum, pcmLength) {\n /*计算音量 https://blog.csdn.net/jody1989/article/details/73480259\n 更高灵敏度算法:\n \t限定最大感应值10000\n \t\t线性曲线:低音量不友好\n \t\t\tpower/10000*100 \n \t\t对数曲线:低音量友好,但需限定最低感应值\n \t\t\t(1+Math.log10(power/10000))*100\n */\n var power = pcmAbsSum / pcmLength || 0; //NaN\n var level;\n if (power < 1251) {\n //1250的结果10%,更小的音量采用线性取值\n level = Math.round(power / 1250 * 10);\n } else {\n level = Math.round(Math.min(100, Math.max(0, (1 + Math.log(power / 10000) / Math.log(10)) * 100)));\n }\n ;\n return level;\n };\n\n /*计算音量,单位dBFS(满刻度相对电平)\n maxSample: 为16位pcm采样的绝对值中最大的一个(计算峰值音量),或者为pcm中所有采样的绝对值的平局值\n 返回值:-100~0 (最大值0dB,最小值-100代替-∞)\n */\n Recorder.PowerDBFS = function (maxSample) {\n var val = Math.max(0.1, maxSample || 0),\n Pref = 0x7FFF;\n val = Math.min(val, Pref);\n //https://www.logiclocmusic.com/can-you-tell-the-decibel/\n //https://blog.csdn.net/qq_17256689/article/details/120442510\n val = 20 * Math.log(val / Pref) / Math.log(10);\n return Math.max(-100, Math.round(val));\n };\n\n //带时间的日志输出,可设为一个空函数来屏蔽日志输出\n //CLog(msg,errOrLogMsg, logMsg...) err为数字时代表日志类型1:error 2:log默认 3:warn,否则当做内容输出,第一个参数不能是对象因为要拼接时间,后面可以接无数个输出参数\n Recorder.CLog = function (msg, err) {\n if (typeof console != \"object\") return;\n var now = new Date();\n var t = (\"0\" + now.getMinutes()).substr(-2) + \":\" + (\"0\" + now.getSeconds()).substr(-2) + \".\" + (\"00\" + now.getMilliseconds()).substr(-3);\n var recID = this && this.envIn && this.envCheck && this.id;\n var arr = [\"[\" + t + \" \" + RecTxt + (recID ? \":\" + recID : \"\") + \"]\" + msg];\n var a = arguments,\n cwe = Recorder.CLog;\n var i = 2,\n fn = cwe.log || console.log;\n if (IsNum(err)) {\n fn = err == 1 ? cwe.error || console.error : err == 3 ? cwe.warn || console.warn : fn;\n } else {\n i = 1;\n }\n ;\n for (; i < a.length; i++) {\n arr.push(a[i]);\n }\n ;\n if (IsLoser) {\n //古董浏览器,仅保证基本的可执行不代码异常\n fn && fn(\"[IsLoser]\" + arr[0], arr.length > 1 ? arr : \"\");\n } else {\n fn.apply(console, arr);\n }\n ;\n };\n var CLog = function () {\n Recorder.CLog.apply(this, arguments);\n };\n var IsLoser = true;\n try {\n IsLoser = !console.log.apply;\n } catch (e) {}\n ;\n var ID = 0;\n function initFn(set) {\n var This = this;\n This.id = ++ID;\n\n //如果开启了流量统计,这里将发送一个图片请求\n Traffic();\n var o = {\n type: \"mp3\" //输出类型:mp3,wav,wav输出文件尺寸超大不推荐使用,但mp3编码支持会导致js文件超大,如果不需支持mp3可以使js文件大幅减小\n //,bitRate:16 //比特率 wav:16或8位,MP3:8kbps 1k/s,8kbps 2k/s 录音文件很小\n\n //,sampleRate:16000 //采样率,wav格式大小=sampleRate*时间;mp3此项对低比特率有影响,高比特率几乎无影响。\n //wav任意值,mp3取值范围:48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000\n //采样率参考https://www.cnblogs.com/devin87/p/mp3-recorder.html\n ,\n\n onProcess: NOOP //fn(buffers,powerLevel,bufferDuration,bufferSampleRate,newBufferIdx,asyncEnd) buffers=[[Int16,...],...]:缓冲的PCM数据,为从开始录音到现在的所有pcm片段;powerLevel:当前缓冲的音量级别0-100,bufferDuration:已缓冲时长,bufferSampleRate:缓冲使用的采样率(当type支持边录边转码(Worker)时,此采样率和设置的采样率相同,否则不一定相同);newBufferIdx:本次回调新增的buffer起始索引;asyncEnd:fn() 如果onProcess是异步的(返回值为true时),处理完成时需要调用此回调,如果不是异步的请忽略此参数,此方法回调时必须是真异步(不能真异步时需用setTimeout包裹)。onProcess返回值:如果返回true代表开启异步模式,在某些大量运算的场合异步是必须的,必须在异步处理完成时调用asyncEnd(不能真异步时需用setTimeout包裹),在onProcess执行后新增的buffer会全部替换成空数组,因此本回调开头应立即将newBufferIdx到本次回调结尾位置的buffer全部保存到另外一个数组内,处理完成后写回buffers中本次回调的结尾位置。\n\n //*******高级设置******\n //,sourceStream:MediaStream Object\n //可选直接提供一个媒体流,从这个流中录制、实时处理音频数据(当前Recorder实例独享此流);不提供时为普通的麦克风录音,由getUserMedia提供音频流(所有Recorder实例共享同一个流)\n //比如:audio、video标签dom节点的captureStream方法(实验特性,不同浏览器支持程度不高)返回的流;WebRTC中的remote流;自己创建的流等\n //注意:流内必须至少存在一条音轨(Audio Track),比如audio标签必须等待到可以开始播放后才会有音轨,否则open会失败\n\n //,runningContext:AudioContext\n //可选提供一个state为running状态的AudioContext对象(ctx);默认会在rec.open时自动创建一个新的ctx,无用户操作(触摸、点击等)时调用rec.open的ctx.state可能为suspended,会在rec.start时尝试进行ctx.resume,如果也无用户操作ctx.resume可能不会恢复成running状态(目前仅iOS上有此兼容性问题),导致无法去读取媒体流,这时请提前在用户操作时调用Recorder.GetContext(true)来得到一个running状态AudioContext(用完需调用CloseNewCtx(ctx)关闭)\n\n //,audioTrackSet:{ deviceId:\"\",groupId:\"\", autoGainControl:true, echoCancellation:true, noiseSuppression:true }\n //普通麦克风录音时getUserMedia方法的audio配置参数,比如指定设备id,回声消除、降噪开关;注意:提供的任何配置值都不一定会生效\n //由于麦克风是全局共享的,所以新配置后需要close掉以前的再重新open\n //同样可配置videoTrackSet,更多参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints\n\n //,disableEnvInFix:false 内部参数,禁用设备卡顿时音频输入丢失补偿功能\n\n //,takeoffEncodeChunk:NOOP //fn(chunkBytes) chunkBytes=[Uint8,...]:实时编码环境下接管编码器输出,当编码器实时编码出一块有效的二进制音频数据时实时回调此方法;参数为二进制的Uint8Array,就是编码出来的音频数据片段,所有的chunkBytes拼接在一起即为完整音频。本实现的想法最初由QQ2543775048提出\n //当提供此回调方法时,将接管编码器的数据输出,编码器内部将放弃存储生成的音频数据;如果当前编码器或环境不支持实时编码处理,将在open时直接走fail逻辑\n //因此提供此回调后调用stop方法将无法获得有效的音频数据,因为编码器内没有音频数据,因此stop时返回的blob将是一个字节长度为0的blob\n //大部分录音格式编码器都支持实时编码(边录边转码),比如mp3格式:会实时的将编码出来的mp3片段通过此方法回调,所有的chunkBytes拼接到一起即为完整的mp3,此种拼接的结果比mock方法实时生成的音质更加,因为天然避免了首尾的静默\n //不支持实时编码的录音格式不可以提供此回调(wav格式不支持,因为wav文件头中需要提供文件最终长度),提供了将在open时直接走fail逻辑\n };\n for (var k in set) {\n o[k] = set[k];\n }\n ;\n This.set = o;\n var vB = o[bitRateTxt],\n vS = o[sampleRateTxt]; //校验配置参数\n if (vB && !IsNum(vB) || vS && !IsNum(vS)) {\n This.CLog($T.G(\"IllegalArgs-1\", [$T(\"VtS4::{1}和{2}必须是数值\", 0, sampleRateTxt, bitRateTxt)]), 1, set);\n }\n ;\n o[bitRateTxt] = +vB || 16;\n o[sampleRateTxt] = +vS || 16000;\n This.state = 0; //运行状态,0未录音 1录音中 2暂停 3等待ctx激活\n This._S = 9; //stop同步锁,stop可以阻止open过程中还未运行的start\n This.Sync = {\n O: 9,\n C: 9\n }; //和Recorder.Sync一致,只不过这个是非全局的,仅用来简化代码逻辑,无实际作用\n }\n ;\n //同步锁,控制对Stream的竞争;用于close时中断异步的open;一个对象open如果变化了都要阻止close,Stream的控制权交个新的对象\n Recorder.Sync = {\n /*open*/O: 9,\n /*close*/C: 9\n };\n Recorder.prototype = initFn.prototype = {\n CLog: CLog\n\n //流相关的数据存储在哪个对象里面;如果提供了sourceStream,数据直接存储在当前对象中,否则存储在全局\n ,\n _streamStore: function () {\n if (this.set.sourceStream) {\n return this;\n } else {\n return Recorder;\n }\n }\n //当前实例用到的Stream,可能是全局的,也可能是独享的\n ,\n _streamGet: function () {\n return this._streamStore().Stream;\n }\n //当前实例用到的AudioContext,可能是全局的,也可能是独享的\n ,\n _streamCtx: function () {\n var m = this._streamGet();\n return m && m._c;\n }\n\n //打开录音资源True(),False(msg,isUserNotAllow),需要调用close。注意:此方法是异步的;一般使用时打开,用完立即关闭;可重复调用,可用来测试是否能录音;open和start至少有一个应当在用户操作(触摸、点击等)下进行调用,原因参考runningContext配置\n ,\n open: function (True, False) {\n var This = this,\n set = This.set,\n streamStore = This._streamStore(),\n newCtx = 0;\n True = True || NOOP;\n var failCall = function (errMsg, isUserNotAllow) {\n isUserNotAllow = !!isUserNotAllow;\n This.CLog($T(\"5tWi::录音open失败:\") + errMsg + \",isUserNotAllow:\" + isUserNotAllow, 1);\n if (newCtx) Recorder.CloseNewCtx(newCtx);\n False && False(errMsg, isUserNotAllow);\n };\n This._streamTag = getUserMediaTxt;\n var ok = function () {\n This.CLog(\"open ok, id:\" + This.id + \" stream:\" + This._streamTag);\n True();\n This._SO = 0; //解除stop对open中的start调用的阻止\n };\n\n //同步锁\n var Lock = streamStore.Sync;\n var lockOpen = ++Lock.O,\n lockClose = Lock.C;\n This._O = This._O_ = lockOpen; //记住当前的open,如果变化了要阻止close,这里假定了新对象已取代当前对象并且不再使用\n This._SO = This._S; //记住open过程中的stop,中途任何stop调用后都不能继续open中的start\n var lockFail = function () {\n //允许多次open,但不允许任何一次close,或者自身已经调用了关闭\n if (lockClose != Lock.C || !This._O) {\n var err = $T(\"dFm8::open被取消\");\n if (lockOpen == Lock.O) {\n //无新的open,已经调用了close进行取消,此处应让上次的close明确生效\n This.close();\n } else {\n err = $T(\"VtJO::open被中断\");\n }\n ;\n failCall(err);\n return true;\n }\n ;\n };\n\n //环境配置检查\n if (!isBrowser) {\n failCall($T.G(\"NonBrowser-1\", [\"open\"]) + $T(\"EMJq::,可尝试使用RecordApp解决方案\") + \"(\" + GitUrl + \"/tree/master/app-support-sample)\");\n return;\n }\n ;\n var checkMsg = This.envCheck({\n envName: \"H5\",\n canProcess: true\n });\n if (checkMsg) {\n failCall($T(\"A5bm::不能录音:\") + checkMsg);\n return;\n }\n ;\n\n //尽量先创建好ctx,不然异步下创建可能不是running状态\n var ctx;\n var getCtx = function () {\n ctx = set.runningContext;\n if (!ctx) ctx = newCtx = Recorder.GetContext(true); //2023-06 尽量创建新的ctx,免得Safari再次连接无回调\n };\n\n //***********已直接提供了音频流************\n if (set.sourceStream) {\n This._streamTag = \"set.sourceStream\";\n if (!Recorder.GetContext()) {\n failCall($T(\"1iU7::不支持此浏览器从流中获取录音\"));\n return;\n }\n ;\n getCtx();\n Disconnect(streamStore); //可能已open过,直接先尝试断开\n var stream = This.Stream = set.sourceStream;\n stream._c = ctx;\n stream._RC = set.runningContext;\n stream._call = {};\n try {\n Connect(streamStore);\n } catch (e) {\n Disconnect(streamStore);\n failCall($T(\"BTW2::从流中打开录音失败:\") + e.message);\n return;\n }\n ok();\n return;\n }\n ;\n\n //***********打开麦克风得到全局的音频流************\n var codeFail = function (code, msg) {\n try {\n //跨域的优先检测一下\n window.top.a;\n } catch (e) {\n failCall($T(\"Nclz::无权录音(跨域,请尝试给iframe添加麦克风访问策略,如{1})\", 0, 'allow=\"camera;microphone\"'));\n return;\n }\n ;\n if (codeErr1(1, code)) {\n if (/Found/i.test(code)) {\n //可能是非安全环境导致的没有设备\n failCall(msg + $T(\"jBa9::,无可用麦克风\"));\n } else {\n failCall(msg);\n }\n ;\n }\n ;\n };\n var codeErr1 = function (call, code) {\n //排除几个明确原因的错误\n if (/Permission|Allow/i.test(code)) {\n if (call) failCall($T(\"gyO5::用户拒绝了录音权限\"), true);\n } else if (window.isSecureContext === false) {\n if (call) failCall($T(\"oWNo::浏览器禁止不安全页面录音,可开启https解决\"));\n } else {\n return 1;\n }\n ;\n };\n\n //如果已打开并且有效就不要再打开了\n if (Recorder.IsOpen()) {\n ok();\n return;\n }\n ;\n if (!Recorder.Support()) {\n codeFail(\"\", $T(\"COxc::此浏览器不支持录音\"));\n return;\n }\n ;\n getCtx();\n\n //请求权限,如果从未授权,一般浏览器会弹出权限请求弹框\n var f1 = function (stream) {\n //请求成功回调\n //https://github.com/xiangyuecn/Recorder/issues/14 获取到的track.readyState!=\"live\",刚刚回调时可能是正常的,但过一下可能就被关掉了,原因不明。延迟一下保证真异步。对正常浏览器不影响\n setTimeout(function () {\n stream._call = {};\n var oldStream = Recorder.Stream;\n if (oldStream) {\n Disconnect(); //直接断开已存在的,旧的Connect未完成会自动终止\n stream._call = oldStream._call;\n }\n ;\n Recorder.Stream = stream;\n stream._c = ctx;\n stream._RC = set.runningContext;\n if (lockFail()) return;\n if (Recorder.IsOpen()) {\n if (oldStream) This.CLog($T(\"upb8::发现同时多次调用open\"), 1);\n Connect(streamStore);\n ok(); //只连接,因为AudioContext不一定在运行,无法知道是否有数据回调\n } else {\n failCall($T(\"Q1GA::录音功能无效:无音频流\"));\n }\n ;\n }, 100);\n };\n var f2 = function (e) {\n //请求失败回调\n var code = e.name || e.message || e.code + \":\" + e;\n var tryMsg = \"\";\n if (callUmCount == 1 && codeErr1(0, code)) {\n tryMsg = $T(\"KxE2::,将尝试禁用回声消除后重试\");\n }\n This.CLog($T(\"xEQR::请求录音权限错误\") + tryMsg + \"|\" + e, tryMsg ? 3 : 1, e);\n if (tryMsg) {\n //重试\n callUserMedia(1);\n } else {\n codeFail(code, $T(\"bDOG::无法录音:\") + e);\n }\n ;\n };\n var callUmCount = 0;\n var callUserMedia = function (retry) {\n callUmCount++;\n var atsTxt = \"audioTrackSet\";\n var t_AGC = \"autoGainControl\",\n t_AEC = \"echoCancellation\",\n t_ANS = \"noiseSuppression\";\n var atsTxtJs = atsTxt + \":{\" + t_AEC + \",\" + t_ANS + \",\" + t_AGC + \"}\";\n var trackSet = JSON.parse(ToJson(set[atsTxt] || true)); //true 跟 {} 兼容性?\n This.CLog(\"open... \" + callUmCount + \" \" + atsTxt + \":\" + ToJson(trackSet));\n if (retry) {\n //回声消除有些浏览器可能导致无法打开录音,尝试明确禁用来保证能最基础的录\n if (typeof trackSet != \"object\") trackSet = {}; //默认true\n trackSet[t_AGC] = false;\n trackSet[t_AEC] = false;\n trackSet[t_ANS] = false;\n }\n ;\n //这里指明采样率,虽然可以解决手机上MediaRecorder采样率16k的问题,是回声消除导致的只能获取到16k的流,禁用回声消除可恢复48k。(issues#230)而且会导致乱用音频输入设备,MediaStreamTrack的applyConstraints也无法修改采样率\n //trackSet[sampleRateTxt]=ctx[sampleRateTxt];\n if (trackSet[sampleRateTxt]) {\n This.CLog($T(\"IjL3::注意:已配置{1}参数,可能会出现浏览器不能正确选用麦克风、移动端无法启用回声消除等现象\", 0, atsTxt + \".\" + sampleRateTxt), 3);\n }\n ;\n var mSet = {\n audio: trackSet,\n video: set.videoTrackSet || false\n };\n try {\n var pro = Recorder.Scope[getUserMediaTxt](mSet, f1, f2);\n } catch (e) {\n //不能设置trackSet就算了\n This.CLog(getUserMediaTxt, 3, e);\n mSet = {\n audio: true,\n video: false\n };\n pro = Recorder.Scope[getUserMediaTxt](mSet, f1, f2);\n }\n ;\n This.CLog(getUserMediaTxt + \"(\" + ToJson(mSet) + \") \" + CtxState(ctx) + $T(\"RiWe::,未配置 {1} 时浏览器可能会自动启用回声消除,移动端未禁用回声消除时可能会降低系统播放音量(关闭录音后可恢复)和仅提供16k采样率的音频流(不需要回声消除时可明确配置成禁用来获得48k高音质的流),请参阅文档中{2}配置\", 0, atsTxtJs, atsTxt) + \"(\" + GitUrl + \") LM:\" + LM + \" UA:\" + navigator.userAgent);\n if (pro && pro.then) {\n pro.then(f1)[CatchTxt](f2); //fix 关键字,保证catch压缩时保持字符串形式\n }\n ;\n };\n callUserMedia();\n }\n //关闭释放录音资源\n ,\n close: function (call) {\n call = call || NOOP;\n var This = this,\n streamStore = This._streamStore();\n This._stop();\n var sTag = \" stream:\" + This._streamTag;\n var Lock = streamStore.Sync;\n This._O = 0;\n if (This._O_ != Lock.O) {\n //唯一资源Stream的控制权已交给新对象,这里不能关闭。此处在每次都弹权限的浏览器内可能存在泄漏,新对象被拒绝权限可能不会调用close,忽略这种不处理\n This.CLog($T(\"hWVz::close被忽略(因为同时open了多个rec,只有最后一个会真正close)\") + sTag, 3);\n call();\n return;\n }\n ;\n Lock.C++; //获得控制权\n\n Disconnect(streamStore);\n This.CLog(\"close,\" + sTag);\n call();\n }\n\n /*模拟一段录音数据,后面可以调用stop进行编码,需提供pcm数据[1,2,3...],pcm的采样率*/,\n mock: function (pcmData, pcmSampleRate) {\n var This = this;\n This._stop(); //清理掉已有的资源\n\n This.isMock = 1;\n This.mockEnvInfo = null;\n This.buffers = [pcmData];\n This.recSize = pcmData.length;\n This._setSrcSR(pcmSampleRate);\n This._streamTag = \"mock\";\n return This;\n },\n _setSrcSR: function (sampleRate) {\n var This = this,\n set = This.set;\n var setSr = set[sampleRateTxt];\n if (setSr > sampleRate) {\n set[sampleRateTxt] = sampleRate;\n } else {\n setSr = 0;\n }\n This[srcSampleRateTxt] = sampleRate;\n This.CLog(srcSampleRateTxt + \": \" + sampleRate + \" set.\" + sampleRateTxt + \": \" + set[sampleRateTxt] + (setSr ? \" \" + $T(\"UHvm::忽略\") + \": \" + setSr : \"\"), setSr ? 3 : 0);\n },\n envCheck: function (envInfo) {\n //平台环境下的可用性检查,任何时候都可以调用检查,返回errMsg:\"\"正常,\"失败原因\"\n //envInfo={envName:\"H5\",canProcess:true}\n var errMsg,\n This = this,\n set = This.set;\n\n //检测CPU的数字字节序,TypedArray字节序是个迷,直接拒绝罕见的大端模式,因为找不到这种CPU进行测试\n var tag = \"CPU_BE\";\n if (!errMsg && !Recorder[tag] && typeof Int8Array == \"function\" && !new Int8Array(new Int32Array([1]).buffer)[0]) {\n Traffic(tag); //如果开启了流量统计,这里将发送一个图片请求\n errMsg = $T(\"Essp::不支持{1}架构\", 0, tag);\n }\n ;\n\n //编码器检查环境下配置是否可用\n if (!errMsg) {\n var type = set.type,\n hasFn = This[type + \"_envCheck\"];\n if (set.takeoffEncodeChunk) {\n //需要实时编码返回数据,此时需要检查环境是否有实时特性、和是否可实时编码\n if (!hasFn) {\n errMsg = $T(\"2XBl::{1}类型不支持设置takeoffEncodeChunk\", 0, type) + (This[type] ? \"\" : $T(\"LG7e::(未加载编码器)\"));\n } else if (!envInfo.canProcess) {\n errMsg = $T(\"7uMV::{1}环境不支持实时处理\", 0, envInfo.envName);\n }\n ;\n }\n ;\n if (!errMsg && hasFn) {\n //编码器已实现环境检查\n errMsg = This[type + \"_envCheck\"](envInfo, set);\n }\n ;\n }\n ;\n return errMsg || \"\";\n },\n envStart: function (mockEnvInfo, sampleRate) {\n //平台环境相关的start调用\n var This = this,\n set = This.set;\n This.isMock = mockEnvInfo ? 1 : 0; //非H5环境需要启用mock,并提供envCheck需要的环境信息\n This.mockEnvInfo = mockEnvInfo;\n This.buffers = []; //数据缓冲\n This.recSize = 0; //数据大小\n if (mockEnvInfo) {\n This._streamTag = \"env$\" + mockEnvInfo.envName;\n }\n ;\n This.state = 1; //运行状态,0未录音 1录音中 2暂停 3等待ctx激活\n This.envInLast = 0; //envIn接收到最后录音内容的时间\n This.envInFirst = 0; //envIn接收到的首个录音内容的录制时间\n This.envInFix = 0; //补偿的总时间\n This.envInFixTs = []; //补偿计数列表\n\n //engineCtx需要提前确定最终的采样率\n This._setSrcSR(sampleRate);\n This.engineCtx = 0;\n //此类型有边录边转码(Worker)支持\n if (This[set.type + \"_start\"]) {\n var engineCtx = This.engineCtx = This[set.type + \"_start\"](set);\n if (engineCtx) {\n engineCtx.pcmDatas = [];\n engineCtx.pcmSize = 0;\n }\n ;\n }\n ;\n },\n envResume: function () {\n //和平台环境无关的恢复录音\n //重新开始计数\n this.envInFixTs = [];\n },\n envIn: function (pcm, sum) {\n //和平台环境无关的pcm[Int16]输入\n var This = this,\n set = This.set,\n engineCtx = This.engineCtx;\n if (This.state != 1) {\n if (!This.state) This.CLog(\"envIn at state=0\", 3);\n return;\n }\n ;\n var bufferSampleRate = This[srcSampleRateTxt];\n var size = pcm.length;\n var powerLevel = Recorder.PowerLevel(sum, size);\n var buffers = This.buffers;\n var bufferFirstIdx = buffers.length; //之前的buffer都是经过onProcess处理好的,不允许再修改\n buffers.push(pcm);\n\n //有engineCtx时会被覆盖,这里保存一份\n var buffersThis = buffers;\n var bufferFirstIdxThis = bufferFirstIdx;\n\n //卡顿丢失补偿:因为设备很卡的时候导致H5接收到的数据量不够造成播放时候变速,结果比实际的时长要短,此处保证了不会变短,但不能修复丢失的音频数据造成音质变差。当前算法采用输入时间侦测下一帧是否需要添加补偿帧,需要(6次输入||超过1秒)以上才会开始侦测,如果滑动窗口内丢失超过1/3就会进行补偿\n var now = Date.now();\n var pcmTime = Math.round(size / bufferSampleRate * 1000);\n This.envInLast = now;\n if (This.buffers.length == 1) {\n //记下首个录音数据的录制时间\n This.envInFirst = now - pcmTime;\n }\n ;\n var envInFixTs = This.envInFixTs;\n envInFixTs.splice(0, 0, {\n t: now,\n d: pcmTime\n });\n //保留3秒的计数滑动窗口,另外超过3秒的停顿不补偿\n var tsInStart = now,\n tsPcm = 0;\n for (var i = 0; i < envInFixTs.length; i++) {\n var o = envInFixTs[i];\n if (now - o.t > 3000) {\n envInFixTs.length = i;\n break;\n }\n ;\n tsInStart = o.t;\n tsPcm += o.d;\n }\n ;\n //达到需要的数据量,开始侦测是否需要补偿\n var tsInPrev = envInFixTs[1];\n var tsIn = now - tsInStart;\n var lost = tsIn - tsPcm;\n if (lost > tsIn / 3 && (tsInPrev && tsIn > 1000 || envInFixTs.length >= 6)) {\n //丢失过多,开始执行补偿\n var addTime = now - tsInPrev.t - pcmTime; //距离上次输入丢失这么多ms\n if (addTime > pcmTime / 5) {\n //丢失超过本帧的1/5\n var fixOpen = !set.disableEnvInFix;\n This.CLog(\"[\" + now + \"]\" + i18n.get(fixOpen ? $T(\"4Kfd::补偿{1}ms\", 1) : $T(\"bM5i::未补偿{1}ms\", 1), [addTime]), 3);\n This.envInFix += addTime;\n\n //用静默进行补偿\n if (fixOpen) {\n var addPcm = new Int16Array(addTime * bufferSampleRate / 1000);\n size += addPcm.length;\n buffers.push(addPcm);\n }\n ;\n }\n ;\n }\n ;\n var sizeOld = This.recSize,\n addSize = size;\n var bufferSize = sizeOld + addSize;\n This.recSize = bufferSize; //此值在onProcess后需要修正,可能新数据被修改\n\n //此类型有边录边转码(Worker)支持,开启实时转码\n if (engineCtx) {\n //转换成set的采样率\n var chunkInfo = Recorder.SampleData(buffers, bufferSampleRate, set[sampleRateTxt], engineCtx.chunkInfo);\n engineCtx.chunkInfo = chunkInfo;\n sizeOld = engineCtx.pcmSize;\n addSize = chunkInfo.data.length;\n bufferSize = sizeOld + addSize;\n engineCtx.pcmSize = bufferSize; //此值在onProcess后需要修正,可能新数据被修改\n\n buffers = engineCtx.pcmDatas;\n bufferFirstIdx = buffers.length;\n buffers.push(chunkInfo.data);\n bufferSampleRate = chunkInfo[sampleRateTxt];\n }\n ;\n var duration = Math.round(bufferSize / bufferSampleRate * 1000);\n var bufferNextIdx = buffers.length;\n var bufferNextIdxThis = buffersThis.length;\n\n //允许异步处理buffer数据\n var asyncEnd = function () {\n //重新计算size,异步的早已减去添加的,同步的需去掉本次添加的然后重新计算\n var num = asyncBegin ? 0 : -addSize;\n var hasClear = buffers[0] == null;\n for (var i = bufferFirstIdx; i < bufferNextIdx; i++) {\n var buffer = buffers[i];\n if (buffer == null) {\n //已被主动释放内存,比如长时间实时传输录音时\n hasClear = 1;\n } else {\n num += buffer.length;\n\n //推入后台边录边转码\n if (engineCtx && buffer.length) {\n This[set.type + \"_encode\"](engineCtx, buffer);\n }\n ;\n }\n ;\n }\n ;\n\n //同步清理This.buffers,不管buffers到底清了多少个,buffersThis是使用不到的进行全清\n if (hasClear && engineCtx) {\n var i = bufferFirstIdxThis;\n if (buffersThis[0]) {\n i = 0;\n }\n ;\n for (; i < bufferNextIdxThis; i++) {\n buffersThis[i] = null;\n }\n ;\n }\n ;\n\n //统计修改后的size,如果异步发生clear要原样加回来,同步的无需操作\n if (hasClear) {\n num = asyncBegin ? addSize : 0;\n buffers[0] = null; //彻底被清理\n }\n ;\n if (engineCtx) {\n engineCtx.pcmSize += num;\n } else {\n This.recSize += num;\n }\n ;\n };\n //实时回调处理数据,允许修改或替换上次回调以来新增的数据 ,但是不允许修改已处理过的,不允许增删第一维数组 ,允许将第二维数组任意修改替换成空数组也可以\n var asyncBegin = 0,\n procTxt = \"rec.set.onProcess\";\n try {\n asyncBegin = set.onProcess(buffers, powerLevel, duration, bufferSampleRate, bufferFirstIdx, asyncEnd);\n } catch (e) {\n //此错误显示不要用CLog,这样控制台内相同内容不会重复打印\n console.error(procTxt + $T(\"gFUF::回调出错是不允许的,需保证不会抛异常\"), e);\n }\n ;\n var slowT = Date.now() - now;\n if (slowT > 10 && This.envInFirst - now > 1000) {\n //1秒后开始onProcess性能监测\n This.CLog(procTxt + $T(\"2ghS::低性能,耗时{1}ms\", 0, slowT), 3);\n }\n ;\n if (asyncBegin === true) {\n //开启了异步模式,onProcess已接管buffers新数据,立即清空,避免出现未处理的数据\n var hasClear = 0;\n for (var i = bufferFirstIdx; i < bufferNextIdx; i++) {\n if (buffers[i] == null) {\n //已被主动释放内存,比如长时间实时传输录音时 ,但又要开启异步模式,此种情况是非法的\n hasClear = 1;\n } else {\n buffers[i] = new Int16Array(0);\n }\n ;\n }\n ;\n if (hasClear) {\n This.CLog($T(\"ufqH::未进入异步前不能清除buffers\"), 3);\n } else {\n //还原size,异步结束后再统计仅修改后的size,如果发生clear要原样加回来\n if (engineCtx) {\n engineCtx.pcmSize -= addSize;\n } else {\n This.recSize -= addSize;\n }\n ;\n }\n ;\n } else {\n asyncEnd();\n }\n ;\n }\n\n //开始录音,需先调用open;只要open成功时,调用此方法是安全的,如果未open强行调用导致的内部错误将不会有任何提示,stop时自然能得到错误;注意:open和start至少有一个应当在用户操作(触摸、点击等)下进行调用,原因参考runningContext配置\n ,\n start: function () {\n var This = this;\n var isOpen = 1;\n if (This.set.sourceStream) {\n //直接提供了流,仅判断是否调用了open\n if (!This.Stream) {\n isOpen = 0;\n }\n } else if (!Recorder.IsOpen()) {\n //监测全局麦克风是否打开并且有效\n isOpen = 0;\n }\n ;\n if (!isOpen) {\n This.CLog($T(\"6WmN::start失败:未open\"), 1);\n return;\n }\n ;\n var ctx = This._streamCtx();\n This.CLog($T(\"kLDN::start 开始录音,\") + CtxState(ctx) + \" stream:\" + This._streamTag);\n This._stop();\n This.envStart(null, ctx[sampleRateTxt]);\n This.state = 3; //0未录音 1录音中 2暂停 3等待ctx激活\n\n //检查open过程中stop是否已经调用过\n if (This._SO && This._SO + 1 != This._S) {\n //上面调用过一次 _stop\n //open未完成就调用了stop,此种情况终止start。也应尽量避免出现此情况\n This.CLog($T(\"Bp2y::start被中断\"), 3);\n return;\n }\n ;\n This._SO = 0;\n var end = function () {\n if (This.state == 3) {\n This.state = 1;\n This.resume();\n }\n };\n var tag = \"AudioContext resume: \";\n\n //如果有数据回调,就不等待ctx resume\n var stream = This._streamGet();\n stream._call[This.id] = function () {\n This.CLog(tag + ctx.state + '|stream ok');\n end();\n };\n ResumeCtx(ctx, function (runC) {\n runC && This.CLog(tag + \"wait...\");\n return This.state == 3;\n }, function (runC) {\n runC && This.CLog(tag + ctx.state);\n end();\n }, function (err) {\n //比较少见,可能对录音没有影响\n This.CLog(tag + ctx.state + $T(\"upkE::,可能无法录音:\") + err, 1);\n end();\n });\n }\n\n /*暂停录音*/,\n pause: function () {\n var This = this,\n stream = This._streamGet();\n if (This.state) {\n This.state = 2;\n This.CLog(\"pause\");\n if (stream) delete stream._call[This.id];\n }\n ;\n }\n /*恢复录音*/,\n resume: function () {\n var This = this,\n stream = This._streamGet();\n var tag = \"resume\",\n tag3 = tag + \"(wait ctx)\";\n if (This.state == 3) {\n //start还在等ctx恢复\n This.CLog(tag3);\n } else if (This.state) {\n This.state = 1;\n This.CLog(tag);\n This.envResume();\n if (stream) {\n stream._call[This.id] = function (pcm, sum) {\n if (This.state == 1) {\n This.envIn(pcm, sum);\n }\n ;\n };\n ConnAlive(stream); //AudioWorklet只会在ctx激活后运行\n }\n ;\n var ctx = This._streamCtx();\n if (ctx) {\n //AudioContext如果被暂停,尽量恢复\n ResumeCtx(ctx, function (runC) {\n runC && This.CLog(tag3 + \"...\");\n return This.state == 1;\n }, function (runC) {\n runC && This.CLog(tag3 + ctx.state);\n ConnAlive(stream);\n }, function (err) {\n This.CLog(tag3 + ctx.state + \"[err]\" + err, 1);\n });\n }\n ;\n }\n ;\n },\n _stop: function (keepEngine) {\n var This = this,\n set = This.set;\n if (!This.isMock) {\n This._S++;\n }\n ;\n if (This.state) {\n This.pause();\n This.state = 0;\n }\n ;\n if (!keepEngine && This[set.type + \"_stop\"]) {\n This[set.type + \"_stop\"](This.engineCtx);\n This.engineCtx = 0;\n }\n ;\n }\n /*\n 结束录音并返回录音数据blob对象\n \tTrue(blob,duration,mime)\n \t\tblob:录音数据audio/mp3|wav格式;默认是Blob对象,可设置rec.dataType=\"arraybuffer\"改成ArrayBuffer\n \t\tduration:录音时长,单位毫秒\n \t\tmime:\"auido/mp3\" blob数据的类型,方便ArrayBuffer时区分类型\n \tFalse(msg)\n \tautoClose:false 可选,是否自动调用close,默认为false\n */,\n stop: function (True, False, autoClose) {\n var This = this,\n set = This.set,\n t1;\n var envInMS = This.envInLast - This.envInFirst,\n envInLen = envInMS && This.buffers.length; //可能未start\n This.CLog($T(\"Xq4s::stop 和start时差:\") + (envInMS ? envInMS + \"ms \" + $T(\"3CQP::补偿:\") + This.envInFix + \"ms\" + \" envIn:\" + envInLen + \" fps:\" + (envInLen / envInMS * 1000).toFixed(1) : \"-\") + \" stream:\" + This._streamTag + \" (\" + GitUrl + \") LM:\" + LM);\n var end = function () {\n This._stop(); //彻底关掉engineCtx\n if (autoClose) {\n This.close();\n }\n ;\n };\n var err = function (msg) {\n This.CLog($T(\"u8JG::结束录音失败:\") + msg, 1);\n False && False(msg);\n end();\n };\n var ok = function (blob, mime, duration) {\n var tBlob = \"blob\",\n tABuf = \"arraybuffer\",\n tDT = \"dataType\",\n tDDT = \"DefaultDataType\";\n var dType = This[tDT] || Recorder[tDDT] || tBlob,\n dTag = tDT + \"=\" + dType;\n var isAB = blob instanceof ArrayBuffer,\n dErr = 0;\n var dLen = isAB ? blob.byteLength : blob.size;\n if (dType == tABuf) {\n if (!isAB) dErr = 1;\n } else if (dType == tBlob) {\n if (typeof Blob != \"function\") {\n dErr = $T.G(\"NonBrowser-1\", [dTag]) + $T(\"1skY::,请设置{1}\", 0, RecTxt + \".\" + tDDT + '=\"' + tABuf + '\"');\n } else {\n if (isAB) blob = new Blob([blob], {\n type: mime\n });\n if (!(blob instanceof Blob)) dErr = 1;\n mime = blob.type || mime;\n }\n } else {\n dErr = $T.G(\"NotSupport-1\", [dTag]);\n }\n ;\n This.CLog($T(\"Wv7l::结束录音 编码花{1}ms 音频时长{2}ms 文件大小{3}b\", 0, Date.now() - t1, duration, dLen) + \" \" + dTag + \",\" + mime);\n if (dErr) {\n err(dErr != 1 ? dErr : $T(\"Vkbd::{1}编码器返回的不是{2}\", 0, set.type, dType) + \", \" + dTag);\n return;\n }\n ;\n if (set.takeoffEncodeChunk) {\n //接管了输出,此时blob长度为0\n This.CLog($T(\"QWnr::启用takeoffEncodeChunk后stop返回的blob长度为0不提供音频数据\"), 3);\n } else if (dLen < Math.max(50, duration / 5)) {\n //1秒小于0.2k?\n err($T(\"Sz2H::生成的{1}无效\", 0, set.type));\n return;\n }\n ;\n True && True(blob, duration, mime);\n end();\n };\n if (!This.isMock) {\n var isCtxWait = This.state == 3;\n if (!This.state || isCtxWait) {\n err($T(\"wf9t::未开始录音\") + (isCtxWait ? $T(\"Dl2c::,开始录音前无用户交互导致AudioContext未运行\") : \"\"));\n return;\n }\n ;\n }\n ;\n This._stop(true); //将录音状态改成未录音\n var size = This.recSize;\n if (!size) {\n err($T(\"Ltz3::未采集到录音\"));\n return;\n }\n ;\n if (!This[set.type]) {\n err($T(\"xGuI::未加载{1}编码器,请尝试到{2}的src/engine内找到{1}的编码器并加载\", 0, set.type, RecTxt));\n return;\n }\n ;\n\n //环境配置检查,此处仅针对mock调用,因为open已经检查过了\n if (This.isMock) {\n var checkMsg = This.envCheck(This.mockEnvInfo || {\n envName: \"mock\",\n canProcess: false\n }); //没有提供环境信息的mock时没有onProcess回调\n if (checkMsg) {\n err($T(\"AxOH::录音错误:\") + checkMsg);\n return;\n }\n ;\n }\n ;\n\n //此类型有边录边转码(Worker)支持\n var engineCtx = This.engineCtx;\n if (This[set.type + \"_complete\"] && engineCtx) {\n var duration = Math.round(engineCtx.pcmSize / set[sampleRateTxt] * 1000); //采用后的数据长度和buffers的长度可能微小的不一致,是采样率连续转换的精度问题\n\n t1 = Date.now();\n This[set.type + \"_complete\"](engineCtx, function (blob, mime) {\n ok(blob, mime, duration);\n }, err);\n return;\n }\n ;\n\n //标准UI线程转码,调整采样率\n t1 = Date.now();\n if (!This.buffers[0]) {\n err($T(\"xkKd::音频buffers被释放\"));\n return;\n }\n ;\n var chunk = Recorder.SampleData(This.buffers, This[srcSampleRateTxt], set[sampleRateTxt]);\n set[sampleRateTxt] = chunk[sampleRateTxt];\n var res = chunk.data;\n var duration = Math.round(res.length / set[sampleRateTxt] * 1000);\n This.CLog($T(\"CxeT::采样:{1} 花:{2}ms\", 0, size + \"->\" + res.length, Date.now() - t1));\n setTimeout(function () {\n t1 = Date.now();\n This[set.type](res, function (blob, mime) {\n ok(blob, mime, duration);\n }, function (msg) {\n err(msg);\n });\n });\n }\n };\n\n //=======从WebM字节流中提取pcm数据,提取成功返回Float32Array,失败返回null||-1=====\n var WebM_Extract = function (inBytes, scope) {\n if (!scope.pos) {\n scope.pos = [0];\n scope.tracks = {};\n scope.bytes = [];\n }\n ;\n var tracks = scope.tracks,\n position = [scope.pos[0]];\n var endPos = function () {\n scope.pos[0] = position[0];\n };\n var sBL = scope.bytes.length;\n var bytes = new Uint8Array(sBL + inBytes.length);\n bytes.set(scope.bytes);\n bytes.set(inBytes, sBL);\n scope.bytes = bytes;\n\n //先读取文件头和Track信息\n if (!scope._ht) {\n readMatroskaVInt(bytes, position); //EBML Header\n readMatroskaBlock(bytes, position); //跳过EBML Header内容\n if (!BytesEq(readMatroskaVInt(bytes, position), [0x18, 0x53, 0x80, 0x67])) {\n return; //未识别到Segment\n }\n readMatroskaVInt(bytes, position); //跳过Segment长度值\n while (position[0] < bytes.length) {\n var eid0 = readMatroskaVInt(bytes, position);\n var bytes0 = readMatroskaBlock(bytes, position);\n var pos0 = [0],\n audioIdx = 0;\n if (!bytes0) return; //数据不全,等待缓冲\n //Track完整数据,循环读取TrackEntry\n if (BytesEq(eid0, [0x16, 0x54, 0xAE, 0x6B])) {\n while (pos0[0] < bytes0.length) {\n var eid1 = readMatroskaVInt(bytes0, pos0);\n var bytes1 = readMatroskaBlock(bytes0, pos0);\n var pos1 = [0],\n track = {\n channels: 0,\n sampleRate: 0\n };\n if (BytesEq(eid1, [0xAE])) {\n //TrackEntry\n while (pos1[0] < bytes1.length) {\n var eid2 = readMatroskaVInt(bytes1, pos1);\n var bytes2 = readMatroskaBlock(bytes1, pos1);\n var pos2 = [0];\n if (BytesEq(eid2, [0xD7])) {\n //Track Number\n var val = BytesInt(bytes2);\n track.number = val;\n tracks[val] = track;\n } else if (BytesEq(eid2, [0x83])) {\n //Track Type\n var val = BytesInt(bytes2);\n if (val == 1) track.type = \"video\";else if (val == 2) {\n track.type = \"audio\";\n if (!audioIdx) scope.track0 = track;\n track.idx = audioIdx++;\n } else track.type = \"Type-\" + val;\n } else if (BytesEq(eid2, [0x86])) {\n //Track Codec\n var str = \"\";\n for (var i = 0; i < bytes2.length; i++) {\n str += String.fromCharCode(bytes2[i]);\n }\n track.codec = str;\n } else if (BytesEq(eid2, [0xE1])) {\n while (pos2[0] < bytes2.length) {\n //循环读取 Audio 属性\n var eid3 = readMatroskaVInt(bytes2, pos2);\n var bytes3 = readMatroskaBlock(bytes2, pos2);\n //采样率、位数、声道数\n if (BytesEq(eid3, [0xB5])) {\n var val = 0,\n arr = new Uint8Array(bytes3.reverse()).buffer;\n if (bytes3.length == 4) val = new Float32Array(arr)[0];else if (bytes3.length == 8) val = new Float64Array(arr)[0];else CLog(\"WebM Track !Float\", 1, bytes3);\n track[sampleRateTxt] = Math.round(val);\n } else if (BytesEq(eid3, [0x62, 0x64])) track.bitDepth = BytesInt(bytes3);else if (BytesEq(eid3, [0x9F])) track.channels = BytesInt(bytes3);\n }\n }\n }\n }\n }\n ;\n scope._ht = 1;\n CLog(\"WebM Tracks\", tracks);\n endPos();\n break;\n }\n }\n }\n\n //校验音频参数信息,如果不符合代码要求,统统拒绝处理\n var track0 = scope.track0;\n if (!track0) return;\n var trackSR = track0[sampleRateTxt];\n scope.webmSR = trackSR;\n if (track0.bitDepth == 16 && /FLOAT/i.test(track0.codec)) {\n track0.bitDepth = 32; //chrome v66 实际为浮点数\n CLog(\"WebM 16->32 bit\", 3);\n }\n if (trackSR < 8000 || track0.bitDepth != 32 || track0.channels < 1 || !/(\\b|_)PCM\\b/i.test(track0.codec)) {\n scope.bytes = []; //格式非预期 无法处理,清空缓冲数据\n if (!scope.bad) CLog(\"WebM Track Unexpected\", 3, scope);\n scope.bad = 1;\n return -1;\n }\n\n //循环读取Cluster内的SimpleBlock\n var datas = [],\n dataLen = 0;\n while (position[0] < bytes.length) {\n var eid1 = readMatroskaVInt(bytes, position);\n var bytes1 = readMatroskaBlock(bytes, position);\n if (!bytes1) break; //数据不全,等待缓冲\n if (BytesEq(eid1, [0xA3])) {\n //SimpleBlock完整数据\n var trackNo = bytes1[0] & 0xf;\n var track = tracks[trackNo];\n if (!track) {\n //不可能没有,数据出错?\n CLog(\"WebM !Track\" + trackNo, 1, tracks);\n } else if (track.idx === 0) {\n var u8arr = new Uint8Array(bytes1.length - 4);\n for (var i = 4; i < bytes1.length; i++) {\n u8arr[i - 4] = bytes1[i];\n }\n datas.push(u8arr);\n dataLen += u8arr.length;\n }\n }\n endPos();\n }\n if (dataLen) {\n var more = new Uint8Array(bytes.length - scope.pos[0]);\n more.set(bytes.subarray(scope.pos[0]));\n scope.bytes = more; //清理已读取了的缓冲数据\n scope.pos[0] = 0;\n var u8arr = new Uint8Array(dataLen); //已获取的音频数据\n for (var i = 0, i2 = 0; i < datas.length; i++) {\n u8arr.set(datas[i], i2);\n i2 += datas[i].length;\n }\n var arr = new Float32Array(u8arr.buffer);\n if (track0.channels > 1) {\n //多声道,提取一个声道\n var arr2 = [];\n for (var i = 0; i < arr.length;) {\n arr2.push(arr[i]);\n i += track0.channels;\n }\n arr = new Float32Array(arr2);\n }\n ;\n return arr;\n }\n };\n //两个字节数组内容是否相同\n var BytesEq = function (bytes1, bytes2) {\n if (!bytes1 || bytes1.length != bytes2.length) return false;\n if (bytes1.length == 1) return bytes1[0] == bytes2[0];\n for (var i = 0; i < bytes1.length; i++) {\n if (bytes1[i] != bytes2[i]) return false;\n }\n return true;\n };\n //字节数组BE转成int数字\n var BytesInt = function (bytes) {\n var s = \"\"; //0-8字节,js位运算只支持4字节\n for (var i = 0; i < bytes.length; i++) {\n var n = bytes[i];\n s += (n < 16 ? \"0\" : \"\") + n.toString(16);\n }\n ;\n return parseInt(s, 16) || 0;\n };\n //读取一个可变长数值字节数组\n var readMatroskaVInt = function (arr, pos, trim) {\n var i = pos[0];\n if (i >= arr.length) return;\n var b0 = arr[i],\n b2 = (\"0000000\" + b0.toString(2)).substr(-8);\n var m = /^(0*1)(\\d*)$/.exec(b2);\n if (!m) return;\n var len = m[1].length,\n val = [];\n if (i + len > arr.length) return;\n for (var i2 = 0; i2 < len; i2++) {\n val[i2] = arr[i];\n i++;\n }\n if (trim) val[0] = parseInt(m[2] || '0', 2);\n pos[0] = i;\n return val;\n };\n //读取一个自带长度的内容字节数组\n var readMatroskaBlock = function (arr, pos) {\n var lenVal = readMatroskaVInt(arr, pos, 1);\n if (!lenVal) return;\n var len = BytesInt(lenVal);\n var i = pos[0],\n val = [];\n if (len < 0x7FFFFFFF) {\n //超大值代表没有长度\n if (i + len > arr.length) return;\n for (var i2 = 0; i2 < len; i2++) {\n val[i2] = arr[i];\n i++;\n }\n }\n pos[0] = i;\n return val;\n };\n //=====End WebM读取=====\n\n //=====i18n 简版国际化多语言支持=====\n var i18n = Recorder.i18n = {\n lang: \"zh-CN\" //默认中文\n ,\n alias: {\n \"zh-CN\": \"zh\",\n \"en-US\": \"en\"\n } //别名配置,映射到一个语言实例\n ,\n locales: {} //语言实例:zh:{key:\"text\"}\n ,\n data: {} //各种数据,desc$xx:语言描述,rtl$xx:文本方向是否从右到左 rtl$zh:false rtl$ar:true\n //添加语言文本内容,set={lang:\"\",overwrite:true},texts=[\"key:text{1}\",...]\n ,\n put: function (set, texts) {\n var tag = RecTxt + \".i18n.put: \";\n var overwrite = set.overwrite;\n overwrite = overwrite == null || overwrite;\n var lang = set.lang;\n lang = i18n.alias[lang] || lang;\n if (!lang) throw new Error(tag + \"set.lang?\");\n var locale = i18n.locales[lang];\n if (!locale) {\n locale = {};\n i18n.locales[lang] = locale;\n }\n ;\n var exp = /^([\\w\\-]+):/,\n m;\n for (var i = 0; i < texts.length; i++) {\n var v = texts[i];\n m = exp.exec(v);\n if (!m) {\n CLog(tag + \"'key:'? \" + v, 3, set);\n continue;\n }\n var key = m[1],\n v = v.substr(key.length + 1);\n if (!overwrite && locale[key]) continue;\n locale[key] = v;\n }\n }\n //获取key对应的文本,如果没有对应文本,将返回en的,en的也没有将返回zh的\n ,\n get: function /*key,args,lang*/\n () {\n return i18n.v_G.apply(null, arguments);\n },\n v_G: function (key, args, lang) {\n //全局可重写get\n args = args || [];\n lang = lang || i18n.lang;\n lang = i18n.alias[lang] || lang;\n var locale = i18n.locales[lang];\n var val = locale && locale[key] || \"\";\n if (!val && lang != \"zh\") {\n if (lang == \"en\") return i18n.v_G(key, args, \"zh\");\n return i18n.v_G(key, args, \"en\");\n }\n i18n.lastLang = lang;\n if (val == \"=Empty\") return \"\";\n return val.replace(/\\{(\\d+)(\\!?)\\}/g, function (v, a, b) {\n a = +a || 0;\n v = args[a - 1];\n if (a < 1 || a > args.length) {\n v = \"{?}\";\n CLog(\"i18n[\" + key + \"] no {\" + a + \"}: \" + val, 3);\n }\n return b ? \"\" : v;\n });\n }\n /**返回一个国际化文本,返回的文本取决于i18n.lang。\n \t调用参数:T(\"key:[lang]:中文{1}\",\"[lang]:英文{1}\",...,0,\"args1\",\"args2\"),除了key:,其他都是可选的,文本如果在语言实例中不存在会push进去,第一个文本无lang时默认zh,第二个无lang时默认en,文本中用{1-n}来插入args\n \t第一个args前面这个参数必须是0;也可以不提供args,这个参数填args的数量,此时不返回文本,只返回key,再用i18n.get提供参数获取文本\n \t本函数调用,第一个文本需中文,调用尽量简单,不要换行,方便后续自动提取翻译列表\n \targs如果旧的参数位置发生了变更,应当使用新的key,让旧的翻译失效,增加args无需更换key\n \tkey的生成使用随机字符串,不同源码里面可以搞个不同前缀:\n \t\ts=\"\";L=4; for(var i=0,n;i<L;i++){ n=~~(Math.random()*62);s+=n<10?n:String.fromCharCode(n<36?55+n:61+n); }; s\n **/,\n $T: function () {\n return i18n.v_T.apply(null, arguments);\n },\n v_T: function () {\n //全局可重写$T\n var a = arguments,\n key = \"\",\n args = [],\n isArgs = 0,\n tag = RecTxt + \".i18n.$T:\";\n var exp = /^([\\w\\-]*):/,\n m;\n for (var i = 0; i < a.length; i++) {\n var v = a[i];\n if (i == 0) {\n m = exp.exec(v);\n key = m && m[1];\n if (!key) throw new Error(tag + \"0 'key:'?\");\n v = v.substr(key.length + 1);\n }\n if (isArgs === -1) args.push(v);else if (isArgs) throw new Error(tag + \" bad args\");else if (v === 0) isArgs = -1;else if (IsNum(v)) {\n if (v < 1) throw new Error(tag + \" bad args\");\n isArgs = v;\n } else {\n var lang = i == 1 ? \"en\" : i ? \"\" : \"zh\";\n m = exp.exec(v);\n if (m) {\n lang = m[1] || lang;\n v = v.substr(m[1].length + 1);\n }\n if (!m || !lang) throw new Error(tag + i + \" 'lang:'?\");\n i18n.put({\n lang: lang,\n overwrite: false\n }, [key + \":\" + v]);\n }\n }\n if (!key) return \"\";\n if (isArgs > 0) return key;\n return i18n.v_G(key, args);\n }\n };\n var $T = i18n.$T;\n $T.G = i18n.get;\n //预定义文本\n $T(\"NonBrowser-1::非浏览器环境,不支持{1}\", 1);\n $T(\"IllegalArgs-1::参数错误:{1}\", 1);\n $T(\"NeedImport-2::调用{1}需要先导入{2}\", 2);\n $T(\"NotSupport-1::不支持:{1}\", 1);\n //=====End i18n=====\n\n //流量统计用1像素图片地址,设置为空将不参与统计\n Recorder.TrafficImgUrl = \"//ia.51.la/go1?id=20469973&pvFlag=1\";\n var Traffic = Recorder.Traffic = function (report) {\n if (!isBrowser) return;\n report = report ? \"/\" + RecTxt + \"/Report/\" + report : \"\";\n var imgUrl = Recorder.TrafficImgUrl;\n if (imgUrl) {\n var data = Recorder.Traffic;\n var m = /^(https?:..[^\\/#]*\\/?)[^#]*/i.exec(location.href) || [];\n var host = m[1] || \"http://file/\";\n var idf = (m[0] || host) + report;\n if (imgUrl.indexOf(\"//\") == 0) {\n //给url加上http前缀,如果是file协议下,不加前缀没法用\n if (/^https:/i.test(idf)) {\n imgUrl = \"https:\" + imgUrl;\n } else {\n imgUrl = \"http:\" + imgUrl;\n }\n ;\n }\n ;\n if (report) {\n imgUrl = imgUrl + \"&cu=\" + encodeURIComponent(host + report);\n }\n ;\n if (!data[idf]) {\n data[idf] = 1;\n var img = new Image();\n img.src = imgUrl;\n CLog(\"Traffic Analysis Image: \" + (report || RecTxt + \".TrafficImgUrl=\" + Recorder.TrafficImgUrl));\n }\n ;\n }\n ;\n };\n if (WRec2) {\n CLog($T(\"8HO5::覆盖导入{1}\", 0, RecTxt), 1);\n WRec2.Destroy();\n }\n ;\n Export[RecTxt] = Recorder;\n});","map":{"version":3,"names":["factory","browser","window","document","win","Object","define","amd","Recorder","module","exports","Export","isBrowser","NOOP","IsNum","v","ToJson","JSON","stringify","set","initFn","LM","GitUrl","RecTxt","getUserMediaTxt","srcSampleRateTxt","sampleRateTxt","bitRateTxt","CatchTxt","WRec2","CLog","i18n","$T","IsOpen","stream","Stream","tracks","Tracks_","track","state","readyState","LIVE","BufferSize","Destroy","Disconnect","k","DestroyList","BindDestroy","key","call","Support","scope","navigator","mediaDevices","webkitGetUserMedia","mozGetUserMedia","msGetUserMedia","Scope","GetContext","tryNew","AC","AudioContext","webkitAudioContext","ctx","Ctx","isNew","NewCtxs","close","CloseCtx","arr","i","length","_useC","push","CloseNewCtx","L","splice","_isC","e","ResumeCtx","check","True","False","isEnd","isBind","isLsSC","runC","EL","Tag","end","err","ok","bind","_LsSC","run","add","types","sVal","spEnd","CtxSpEnd","resume","then","message","CtxState","msg","ConnectEnableWebM","ConnectEnableWorklet","Connect","streamStore","bufferSize","_c","ctxSR","srChunk","trackSet","tsMsg","getSettings","trackSR","_ts","mediaConn","node","media","_m","createMediaStreamSource","ctxDest","destination","cmsdTxt","_d","connect","isWebM","isWorklet","badInt","webMTips","calls","_call","onReceive","float32Arr","arrSR","k0","index","SampleData","_sum","pcm","data","sum","size","Int16Array","j","s","Math","max","min","abs","scriptProcessor","audioWorklet","recAudioWorklet","RecProc","MediaRecorderTxt","MRWebMPCM","oldFn","createScriptProcessor","createJavaScriptNode","oldIsBest","oldScript","_Disconn_n","get","process","_p","onaudioprocess","inputBuffer","getChannelData","connWorklet","_Disconn_r","AwNode","AudioWorkletNode","clazzUrl","xf","f","toString","replace","clazz","option","DEL_super","This","processorOptions","buffer","Float32Array","pos","port","onmessage","kill","$C","log","input","b","c","len","postMessage","val","slice","more","subarray","btoa","unescape","encodeURIComponent","awNext","_na","nodeAlive","clearTimeout","setTimeout","createNode","_n","ctxOK","url","addModule","connWebM","MR","onData","webmType","supportMR","prototype","isTypeSupported","mrNext","_ra","mrSet","assign","mimeType","ConnectWebMOptions","mr","_r","webmData","_rd","reader","FileReader","onloadend","f32arr","WebM_Extract","Uint8Array","result","webmSR","readAsArrayBuffer","start","ConnAlive","disconnect","stop","isGlobal","_RC","StopS_","arr1","arr2","getAudioTracks","getVideoTracks","audioTracks","videoTracks","pcmDatas","pcmSampleRate","newSampleRate","prevChunkInfo","Txt","offset","raisePrev","filter","fn","sr","srn","freq","IIRFilter","filterFn","frameNext","frameSize","frameType","useSum","nLen","step","floor","raiseStep","res","idx","o","isF32","il","F","Embed","F1","F2","Fx","Fy","idx1","prev","i0","oVal","n","b0","b1","x1","x2","a1","y1","a2","y2","i2","before","after","ceil","atPoint","beforeVal","afterVal","frameNextSize","u8Pos","obj","sampleRate","useLowPass","ov","PI","sn","sin","cs","cos","alpha","a0","y","x","PowerLevel","pcmAbsSum","pcmLength","power","level","round","PowerDBFS","maxSample","Pref","console","now","Date","t","getMinutes","substr","getSeconds","getMilliseconds","recID","envIn","envCheck","id","a","arguments","cwe","error","warn","IsLoser","apply","ID","Traffic","type","onProcess","vB","vS","G","_S","Sync","O","C","_streamStore","sourceStream","_streamGet","_streamCtx","m","open","newCtx","failCall","errMsg","isUserNotAllow","_streamTag","_SO","Lock","lockOpen","lockClose","_O","_O_","lockFail","checkMsg","envName","canProcess","getCtx","runningContext","codeFail","code","top","codeErr1","test","isSecureContext","f1","oldStream","f2","name","tryMsg","callUmCount","callUserMedia","retry","atsTxt","t_AGC","t_AEC","t_ANS","atsTxtJs","parse","mSet","audio","video","videoTrackSet","pro","userAgent","_stop","sTag","mock","pcmData","isMock","mockEnvInfo","buffers","recSize","_setSrcSR","setSr","envInfo","tag","Int8Array","Int32Array","hasFn","takeoffEncodeChunk","envStart","envInLast","envInFirst","envInFix","envInFixTs","engineCtx","pcmSize","envResume","bufferSampleRate","powerLevel","bufferFirstIdx","buffersThis","bufferFirstIdxThis","pcmTime","d","tsInStart","tsPcm","tsInPrev","tsIn","lost","addTime","fixOpen","disableEnvInFix","addPcm","sizeOld","addSize","chunkInfo","duration","bufferNextIdx","bufferNextIdxThis","asyncEnd","num","asyncBegin","hasClear","procTxt","slowT","isOpen","pause","tag3","keepEngine","autoClose","t1","envInMS","envInLen","toFixed","blob","mime","tBlob","tABuf","tDT","tDDT","dType","dTag","isAB","ArrayBuffer","dErr","dLen","byteLength","Blob","isCtxWait","chunk","inBytes","bytes","position","endPos","sBL","_ht","readMatroskaVInt","readMatroskaBlock","BytesEq","eid0","bytes0","pos0","audioIdx","eid1","bytes1","pos1","channels","eid2","bytes2","pos2","BytesInt","number","track0","str","String","fromCharCode","codec","eid3","bytes3","reverse","Float64Array","bitDepth","bad","datas","dataLen","trackNo","u8arr","parseInt","trim","b2","exec","lenVal","lang","alias","locales","put","texts","overwrite","Error","locale","exp","v_G","args","lastLang","v_T","isArgs","TrafficImgUrl","report","imgUrl","location","href","host","idf","indexOf","img","Image","src"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/recorder-core/src/recorder-core.js"],"sourcesContent":["/*\n录音\nhttps://github.com/xiangyuecn/Recorder\n*/\n(function(factory){\n\tvar browser=typeof window==\"object\" && !!window.document;\n\tvar win=browser?window:Object; //非浏览器环境,Recorder挂载在Object下面\n\tfactory(win,browser);\n\t//umd returnExports.js\n\tif(typeof(define)=='function' && define.amd){\n\t\tdefine(function(){\n\t\t\treturn win.Recorder;\n\t\t});\n\t};\n\tif(typeof(module)=='object' && module.exports){\n\t\tmodule.exports=win.Recorder;\n\t};\n}(function(Export,isBrowser){\n\"use strict\";\n\nvar NOOP=function(){};\nvar IsNum=function(v){return typeof v==\"number\"};\nvar ToJson=function(v){return JSON.stringify(v)};\n\nvar Recorder=function(set){\n\treturn new initFn(set);\n};\nvar LM=Recorder.LM=\"2024-10-20 22:15\";\nvar GitUrl=\"https://github.com/xiangyuecn/Recorder\";\nvar RecTxt=\"Recorder\";\nvar getUserMediaTxt=\"getUserMedia\";\nvar srcSampleRateTxt=\"srcSampleRate\";\nvar sampleRateTxt=\"sampleRate\";\nvar bitRateTxt=\"bitRate\";\nvar CatchTxt=\"catch\";\n\nvar WRec2=Export[RecTxt];//重复加载js\nif(WRec2&&WRec2.LM==LM){\n\tWRec2.CLog(WRec2.i18n.$T(\"K8zP::重复导入{1}\",0,RecTxt),3);\n\treturn;\n};\n\n\n//是否已经打开了全局的麦克风录音,所有工作都已经准备好了,就等接收音频数据了\nRecorder.IsOpen=function(){\n\tvar stream=Recorder.Stream;\n\tif(stream){\n\t\tvar tracks=Tracks_(stream), track=tracks[0];\n\t\tif(track){\n\t\t\tvar state=track.readyState;\n\t\t\treturn state==\"live\"||state==track.LIVE;\n\t\t};\n\t};\n\treturn false;\n};\n/*H5录音时的AudioContext缓冲大小。会影响H5录音时的onProcess调用速率,相对于AudioContext.sampleRate=48000时,4096接近12帧/s,调节此参数可生成比较流畅的回调动画。\n\t取值256, 512, 1024, 2048, 4096, 8192, or 16384\n\t注意,取值不能过低,2048开始不同浏览器可能回调速率跟不上造成音质问题。\n\t一般无需调整,调整后需要先close掉已打开的录音,再open时才会生效。\n*/\nRecorder.BufferSize=4096;\n//销毁已持有的所有全局资源,当要彻底移除Recorder时需要显式的调用此方法\nRecorder.Destroy=function(){\n\tCLog(RecTxt+\" Destroy\");\n\tDisconnect();//断开可能存在的全局Stream、资源\n\t\n\tfor(var k in DestroyList){\n\t\tDestroyList[k]();\n\t};\n};\nvar DestroyList={};\n//登记一个需要销毁全局资源的处理方法\nRecorder.BindDestroy=function(key,call){\n\tDestroyList[key]=call;\n};\n//判断浏览器是否支持录音,随时可以调用。注意:仅仅是检测浏览器支持情况,不会判断和调起用户授权,不会判断是否支持特定格式录音。\nRecorder.Support=function(){\n\tif(!isBrowser) return false;\n\tvar scope=navigator.mediaDevices||{};\n\tif(!scope[getUserMediaTxt]){\n\t\tscope=navigator;\n\t\tscope[getUserMediaTxt]||(scope[getUserMediaTxt]=scope.webkitGetUserMedia||scope.mozGetUserMedia||scope.msGetUserMedia);\n\t};\n\tif(!scope[getUserMediaTxt]){\n\t\treturn false;\n\t};\n\tRecorder.Scope=scope;\n\t\n\tif(!Recorder.GetContext()){\n\t\treturn false;\n\t};\n\treturn true;\n};\n//获取AudioContext对象,如果浏览器不支持将返回null。tryNew=false时返回全局的Recorder.Ctx,Ctx.state可能是closed,仅限用于解码等操作。tryNew=true时会尝试创建新的ctx(不支持close的老浏览器依旧返回全局的),注意用完必须自己调用CloseNewCtx(ctx)关闭;注意:非用户操作(触摸、点击等)时调用返回的ctx.state可能是suspended状态,需要在用户操作时调用ctx.resume恢复成running状态,参考rec的runningContext配置\nRecorder.GetContext=function(tryNew){\n\tif(!isBrowser) return null;\n\tvar AC=window.AudioContext;\n\tif(!AC){\n\t\tAC=window.webkitAudioContext;\n\t};\n\tif(!AC){\n\t\treturn null;\n\t};\n\t\n\tvar ctx=Recorder.Ctx, isNew=0;\n\tif(!ctx){ //241020版本后不再保留打开状态的ctx,原因是iOS不全部关闭时新的ctx有可能不正常\n\t\t//不能反复构造,低版本number of hardware contexts reached maximum (6)\n\t\tctx=Recorder.Ctx=new AC(); isNew=1;\n\t\tRecorder.NewCtxs=Recorder.NewCtxs||[];\n\t\t\n\t\tRecorder.BindDestroy(\"Ctx\",function(){\n\t\t\tvar ctx=Recorder.Ctx;\n\t\t\tif(ctx&&ctx.close){//能关掉就关掉,关不掉就保留着\n\t\t\t\tCloseCtx(ctx);\n\t\t\t\tRecorder.Ctx=0;\n\t\t\t};\n\t\t\tvar arr=Recorder.NewCtxs; Recorder.NewCtxs=[];\n\t\t\tfor(var i=0;i<arr.length;i++)CloseCtx(arr[i]);\n\t\t});\n\t};\n\tif(tryNew && ctx.close){//没法关闭的不允许再创建\n\t\tif(!isNew){\n\t\t\tif(!ctx._useC) CloseCtx(ctx); //关闭全局的,不再保留打开状态\n\t\t\tctx=new AC(); //如果是上面新建的就用上面的,不然就用全新的\n\t\t};\n\t\tctx._useC=1;\n\t\tRecorder.NewCtxs.push(ctx);\n\t};\n\treturn ctx;\n};\n//关闭新创建的AudioContext(之前老版本如果是全局的不关闭,241020版本后全部关闭)\nRecorder.CloseNewCtx=function(ctx){\n\tif(ctx && ctx.close){\n\t\tCloseCtx(ctx);\n\t\tvar arr=Recorder.NewCtxs||[],L=arr.length;\n\t\tfor(var i=0;i<arr.length;i++){\n\t\t\tif(arr[i]==ctx){ arr.splice(i,1); break; }\n\t\t}\n\t\tCLog($T(\"mSxV::剩{1}个GetContext未close\",0,L+\"-1=\"+arr.length),arr.length?3:0);\n\t}\n};\nvar CloseCtx=function(ctx){\n\tif(ctx && ctx.close && !ctx._isC){\n\t\tctx._isC=1;\n\t\tif(ctx.state!=\"closed\"){\n\t\t\ttry{ ctx.close() }catch(e){ CLog(\"ctx close err\",1,e) }\n\t\t}\n\t}\n};\n//当AudioContext的状态是suspended时,调用resume恢复状态,但如果没有用户操作resume可能没有回调,封装解决此回调问题;check(count)返回true继续尝试resume,返回false终止任务(不回调False)\nvar ResumeCtx=Recorder.ResumeCtx=function(ctx,check,True,False){\n\tvar isEnd=0,isBind=0,isLsSC=0,runC=0,EL=\"EventListener\",Tag=\"ResumeCtx \";\n\tvar end=function(err,ok){\n\t\tif(isBind){ bind() }\n\t\tif(!isEnd){ isEnd=1; //回调结果\n\t\t\terr&&False(err,runC);\n\t\t\tok&&True(runC);\n\t\t}\n\t\tif(ok){ //监听后续状态变化\n\t\t\tif(!ctx._LsSC && ctx[\"add\"+EL]) ctx[\"add\"+EL](\"statechange\",run);\n\t\t\tctx._LsSC=1; isLsSC=1;\n\t\t}\n\t};\n\tvar bind=function(add){\n\t\tif(add && isBind) return; isBind=add?1:0;\n\t\tvar types=[\"focus\",\"mousedown\",\"mouseup\",\"touchstart\",\"touchend\"];\n\t\tfor(var i=0;i<types.length;i++)\n\t\t\twindow[(add?\"add\":\"remove\")+EL](types[i],run,true);\n\t};\n\tvar run=function(){\n\t\tvar sVal=ctx.state,spEnd=CtxSpEnd(sVal);\n\t\tif(!isEnd && !check(spEnd?++runC:runC))return end(); //终止,不回调\n\t\tif(spEnd){\n\t\t\tif(isLsSC)CLog(Tag+\"sc \"+sVal,3);\n\t\t\tbind(1); //绑定用户事件尝试恢复\n\t\t\tctx.resume().then(function(){ //resume回调不可靠\n\t\t\t\tif(isLsSC)CLog(Tag+\"sc \"+ctx.state);\n\t\t\t\tend(0,1);\n\t\t\t})[CatchTxt](function(e){ //出错且无法恢复\n\t\t\t\tCLog(Tag+\"error\",1,e);\n\t\t\t\tif(!CtxSpEnd(ctx.state)){\n\t\t\t\t\tend(e.message||\"error\");\n\t\t\t\t}\n\t\t\t});\n\t\t}else if(sVal==\"closed\"){\n\t\t\tif(isLsSC && !ctx._isC)CLog(Tag+\"sc \"+sVal,1); //无法恢复,打个日志\n\t\t\tend(\"ctx closed\");\n\t\t}else{ end(0,1) }; //running 或老的无state\n\t};\n\trun();\n};\nvar CtxSpEnd=Recorder.CtxSpEnd=function(v){\n\treturn v==\"suspended\"||v==\"interrupted\"; //后面这个仅iOS有\n};\nvar CtxState=function(ctx){\n\tvar v=ctx.state,msg=\"ctx.state=\"+v;\n\tif(CtxSpEnd(v))msg+=$T(\"nMIy::(注意:ctx不是running状态,rec.open和start至少要有一个在用户操作(触摸、点击等)时进行调用,否则将在rec.start时尝试进行ctx.resume,可能会产生兼容性问题(仅iOS),请参阅文档中runningContext配置)\");\n\treturn msg;\n};\n\n\n/*是否启用MediaRecorder.WebM.PCM来进行音频采集连接(如果浏览器支持的话),默认启用,禁用或者不支持时将使用AudioWorklet或ScriptProcessor来连接;MediaRecorder采集到的音频数据比其他方式更好,几乎不存在丢帧现象,所以音质明显会好很多,建议保持开启*/\nvar ConnectEnableWebM=\"ConnectEnableWebM\";\nRecorder[ConnectEnableWebM]=true;\n\n/*是否启用AudioWorklet特性来进行音频采集连接(如果浏览器支持的话),默认禁用,禁用或不支持时将使用过时的ScriptProcessor来连接(如果方法还在的话),当前AudioWorklet的实现在移动端没有ScriptProcessor稳健;ConnectEnableWebM如果启用并且有效时,本参数将不起作用*/\nvar ConnectEnableWorklet=\"ConnectEnableWorklet\";\nRecorder[ConnectEnableWorklet]=false;\n\n/*初始化H5音频采集连接。如果自行提供了sourceStream将只进行一次简单的连接处理。如果是普通麦克风录音,此时的Stream是全局的,Safari上断开后就无法再次进行连接使用,表现为静音,因此使用全部使用全局处理避免调用到disconnect;全局处理也有利于屏蔽底层细节,start时无需再调用底层接口,提升兼容、可靠性。*/\nvar Connect=function(streamStore){\n\tvar bufferSize=streamStore.BufferSize||Recorder.BufferSize;\n\t\n\tvar stream=streamStore.Stream;\n\tvar ctx=stream._c, ctxSR=ctx[sampleRateTxt], srChunk={};\n\t\n\t//获取音频流信息\n\tvar tracks=Tracks_(stream),track=tracks[0],trackSet=null,tsMsg=\"\";\n\tif(track && track.getSettings){\n\t\ttrackSet=track.getSettings();\n\t\tvar trackSR=trackSet[sampleRateTxt];\n\t\tif(trackSR && trackSR!=ctxSR){\n\t\t\ttsMsg=$T(\"eS8i::Stream的采样率{1}不等于{2},将进行采样率转换(注意:音质不会变好甚至可能变差),主要在移动端未禁用回声消除时会产生此现象,浏览器有回声消除时可能只会返回16k采样率的音频数据,\",0,trackSR,ctxSR);\n\t\t}\n\t}\n\tstream._ts=trackSet;\n\tCLog(tsMsg+\"Stream TrackSet: \"+ToJson(trackSet), tsMsg?3:0);\n\t\n\tvar mediaConn=function(node){\n\t\tvar media=stream._m=ctx.createMediaStreamSource(stream);\n\t\tvar ctxDest=ctx.destination,cmsdTxt=\"createMediaStreamDestination\";\n\t\tif(ctx[cmsdTxt]){\n\t\t\tctxDest=stream._d=ctx[cmsdTxt]();\n\t\t};\n\t\tmedia.connect(node);\n\t\tnode.connect(ctxDest);\n\t}\n\tvar isWebM,isWorklet,badInt,webMTips=\"\";\n\tvar calls=stream._call;\n\t\n\t//浏览器回传的音频数据处理\n\tvar onReceive=function(float32Arr, arrSR){\n\t\tfor(var k0 in calls){//has item\n\t\t\tif(arrSR!=ctxSR){ //MediaRecorder录制的采样率可能和ctx的采样率不同(16k),转换采样率方便统一处理代码也更简单,但音质不会变好,甚至可能会变差一点\n\t\t\t\tsrChunk.index=0;\n\t\t\t\tsrChunk=Recorder.SampleData([float32Arr],arrSR,ctxSR,srChunk,{_sum:1});\n\t\t\t\tvar pcm=srChunk.data;\n\t\t\t\tvar sum=srChunk._sum;\n\t\t\t}else{ //采样率相同,不需要转换采样率\n\t\t\t\tsrChunk={};\n\t\t\t\tvar size=float32Arr.length;\n\t\t\t\t\n\t\t\t\tvar pcm=new Int16Array(size);\n\t\t\t\tvar sum=0;\n\t\t\t\tfor(var j=0;j<size;j++){//floatTo16BitPCM \n\t\t\t\t\tvar s=Math.max(-1,Math.min(1,float32Arr[j]));\n\t\t\t\t\ts=s<0?s*0x8000:s*0x7FFF;\n\t\t\t\t\tpcm[j]=s;\n\t\t\t\t\tsum+=Math.abs(s);\n\t\t\t\t};\n\t\t\t};\n\t\t\t\n\t\t\tfor(var k in calls){\n\t\t\t\tcalls[k](pcm,sum);\n\t\t\t};\n\t\t\t\n\t\t\treturn;\n\t\t};\n\t};\n\t\n\tvar scriptProcessor=\"ScriptProcessor\";//一堆字符串名字,有利于压缩js\n\tvar audioWorklet=\"audioWorklet\";\n\tvar recAudioWorklet=RecTxt+\" \"+audioWorklet;\n\tvar RecProc=\"RecProc\";\n\tvar MediaRecorderTxt=\"MediaRecorder\";\n\tvar MRWebMPCM=MediaRecorderTxt+\".WebM.PCM\";\n\n\n//===================连接方式三=========================\n\t//古董级别的 ScriptProcessor 处理,目前所有浏览器均兼容,虽然是过时的方法,但更稳健,移动端性能比AudioWorklet强\n\tvar oldFn=ctx.createScriptProcessor||ctx.createJavaScriptNode;\n\tvar oldIsBest=$T(\"ZGlf::。由于{1}内部1秒375次回调,在移动端可能会有性能问题导致回调丢失录音变短,PC端无影响,暂不建议开启{1}。\",0,audioWorklet);\n\tvar oldScript=function(){\n\t\tisWorklet=stream.isWorklet=false;\n\t\t_Disconn_n(stream);\n\t\tCLog($T(\"7TU0::Connect采用老的{1},\",0,scriptProcessor)\n\t\t\t+i18n.get(Recorder[ConnectEnableWorklet]?\n\t\t\t\t$T(\"JwCL::但已设置{1}尝试启用{2}\",2)\n\t\t\t\t:$T(\"VGjB::可设置{1}尝试启用{2}\",2)\n\t\t\t\t,[RecTxt+\".\"+ConnectEnableWorklet+\"=true\",audioWorklet]\n\t\t\t)+webMTips+oldIsBest,3);\n\t\t\n\t\tvar process=stream._p=oldFn.call(ctx,bufferSize,1,1);//单声道,省的数据处理复杂\n\t\tmediaConn(process);\n\t\t\n\t\tprocess.onaudioprocess=function(e){\n\t\t\tvar arr=e.inputBuffer.getChannelData(0);\n\t\t\tonReceive(arr, ctxSR);\n\t\t};\n\t};\n\n\n//===================连接方式二=========================\nvar connWorklet=function(){\n\t//尝试开启AudioWorklet处理\n\tisWebM=stream.isWebM=false;\n\t_Disconn_r(stream);\n\t\n\tisWorklet=stream.isWorklet=!oldFn || Recorder[ConnectEnableWorklet];\n\tvar AwNode=window.AudioWorkletNode;\n\tif(!(isWorklet && ctx[audioWorklet] && AwNode)){\n\t\toldScript();//被禁用 或 不支持,直接使用老的\n\t\treturn;\n\t};\n\tvar clazzUrl=function(){\n\t\tvar xf=function(f){return f.toString().replace(/^function|DEL_/g,\"\").replace(/\\$RA/g,recAudioWorklet)};\n\t\tvar clazz='class '+RecProc+' extends AudioWorkletProcessor{';\n\t\t\tclazz+=\"constructor \"+xf(function(option){\n\t\t\t\tDEL_super(option);\n\t\t\t\tvar This=this,bufferSize=option.processorOptions.bufferSize;\n\t\t\t\tThis.bufferSize=bufferSize;\n\t\t\t\tThis.buffer=new Float32Array(bufferSize*2);//乱给size搞乱缓冲区不管\n\t\t\t\tThis.pos=0;\n\t\t\t\tThis.port.onmessage=function(e){\n\t\t\t\t\tif(e.data.kill){\n\t\t\t\t\t\tThis.kill=true;\n\t\t\t\t\t\t$C.log(\"$RA kill call\");\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t$C.log(\"$RA .ctor call\", option);\n\t\t\t});\n\t\t\t\n\t\t\t//https://developer.mozilla.org/en-US/docs/Web/API/AudioWorkletProcessor/process 每次回调128个采样数据,1秒375次回调,高频导致移动端性能问题,结果就是回调次数缺斤少两,进而导致丢失数据,PC端似乎没有性能问题\n\t\t\tclazz+=\"process \"+xf(function(input,b,c){//需要等到ctx激活后才会有回调\n\t\t\t\tvar This=this,bufferSize=This.bufferSize;\n\t\t\t\tvar buffer=This.buffer,pos=This.pos;\n\t\t\t\tinput=(input[0]||[])[0]||[];\n\t\t\t\tif(input.length){\n\t\t\t\t\tbuffer.set(input,pos);\n\t\t\t\t\tpos+=input.length;\n\t\t\t\t\t\n\t\t\t\t\tvar len=~~(pos/bufferSize)*bufferSize;\n\t\t\t\t\tif(len){\n\t\t\t\t\t\tthis.port.postMessage({ val: buffer.slice(0,len) });\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar more=buffer.subarray(len,pos);\n\t\t\t\t\t\tbuffer=new Float32Array(bufferSize*2);\n\t\t\t\t\t\tbuffer.set(more);\n\t\t\t\t\t\tpos=more.length;\n\t\t\t\t\t\tThis.buffer=buffer;\n\t\t\t\t\t}\n\t\t\t\t\tThis.pos=pos;\n\t\t\t\t}\n\t\t\t\treturn !This.kill;\n\t\t\t});\n\t\tclazz+='}'\n\t\t\t+'try{'\n\t\t\t\t+'registerProcessor(\"'+RecProc+'\", '+RecProc+')'\n\t\t\t+'}catch(e){$C.error(\"'+recAudioWorklet+' Reg Error\",e)}';\n\t\tclazz=clazz.replace(/\\$C\\./g,\"console.\");//一些编译器会文本替换日志函数\n\t\t//URL.createObjectURL 本地有些浏览器会报 Not allowed to load local resource,直接用dataurl\n\t\treturn \"data:text/javascript;base64,\"+btoa(unescape(encodeURIComponent(clazz)));\n\t};\n\t\n\tvar awNext=function(){//可以继续,没有调用断开\n\t\treturn isWorklet && stream._na;\n\t};\n\tvar nodeAlive=stream._na=function(){\n\t\t//start时会调用,只要没有收到数据就断定AudioWorklet有问题,恢复用老的\n\t\tif(badInt!==\"\"){//没有回调过数据\n\t\t\tclearTimeout(badInt);\n\t\t\tbadInt=setTimeout(function(){\n\t\t\t\tbadInt=0;\n\t\t\t\tif(awNext()){\n\t\t\t\t\tCLog($T(\"MxX1::{1}未返回任何音频,恢复使用{2}\",0,audioWorklet,scriptProcessor),3);\n\t\t\t\t\toldFn&&oldScript();//未来没有老的,可能是误判\n\t\t\t\t};\n\t\t\t},500);\n\t\t};\n\t};\n\tvar createNode=function(){\n\t\tif(!awNext())return;\n\t\tvar node=stream._n=new AwNode(ctx, RecProc, {\n\t\t\tprocessorOptions:{bufferSize:bufferSize}\n\t\t});\n\t\tmediaConn(node);\n\t\tnode.port.onmessage=function(e){\n\t\t\tif(badInt){\n\t\t\t\tclearTimeout(badInt);badInt=\"\";\n\t\t\t};\n\t\t\tif(awNext()){\n\t\t\t\tonReceive(e.data.val, ctxSR);\n\t\t\t}else if(!isWorklet){\n\t\t\t\tCLog($T(\"XUap::{1}多余回调\",0,audioWorklet),3);\n\t\t\t};\n\t\t};\n\t\tCLog($T(\"yOta::Connect采用{1},设置{2}可恢复老式{3}\",0,audioWorklet,RecTxt+\".\"+ConnectEnableWorklet+\"=false\",scriptProcessor)+webMTips+oldIsBest,3);\n\t};\n\t\n\t//如果start时的resume和下面的构造node同时进行,将会导致部分浏览器崩溃 (STATUS_ACCESS_VIOLATION),源码assets中 ztest_chrome_bug_AudioWorkletNode.html 可测试。所以,将所有代码套到resume里面(不管catch),避免出现这个问题\n\tvar ctxOK=function(){\n\t\tif(!awNext())return;\n\t\tif(ctx[RecProc]){\n\t\t\tcreateNode();\n\t\t\treturn;\n\t\t};\n\t\tvar url=clazzUrl();\n\t\tctx[audioWorklet].addModule(url).then(function(e){\n\t\t\tif(!awNext())return;\n\t\t\tctx[RecProc]=1;\n\t\t\tcreateNode();\n\t\t\tif(badInt){//重新计时\n\t\t\t\tnodeAlive();\n\t\t\t};\n\t\t})[CatchTxt](function(e){ //fix 关键字,保证catch压缩时保持字符串形式\n\t\t\tCLog(audioWorklet+\".addModule Error\",1,e);\n\t\t\tawNext()&&oldScript();\n\t\t});\n\t};\n\tResumeCtx(ctx,function(){ return awNext() } ,ctxOK,ctxOK);\n};\n\n\n//===================连接方式一=========================\nvar connWebM=function(){\n\t//尝试开启MediaRecorder录制webm+pcm处理\n\tvar MR=window[MediaRecorderTxt];\n\tvar onData=\"ondataavailable\";\n\tvar webmType=\"audio/webm; codecs=pcm\";\n\tisWebM=stream.isWebM=Recorder[ConnectEnableWebM];\n\t\n\tvar supportMR=MR && (onData in MR.prototype) && MR.isTypeSupported(webmType);\n\twebMTips=supportMR?\"\":$T(\"VwPd::(此浏览器不支持{1})\",0,MRWebMPCM);\n\tif(!isWebM || !supportMR){\n\t\tconnWorklet(); //被禁用 或 不支持MediaRecorder 或 不支持webm+pcm\n\t\treturn;\n\t}\n\t\n\tvar mrNext=function(){//可以继续,没有调用断开\n\t\treturn isWebM && stream._ra;\n\t};\n\tstream._ra=function(){\n\t\t//start时会调用,只要没有收到数据就断定MediaRecorder有问题,降级处理\n\t\tif(badInt!==\"\"){//没有回调过数据\n\t\t\tclearTimeout(badInt);\n\t\t\tbadInt=setTimeout(function(){\n\t\t\t\t//badInt=0; 保留给nodeAlive继续判断\n\t\t\t\tif(mrNext()){\n\t\t\t\t\tCLog($T(\"vHnb::{1}未返回任何音频,降级使用{2}\",0,MediaRecorderTxt,audioWorklet),3);\n\t\t\t\t\tconnWorklet();\n\t\t\t\t};\n\t\t\t},500);\n\t\t};\n\t};\n\t\n\tvar mrSet=Object.assign({mimeType:webmType}, Recorder.ConnectWebMOptions);\n\tvar mr=stream._r=new MR(stream, mrSet);\n\tvar webmData=stream._rd={};\n\tmr[onData]=function(e){\n\t\t//提取webm中的pcm数据,提取失败就等着badInt超时降级处理\n\t\tvar reader=new FileReader();\n\t\treader.onloadend=function(){\n\t\t\tif(mrNext()){\n\t\t\t\tvar f32arr=WebM_Extract(new Uint8Array(reader.result),webmData);\n\t\t\t\tif(!f32arr)return;\n\t\t\t\tif(f32arr==-1){//无法提取,立即降级\n\t\t\t\t\tconnWorklet();\n\t\t\t\t\treturn;\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tif(badInt){\n\t\t\t\t\tclearTimeout(badInt);badInt=\"\";\n\t\t\t\t};\n\t\t\t\tonReceive(f32arr, webmData.webmSR);\n\t\t\t}else if(!isWebM){\n\t\t\t\tCLog($T(\"O9P7::{1}多余回调\",0,MediaRecorderTxt),3);\n\t\t\t};\n\t\t};\n\t\treader.readAsArrayBuffer(e.data);\n\t};\n\tmr.start(~~(bufferSize/48));//按48k时的回调间隔\n\tCLog($T(\"LMEm::Connect采用{1},设置{2}可恢复使用{3}或老式{4}\",0,MRWebMPCM,RecTxt+\".\"+ConnectEnableWebM+\"=false\",audioWorklet,scriptProcessor));\n};\n\n\tconnWebM();\n};\nvar ConnAlive=function(stream){\n\tif(stream._na) stream._na(); //检查AudioWorklet连接是否有效,无效就回滚到老的ScriptProcessor\n\tif(stream._ra) stream._ra(); //检查MediaRecorder连接是否有效,无效就降级处理\n};\nvar _Disconn_n=function(stream){\n\tstream._na=null;\n\tif(stream._n){\n\t\tstream._n.port.postMessage({kill:true});\n\t\tstream._n.disconnect();\n\t\tstream._n=null;\n\t};\n};\nvar _Disconn_r=function(stream){\n\tstream._ra=null;\n\tif(stream._r){\n\t\ttry{ stream._r.stop() }catch(e){ CLog(\"mr stop err\",1,e) }\n\t\tstream._r=null;\n\t};\n};\nvar Disconnect=function(streamStore){\n\tstreamStore=streamStore||Recorder;\n\tvar isGlobal=streamStore==Recorder;\n\t\n\tvar stream=streamStore.Stream;\n\tif(stream){\n\t\tif(stream._m){\n\t\t\tstream._m.disconnect();\n\t\t\tstream._m=null;\n\t\t};\n\t\tif(!stream._RC && stream._c){//提供的runningContext不处理\n\t\t\tRecorder.CloseNewCtx(stream._c);\n\t\t};\n\t\tstream._RC=null; stream._c=null;\n\t\tif(stream._d){\n\t\t\tStopS_(stream._d.stream);\n\t\t\tstream._d=null;\n\t\t};\n\t\tif(stream._p){\n\t\t\tstream._p.disconnect();\n\t\t\tstream._p.onaudioprocess=stream._p=null;\n\t\t};\n\t\t_Disconn_n(stream);\n\t\t_Disconn_r(stream);\n\t\t\n\t\tif(isGlobal){//全局的时候,要把流关掉(麦克风),直接提供的流不处理\n\t\t\tStopS_(stream);\n\t\t};\n\t};\n\tstreamStore.Stream=0;\n};\n//关闭一个音频流\nvar StopS_=Recorder.StopS_=function(stream){\n\tvar tracks=Tracks_(stream);\n\tfor(var i=0;i<tracks.length;i++){\n\t\tvar track=tracks[i];\n\t\ttrack.stop&&track.stop();\n\t};\n\tstream.stop&&stream.stop();\n};\n//获取流中的所有轨道\nvar Tracks_=function(stream){\n\tvar arr1=0,arr2=0,arr=[];\n\t//stream.getTracks() 得到的sourceStream还得去排序 不然第一个可能是video\n\tif(stream.getAudioTracks){ arr1=stream.getAudioTracks(); arr2=stream.getVideoTracks(); }\n\tif(!arr1){ arr1=stream.audioTracks; arr2=stream.videoTracks; }\n\tfor(var i=0,L=arr1?arr1.length:0;i<L;i++)arr.push(arr1[i]); //音频放前面,方便取[0]\n\tfor(var i=0,L=arr2?arr2.length:0;i<L;i++)arr.push(arr2[i]);\n\treturn arr;\n};\n\n/*对pcm数据的采样率进行转换\npcmDatas: [[Int16,...]] pcm片段列表,二维数组里面是Int16Array,也可传Float32Array(会转成Int16Array)\npcmSampleRate:48000 pcm数据的采样率\nnewSampleRate:16000 需要转换成的采样率,241020版本后支持转成任意采样率,之前老版本newSampleRate>=pcmSampleRate时不会进行任何处理,小于时会进行重新采样\nprevChunkInfo:{} 可选,上次调用时的返回值,用于连续转换,本次调用将从上次结束位置开始进行处理。或可自行定义一个ChunkInfo从pcmDatas指定的位置开始进行转换\noption:{ 可选,配置项\n\t\tframeSize:123456 帧大小,每帧的PCM Int16的数量,采样率转换后的pcm长度为frameSize的整数倍,用于连续转换。目前仅在mp3格式时才有用,frameSize取值为1152,这样编码出来的mp3时长和pcm的时长完全一致,否则会因为mp3最后一帧录音不够填满时添加填充数据导致mp3的时长变长。\n\t\tframeType:\"\" 帧类型,一般为rec.set.type,提供此参数时无需提供frameSize,会自动使用最佳的值给frameSize赋值,目前仅支持mp3=1152(MPEG1 Layer3的每帧采采样数),其他类型=1。\n\t\t\t以上两个参数用于连续转换时使用,最多使用一个,不提供时不进行帧的特殊处理,提供时必须同时提供prevChunkInfo才有作用。最后一段数据处理时无需提供帧大小以便输出最后一丁点残留数据。\n\t}\n\n返回ChunkInfo:{\n\t//可定义,从指定位置开始转换到结尾\n\tindex:0 pcmDatas已处理到的索引;比如每次都是单个pcm需要连续处理时,可每次调用前重置成0,pcmDatas仅需传入`[pcm]`固定一个元素\n\toffset:0.0 已处理到的index对应的pcm中的偏移的下一个位置(提升采样率时为结果的pcm)\n\traisePrev:null 提升采样率时的前一个pcm结果采样值\n\t\n\t//可定义,指定的一个滤波配置:默认使用Recorder.IIRFilter低通滤波(可有效抑制混叠产生的杂音,小采样率大于高采样率的75%时不默认滤波),如果提供了配置但fn为null时将不滤波;sr、srn为此滤波函数对应的初始化采样率,当采样率和参数的不一致时将重新设为默认函数\n\tfilter:null||{fn:fn(sample),sr:pcmSampleRate,srn:newSampleRate}\n\t\n\t//仅作为返回值\n\tframeNext:null||[Int16,...] 下一帧的部分数据,frameSize设置了的时候才可能会有\n\tsampleRate:16000 结果的采样率=newSampleRate,老版本<=newSampleRate\n\tdata:[Int16,...] 转换后的PCM结果;如果是连续转换,并且pcmDatas中并没有新数据时,data的长度可能为0\n}\n*/\nRecorder.SampleData=function(pcmDatas,pcmSampleRate,newSampleRate,prevChunkInfo,option){\n\tvar Txt=\"SampleData\";\n\tprevChunkInfo||(prevChunkInfo={});\n\tvar index=prevChunkInfo.index||0;\n\tvar offset=prevChunkInfo.offset||0;\n\tvar raisePrev=prevChunkInfo.raisePrev||0;\n\t\n\tvar filter=prevChunkInfo.filter;\n\tif(filter&&filter.fn&&(filter.sr&&filter.sr!=pcmSampleRate || filter.srn&&filter.srn!=newSampleRate)){\n\t\tfilter=null; CLog($T(\"d48C::{1}的filter采样率变了,重设滤波\",0,Txt),3);\n\t};\n\tif(!filter){ //采样率差距比较大才开启低通滤波\n\t\tif(newSampleRate<=pcmSampleRate){ //降低采样率或不变,最高频率用新采样率频率的3/4\n\t\t\tvar freq=newSampleRate>pcmSampleRate*3/4?0: newSampleRate/2 *3/4;\n\t\t\tfilter={fn:freq?Recorder.IIRFilter(true,pcmSampleRate,freq):0};\n\t\t}else{ //提升采样率,最高频率用原始采样率频率的3/4\n\t\t\tvar freq=pcmSampleRate>newSampleRate*3/4?0: pcmSampleRate/2 *3/4;\n\t\t\tfilter={fn:freq?Recorder.IIRFilter(true,newSampleRate,freq):0};\n\t\t};\n\t};\n\tfilter.sr=pcmSampleRate;\n\tfilter.srn=newSampleRate;\n\tvar filterFn=filter.fn;\n\t\n\tvar frameNext=prevChunkInfo.frameNext||[];\n\toption||(option={});\n\tvar frameSize=option.frameSize||1;\n\tif(option.frameType){\n\t\tframeSize=option.frameType==\"mp3\"?1152:1;\n\t};\n\tvar useSum=option._sum, _sum=0; //内部用的,sum不考虑配置了frame\n\t\n\tvar nLen=pcmDatas.length;\n\tif(index>nLen+1){\n\t\tCLog($T(\"tlbC::{1}似乎传入了未重置chunk {2}\",0,Txt,index+\">\"+nLen),3);\n\t};\n\tvar size=0;\n\tfor(var i=index;i<nLen;i++){\n\t\tsize+=pcmDatas[i].length;\n\t};\n\t\n\t//采样 https://www.cnblogs.com/blqw/p/3782420.html\n\tvar step=pcmSampleRate/newSampleRate;\n\tif(step>1){//新采样低于录音采样,进行抽样\n\t\tsize=Math.max(0,size-Math.floor(offset));\n\t\tsize=Math.floor(size/step);\n\t}else if(step<1){//新采样高于录音采样,插值处理\n\t\tvar raiseStep=1/step;\n\t\tsize=Math.floor(size*raiseStep);\n\t};\n\t\n\tsize+=frameNext.length;\n\tvar res=new Int16Array(size);\n\tvar idx=0;\n\t//添加上一次不够一帧的剩余数据\n\tfor(var i=0;i<frameNext.length;i++){\n\t\tres[idx]=frameNext[i];\n\t\tidx++;\n\t};\n\t//处理数据\n\tfor (;index<nLen;index++) {\n\t\tvar o=pcmDatas[index], isF32=o instanceof Float32Array;\n\t\tvar i=offset,il=o.length;\n\t\tvar F=filterFn&&filterFn.Embed,F1=0,F2=0,Fx=0,Fy=0;//低通滤波后的数据\n\t\t\n\t\tif(step<1){ //提升采样率\n\t\t\tvar idx1=idx+i, prev=raisePrev;\n\t\t\tfor(var i0=0;i0<il;i0++){\n\t\t\t\tvar oVal=o[i0];\n\t\t\t\tif(isF32){//floatTo16BitPCM \n\t\t\t\t\toVal=Math.max(-1,Math.min(1,oVal));\n\t\t\t\t\toVal=oVal<0?oVal*0x8000:oVal*0x7FFF;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar pos=Math.floor(idx1);\n\t\t\t\tidx1+=raiseStep;\n\t\t\t\tvar end=Math.floor(idx1);\n\t\t\t\n\t\t\t\t//简单的从prev平滑填充到cur,有效减少转换引入的杂音\n\t\t\t\tvar n=(oVal-prev)/(end-pos);\n\t\t\t\tfor(var j=1;pos<end;pos++,j++){\n\t\t\t\t\tvar s=Math.floor(prev+(j*n));\n\t\t\t\t\tif(F){//IIRFilter代码内置,比函数调用快4倍\n\t\t\t\t\t\tFx=s;\n\t\t\t\t\t\tFy=F.b0 * Fx + F.b1 * F.x1 + F.b0 * F.x2 - F.a1 * F.y1 - F.a2 * F.y2;\n\t\t\t\t\t\tF.x2 = F.x1; F.x1 = Fx; F.y2 = F.y1; F.y1 = Fy;\n\t\t\t\t\t\ts=Fy;\n\t\t\t\t\t}else{ s=filterFn?filterFn(s):s; }\n\t\t\t\t\t\n\t\t\t\t\tif(s>0x7FFF) s=0x7FFF; else if(s<-0x8000) s=-0x8000; //Int16越界处理\n\t\t\t\t\tif(useSum) _sum+=Math.abs(s);\n\t\t\t\t\tres[pos]=s;\n\t\t\t\t\tidx++;\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tprev=raisePrev=oVal;\n\t\t\t\ti+=raiseStep;//插值\n\t\t\t}\n\t\t\toffset=i%1;\n\t\t\tcontinue;\n\t\t};\n\t\t//降低采样率或不变\n\t\tfor(var i0=0,i2=0;i0<il;i0++,i2++){\n\t\t\tif(i2<il){\n\t\t\t\tvar oVal=o[i2];\n\t\t\t\tif(isF32){//floatTo16BitPCM \n\t\t\t\t\toVal=Math.max(-1,Math.min(1,oVal));\n\t\t\t\t\toVal=oVal<0?oVal*0x8000:oVal*0x7FFF;\n\t\t\t\t}\n\t\t\t\tif(F){//IIRFilter代码内置,比函数调用快4倍\n\t\t\t\t\tFx=oVal;\n\t\t\t\t\tFy=F.b0 * Fx + F.b1 * F.x1 + F.b0 * F.x2 - F.a1 * F.y1 - F.a2 * F.y2;\n\t\t\t\t\tF.x2 = F.x1; F.x1 = Fx; F.y2 = F.y1; F.y1 = Fy;\n\t\t\t\t}else{ Fy=filterFn?filterFn(oVal):oVal; }\n\t\t\t}\n\t\t\tF1=F2; F2=Fy;\n\t\t\tif(i2==0){ i0--; continue; } //首次只计算o[0]\n\t\t\t\n\t\t\t//https://www.cnblogs.com/xiaoqi/p/6993912.html\n\t\t\t//当前点=当前点+到后面一个点之间的增量,音质比直接简单抽样好些\n\t\t\tvar before = Math.floor(i);\n\t\t\tif(i0!=before)continue;\n\t\t\tvar after = Math.ceil(i);\n\t\t\tvar atPoint = i - before;\n\t\t\t\n\t\t\tvar beforeVal=F1;\n\t\t\tvar afterVal=after<il ? F2 : beforeVal; //后个点越界了,忽略不计\n\t\t\tvar val=beforeVal+(afterVal-beforeVal)*atPoint;\n\t\t\t\n\t\t\tif(val>0x7FFF) val=0x7FFF; else if(val<-0x8000) val=-0x8000; //Int16越界处理\n\t\t\tif(useSum) _sum+=Math.abs(val);\n\t\t\tres[idx]=val;\n\t\t\t\n\t\t\tidx++;\n\t\t\ti+=step;//抽样\n\t\t};\n\t\toffset=Math.max(0, i-il); //不太可能出现负数\n\t};\n\tif(step<1 && idx+1==size){ //提升采样率时可能缺1个,直接删除结尾1个\n\t\tsize--; res=new Int16Array(res.buffer.slice(0, size*2));\n\t};\n\tif(idx-1!=size && idx!=size)CLog(Txt+\" idx:\"+idx+\" != size:\"+size,3); //越界1个\n\t\n\t//帧处理\n\tframeNext=null;\n\tvar frameNextSize=size%frameSize;\n\tif(frameNextSize>0){\n\t\tvar u8Pos=(size-frameNextSize)*2;\n\t\tframeNext=new Int16Array(res.buffer.slice(u8Pos));\n\t\tres=new Int16Array(res.buffer.slice(0,u8Pos));\n\t};\n\t\n\tvar obj={\n\t\tindex:index\n\t\t,offset:offset\n\t\t,raisePrev:raisePrev\n\t\t,filter:filter\n\t\t\n\t\t,frameNext:frameNext\n\t\t,sampleRate:newSampleRate\n\t\t,data:res\n\t};\n\tif(useSum) obj._sum=_sum;\n\treturn obj;\n};\n\n/*IIR低通、高通滤波,移植自:https://gitee.com/52jian/digital-audio-filter AudioFilter.java\n\tuseLowPass: true或false,true为低通滤波,false为高通滤波\n\tsampleRate: 待处理pcm的采样率\n\tfreq: 截止频率Hz,最大频率为sampleRate/2,低通时会切掉高于此频率的声音,高通时会切掉低于此频率的声音,注意滤波并非100%的切掉不需要的声音,而是减弱频率对应的声音,离截止频率越远对应声音减弱越厉害,离截止频率越近声音就几乎无衰减\n\t返回的是一个函数,用此函数对pcm的每个采样值按顺序进行处理即可(不同pcm不可共用);注意此函数返回值可能会越界超过Int16范围,自行限制一下即可:Math.min(Math.max(val,-0x8000),0x7FFF)\n可重新赋值一个函数,来改变Recorder的默认行为,比如SampleData中的低通滤波*/\nRecorder.IIRFilter=function(useLowPass, sampleRate, freq){\n\tvar ov = 2 * Math.PI * freq / sampleRate;\n\tvar sn = Math.sin(ov);\n\tvar cs = Math.cos(ov);\n\tvar alpha = sn / 2;\n\t\n\tvar a0 = 1 + alpha;\n\tvar a1 = (-2 * cs) / a0;\n\tvar a2 = (1 - alpha) / a0;\n\tif(useLowPass){\n\t\tvar b0 = (1 - cs) / 2 / a0;\n\t\tvar b1 = (1 - cs) / a0;\n\t}else{\n\t\tvar b0 = (1 + cs) / 2 / a0;\n\t\tvar b1 = -(1 + cs) / a0;\n\t}\n\t\n\tvar x1=0,x2=0,y=0,y1=0,y2=0;\n\tvar fn=function(x){\n\t\ty = b0 * x + b1 * x1 + b0 * x2 - a1 * y1 - a2 * y2;\n\t\tx2 = x1; x1 = x;\n\t\ty2 = y1; y1 = y;\n\t\treturn y;\n\t};\n\tfn.Embed={x1:0,x2:0,y1:0,y2:0,b0:b0,b1:b1,a1:a1,a2:a2};\n\treturn fn;\n};\n\n\n/*计算音量百分比的一个方法\npcmAbsSum: pcm Int16所有采样的绝对值的和\npcmLength: pcm长度\n返回值:0-100,主要当做百分比用\n注意:这个不是分贝,因此没用volume当做名称*/\nRecorder.PowerLevel=function(pcmAbsSum,pcmLength){\n\t/*计算音量 https://blog.csdn.net/jody1989/article/details/73480259\n\t更高灵敏度算法:\n\t\t限定最大感应值10000\n\t\t\t线性曲线:低音量不友好\n\t\t\t\tpower/10000*100 \n\t\t\t对数曲线:低音量友好,但需限定最低感应值\n\t\t\t\t(1+Math.log10(power/10000))*100\n\t*/\n\tvar power=(pcmAbsSum/pcmLength) || 0;//NaN\n\tvar level;\n\tif(power<1251){//1250的结果10%,更小的音量采用线性取值\n\t\tlevel=Math.round(power/1250*10);\n\t}else{\n\t\tlevel=Math.round(Math.min(100,Math.max(0,(1+Math.log(power/10000)/Math.log(10))*100)));\n\t};\n\treturn level;\n};\n\n/*计算音量,单位dBFS(满刻度相对电平)\nmaxSample: 为16位pcm采样的绝对值中最大的一个(计算峰值音量),或者为pcm中所有采样的绝对值的平局值\n返回值:-100~0 (最大值0dB,最小值-100代替-∞)\n*/\nRecorder.PowerDBFS=function(maxSample){\n\tvar val=Math.max(0.1, maxSample||0),Pref=0x7FFF;\n\tval=Math.min(val,Pref);\n\t//https://www.logiclocmusic.com/can-you-tell-the-decibel/\n\t//https://blog.csdn.net/qq_17256689/article/details/120442510\n\tval=20*Math.log(val/Pref)/Math.log(10);\n\treturn Math.max(-100,Math.round(val));\n};\n\n\n\n\n//带时间的日志输出,可设为一个空函数来屏蔽日志输出\n//CLog(msg,errOrLogMsg, logMsg...) err为数字时代表日志类型1:error 2:log默认 3:warn,否则当做内容输出,第一个参数不能是对象因为要拼接时间,后面可以接无数个输出参数\nRecorder.CLog=function(msg,err){\n\tif(typeof console!=\"object\")return;\n\tvar now=new Date();\n\tvar t=(\"0\"+now.getMinutes()).substr(-2)\n\t\t+\":\"+(\"0\"+now.getSeconds()).substr(-2)\n\t\t+\".\"+(\"00\"+now.getMilliseconds()).substr(-3);\n\tvar recID=this&&this.envIn&&this.envCheck&&this.id;\n\tvar arr=[\"[\"+t+\" \"+RecTxt+(recID?\":\"+recID:\"\")+\"]\"+msg];\n\tvar a=arguments,cwe=Recorder.CLog;\n\tvar i=2,fn=cwe.log||console.log;\n\tif(IsNum(err)){\n\t\tfn=err==1?cwe.error||console.error:err==3?cwe.warn||console.warn:fn;\n\t}else{\n\t\ti=1;\n\t};\n\tfor(;i<a.length;i++){\n\t\tarr.push(a[i]);\n\t};\n\tif(IsLoser){//古董浏览器,仅保证基本的可执行不代码异常\n\t\tfn&&fn(\"[IsLoser]\"+arr[0],arr.length>1?arr:\"\");\n\t}else{\n\t\tfn.apply(console,arr);\n\t};\n};\nvar CLog=function(){ Recorder.CLog.apply(this,arguments); };\nvar IsLoser=true;try{IsLoser=!console.log.apply;}catch(e){};\n\n\n\n\nvar ID=0;\nfunction initFn(set){\n\tvar This=this; This.id=++ID;\n\t\n\t//如果开启了流量统计,这里将发送一个图片请求\n\tTraffic();\n\t\n\t\n\tvar o={\n\t\ttype:\"mp3\" //输出类型:mp3,wav,wav输出文件尺寸超大不推荐使用,但mp3编码支持会导致js文件超大,如果不需支持mp3可以使js文件大幅减小\n\t\t//,bitRate:16 //比特率 wav:16或8位,MP3:8kbps 1k/s,8kbps 2k/s 录音文件很小\n\t\t\n\t\t//,sampleRate:16000 //采样率,wav格式大小=sampleRate*时间;mp3此项对低比特率有影响,高比特率几乎无影响。\n\t\t\t\t\t//wav任意值,mp3取值范围:48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000\n\t\t\t\t\t//采样率参考https://www.cnblogs.com/devin87/p/mp3-recorder.html\n\t\t\n\t\t,onProcess:NOOP //fn(buffers,powerLevel,bufferDuration,bufferSampleRate,newBufferIdx,asyncEnd) buffers=[[Int16,...],...]:缓冲的PCM数据,为从开始录音到现在的所有pcm片段;powerLevel:当前缓冲的音量级别0-100,bufferDuration:已缓冲时长,bufferSampleRate:缓冲使用的采样率(当type支持边录边转码(Worker)时,此采样率和设置的采样率相同,否则不一定相同);newBufferIdx:本次回调新增的buffer起始索引;asyncEnd:fn() 如果onProcess是异步的(返回值为true时),处理完成时需要调用此回调,如果不是异步的请忽略此参数,此方法回调时必须是真异步(不能真异步时需用setTimeout包裹)。onProcess返回值:如果返回true代表开启异步模式,在某些大量运算的场合异步是必须的,必须在异步处理完成时调用asyncEnd(不能真异步时需用setTimeout包裹),在onProcess执行后新增的buffer会全部替换成空数组,因此本回调开头应立即将newBufferIdx到本次回调结尾位置的buffer全部保存到另外一个数组内,处理完成后写回buffers中本次回调的结尾位置。\n\t\t\n\t\t//*******高级设置******\n\t\t//,sourceStream:MediaStream Object\n\t\t\t\t//可选直接提供一个媒体流,从这个流中录制、实时处理音频数据(当前Recorder实例独享此流);不提供时为普通的麦克风录音,由getUserMedia提供音频流(所有Recorder实例共享同一个流)\n\t\t\t\t//比如:audio、video标签dom节点的captureStream方法(实验特性,不同浏览器支持程度不高)返回的流;WebRTC中的remote流;自己创建的流等\n\t\t\t\t//注意:流内必须至少存在一条音轨(Audio Track),比如audio标签必须等待到可以开始播放后才会有音轨,否则open会失败\n\t\t\n\t\t//,runningContext:AudioContext\n\t\t\t\t//可选提供一个state为running状态的AudioContext对象(ctx);默认会在rec.open时自动创建一个新的ctx,无用户操作(触摸、点击等)时调用rec.open的ctx.state可能为suspended,会在rec.start时尝试进行ctx.resume,如果也无用户操作ctx.resume可能不会恢复成running状态(目前仅iOS上有此兼容性问题),导致无法去读取媒体流,这时请提前在用户操作时调用Recorder.GetContext(true)来得到一个running状态AudioContext(用完需调用CloseNewCtx(ctx)关闭)\n\t\t\n\t\t//,audioTrackSet:{ deviceId:\"\",groupId:\"\", autoGainControl:true, echoCancellation:true, noiseSuppression:true }\n\t\t\t\t//普通麦克风录音时getUserMedia方法的audio配置参数,比如指定设备id,回声消除、降噪开关;注意:提供的任何配置值都不一定会生效\n\t\t\t\t//由于麦克风是全局共享的,所以新配置后需要close掉以前的再重新open\n\t\t\t\t//同样可配置videoTrackSet,更多参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints\n\t\t\n\t\t//,disableEnvInFix:false 内部参数,禁用设备卡顿时音频输入丢失补偿功能\n\t\t\n\t\t//,takeoffEncodeChunk:NOOP //fn(chunkBytes) chunkBytes=[Uint8,...]:实时编码环境下接管编码器输出,当编码器实时编码出一块有效的二进制音频数据时实时回调此方法;参数为二进制的Uint8Array,就是编码出来的音频数据片段,所有的chunkBytes拼接在一起即为完整音频。本实现的想法最初由QQ2543775048提出\n\t\t\t\t//当提供此回调方法时,将接管编码器的数据输出,编码器内部将放弃存储生成的音频数据;如果当前编码器或环境不支持实时编码处理,将在open时直接走fail逻辑\n\t\t\t\t//因此提供此回调后调用stop方法将无法获得有效的音频数据,因为编码器内没有音频数据,因此stop时返回的blob将是一个字节长度为0的blob\n\t\t\t\t//大部分录音格式编码器都支持实时编码(边录边转码),比如mp3格式:会实时的将编码出来的mp3片段通过此方法回调,所有的chunkBytes拼接到一起即为完整的mp3,此种拼接的结果比mock方法实时生成的音质更加,因为天然避免了首尾的静默\n\t\t\t\t//不支持实时编码的录音格式不可以提供此回调(wav格式不支持,因为wav文件头中需要提供文件最终长度),提供了将在open时直接走fail逻辑\n\t};\n\t\n\tfor(var k in set){\n\t\to[k]=set[k];\n\t};\n\tThis.set=o;\n\t\n\tvar vB=o[bitRateTxt],vS=o[sampleRateTxt]; //校验配置参数\n\tif(vB&&!IsNum(vB) || vS&&!IsNum(vS)){\n\t\tThis.CLog($T.G(\"IllegalArgs-1\",[$T(\"VtS4::{1}和{2}必须是数值\",0,sampleRateTxt,bitRateTxt)]),1,set);\n\t};\n\to[bitRateTxt]=+vB||16;\n\to[sampleRateTxt]=+vS||16000;\n\t\n\tThis.state=0;//运行状态,0未录音 1录音中 2暂停 3等待ctx激活\n\tThis._S=9;//stop同步锁,stop可以阻止open过程中还未运行的start\n\tThis.Sync={O:9,C:9};//和Recorder.Sync一致,只不过这个是非全局的,仅用来简化代码逻辑,无实际作用\n};\n//同步锁,控制对Stream的竞争;用于close时中断异步的open;一个对象open如果变化了都要阻止close,Stream的控制权交个新的对象\nRecorder.Sync={/*open*/O:9,/*close*/C:9};\n\nRecorder.prototype=initFn.prototype={\n\tCLog:CLog\n\t\n\t//流相关的数据存储在哪个对象里面;如果提供了sourceStream,数据直接存储在当前对象中,否则存储在全局\n\t,_streamStore:function(){\n\t\tif(this.set.sourceStream){\n\t\t\treturn this;\n\t\t}else{\n\t\t\treturn Recorder;\n\t\t}\n\t}\n\t//当前实例用到的Stream,可能是全局的,也可能是独享的\n\t,_streamGet:function(){\n\t\treturn this._streamStore().Stream;\n\t}\n\t//当前实例用到的AudioContext,可能是全局的,也可能是独享的\n\t,_streamCtx:function(){\n\t\tvar m=this._streamGet();\n\t\treturn m&&m._c;\n\t}\n\t\n\t//打开录音资源True(),False(msg,isUserNotAllow),需要调用close。注意:此方法是异步的;一般使用时打开,用完立即关闭;可重复调用,可用来测试是否能录音;open和start至少有一个应当在用户操作(触摸、点击等)下进行调用,原因参考runningContext配置\n\t,open:function(True,False){\n\t\tvar This=this,set=This.set,streamStore=This._streamStore(),newCtx=0;\n\t\tTrue=True||NOOP;\n\t\tvar failCall=function(errMsg,isUserNotAllow){\n\t\t\tisUserNotAllow=!!isUserNotAllow;\n\t\t\tThis.CLog($T(\"5tWi::录音open失败:\")+errMsg+\",isUserNotAllow:\"+isUserNotAllow,1);\n\t\t\tif(newCtx)Recorder.CloseNewCtx(newCtx);\n\t\t\tFalse&&False(errMsg,isUserNotAllow);\n\t\t};\n\t\t\n\t\tThis._streamTag=getUserMediaTxt;\n\t\tvar ok=function(){\n\t\t\tThis.CLog(\"open ok, id:\"+This.id+\" stream:\"+This._streamTag);\n\t\t\tTrue();\n\t\t\t\n\t\t\tThis._SO=0;//解除stop对open中的start调用的阻止\n\t\t};\n\t\t\n\t\t\n\t\t//同步锁\n\t\tvar Lock=streamStore.Sync;\n\t\tvar lockOpen=++Lock.O,lockClose=Lock.C;\n\t\tThis._O=This._O_=lockOpen;//记住当前的open,如果变化了要阻止close,这里假定了新对象已取代当前对象并且不再使用\n\t\tThis._SO=This._S;//记住open过程中的stop,中途任何stop调用后都不能继续open中的start\n\t\tvar lockFail=function(){\n\t\t\t//允许多次open,但不允许任何一次close,或者自身已经调用了关闭\n\t\t\tif(lockClose!=Lock.C || !This._O){\n\t\t\t\tvar err=$T(\"dFm8::open被取消\");\n\t\t\t\tif(lockOpen==Lock.O){\n\t\t\t\t\t//无新的open,已经调用了close进行取消,此处应让上次的close明确生效\n\t\t\t\t\tThis.close();\n\t\t\t\t}else{\n\t\t\t\t\terr=$T(\"VtJO::open被中断\");\n\t\t\t\t};\n\t\t\t\tfailCall(err);\n\t\t\t\treturn true;\n\t\t\t};\n\t\t};\n\t\t\n\t\t//环境配置检查\n\t\tif(!isBrowser){\n\t\t\tfailCall($T.G(\"NonBrowser-1\",[\"open\"])+$T(\"EMJq::,可尝试使用RecordApp解决方案\")+\"(\"+GitUrl+\"/tree/master/app-support-sample)\");\n\t\t\treturn;\n\t\t};\n\t\tvar checkMsg=This.envCheck({envName:\"H5\",canProcess:true});\n\t\tif(checkMsg){\n\t\t\tfailCall($T(\"A5bm::不能录音:\")+checkMsg);\n\t\t\treturn;\n\t\t};\n\t\t\n\t\t//尽量先创建好ctx,不然异步下创建可能不是running状态\n\t\tvar ctx;\n\t\tvar getCtx=function(){\n\t\t\tctx=set.runningContext;\n\t\t\tif(!ctx)ctx=newCtx=Recorder.GetContext(true); //2023-06 尽量创建新的ctx,免得Safari再次连接无回调\n\t\t};\n\t\t\n\t\t//***********已直接提供了音频流************\n\t\tif(set.sourceStream){\n\t\t\tThis._streamTag=\"set.sourceStream\";\n\t\t\tif(!Recorder.GetContext()){\n\t\t\t\tfailCall($T(\"1iU7::不支持此浏览器从流中获取录音\"));\n\t\t\t\treturn;\n\t\t\t};\n\t\t\tgetCtx();\n\t\t\t\n\t\t\tDisconnect(streamStore);//可能已open过,直接先尝试断开\n\t\t\tvar stream=This.Stream=set.sourceStream;\n\t\t\tstream._c=ctx;\n\t\t\tstream._RC=set.runningContext;\n\t\t\tstream._call={};\n\t\t\t\n\t\t\ttry{\n\t\t\t\tConnect(streamStore);\n\t\t\t}catch(e){\n\t\t\t\tDisconnect(streamStore);\n\t\t\t\tfailCall($T(\"BTW2::从流中打开录音失败:\")+e.message);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tok();\n\t\t\treturn;\n\t\t};\n\t\t\n\t\t\n\t\t//***********打开麦克风得到全局的音频流************\n\t\tvar codeFail=function(code,msg){\n\t\t\ttry{//跨域的优先检测一下\n\t\t\t\twindow.top.a;\n\t\t\t}catch(e){\n\t\t\t\tfailCall($T(\"Nclz::无权录音(跨域,请尝试给iframe添加麦克风访问策略,如{1})\",0,'allow=\"camera;microphone\"'));\n\t\t\t\treturn;\n\t\t\t};\n\t\t\t\n\t\t\tif(codeErr1(1,code)){\n\t\t\t\tif(/Found/i.test(code)){//可能是非安全环境导致的没有设备\n\t\t\t\t\tfailCall(msg+$T(\"jBa9::,无可用麦克风\"));\n\t\t\t\t}else{\n\t\t\t\t\tfailCall(msg);\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t\tvar codeErr1=function(call,code){ //排除几个明确原因的错误\n\t\t\tif(/Permission|Allow/i.test(code)){\n\t\t\t\tif(call) failCall($T(\"gyO5::用户拒绝了录音权限\"),true);\n\t\t\t}else if(window.isSecureContext===false){\n\t\t\t\tif(call) failCall($T(\"oWNo::浏览器禁止不安全页面录音,可开启https解决\"));\n\t\t\t}else{\n\t\t\t\treturn 1;\n\t\t\t};\n\t\t};\n\t\t\n\t\t\n\t\t//如果已打开并且有效就不要再打开了\n\t\tif(Recorder.IsOpen()){\n\t\t\tok();\n\t\t\treturn;\n\t\t};\n\t\tif(!Recorder.Support()){\n\t\t\tcodeFail(\"\",$T(\"COxc::此浏览器不支持录音\"));\n\t\t\treturn;\n\t\t};\n\t\tgetCtx();\n\t\t\n\t\t//请求权限,如果从未授权,一般浏览器会弹出权限请求弹框\n\t\tvar f1=function(stream){ //请求成功回调\n\t\t\t//https://github.com/xiangyuecn/Recorder/issues/14 获取到的track.readyState!=\"live\",刚刚回调时可能是正常的,但过一下可能就被关掉了,原因不明。延迟一下保证真异步。对正常浏览器不影响\n\t\t\tsetTimeout(function(){\n\t\t\t\tstream._call={};\n\t\t\t\tvar oldStream=Recorder.Stream;\n\t\t\t\tif(oldStream){\n\t\t\t\t\tDisconnect(); //直接断开已存在的,旧的Connect未完成会自动终止\n\t\t\t\t\tstream._call=oldStream._call;\n\t\t\t\t};\n\t\t\t\tRecorder.Stream=stream;\n\t\t\t\tstream._c=ctx;\n\t\t\t\tstream._RC=set.runningContext;\n\t\t\t\tif(lockFail())return;\n\t\t\t\t\n\t\t\t\tif(Recorder.IsOpen()){\n\t\t\t\t\tif(oldStream)This.CLog($T(\"upb8::发现同时多次调用open\"),1);\n\t\t\t\t\t\n\t\t\t\t\tConnect(streamStore);\n\t\t\t\t\tok(); //只连接,因为AudioContext不一定在运行,无法知道是否有数据回调\n\t\t\t\t}else{\n\t\t\t\t\tfailCall($T(\"Q1GA::录音功能无效:无音频流\"));\n\t\t\t\t};\n\t\t\t},100);\n\t\t};\n\t\tvar f2=function(e){ //请求失败回调\n\t\t\tvar code=e.name||e.message||e.code+\":\"+e;\n\t\t\tvar tryMsg=\"\";\n\t\t\tif(callUmCount==1 && codeErr1(0,code)){ \n\t\t\t\ttryMsg=$T(\"KxE2::,将尝试禁用回声消除后重试\");\n\t\t\t}\n\t\t\tThis.CLog($T(\"xEQR::请求录音权限错误\")+tryMsg+\"|\"+e,tryMsg?3:1,e);\n\t\t\t\n\t\t\tif(tryMsg){//重试\n\t\t\t\tcallUserMedia(1);\n\t\t\t}else{\n\t\t\t\tcodeFail(code,$T(\"bDOG::无法录音:\")+e);\n\t\t\t};\n\t\t};\n\t\t\n\t\tvar callUmCount=0;\n\t\tvar callUserMedia=function(retry){\n\t\t\tcallUmCount++;\n\t\t\tvar atsTxt=\"audioTrackSet\";\n\t\t\tvar t_AGC=\"autoGainControl\",t_AEC=\"echoCancellation\",t_ANS=\"noiseSuppression\";\n\t\t\tvar atsTxtJs=atsTxt+\":{\"+t_AEC+\",\"+t_ANS+\",\"+t_AGC+\"}\";\n\t\t\tvar trackSet=JSON.parse(ToJson(set[atsTxt]||true)); //true 跟 {} 兼容性?\n\t\t\tThis.CLog(\"open... \"+callUmCount+\" \"+atsTxt+\":\"+ToJson(trackSet));\n\t\t\t\n\t\t\tif(retry){ //回声消除有些浏览器可能导致无法打开录音,尝试明确禁用来保证能最基础的录\n\t\t\t\tif(typeof(trackSet)!=\"object\")trackSet={}; //默认true\n\t\t\t\ttrackSet[t_AGC]=false;\n\t\t\t\ttrackSet[t_AEC]=false;\n\t\t\t\ttrackSet[t_ANS]=false;\n\t\t\t};\n\t\t\t//这里指明采样率,虽然可以解决手机上MediaRecorder采样率16k的问题,是回声消除导致的只能获取到16k的流,禁用回声消除可恢复48k。(issues#230)而且会导致乱用音频输入设备,MediaStreamTrack的applyConstraints也无法修改采样率\n\t\t\t//trackSet[sampleRateTxt]=ctx[sampleRateTxt];\n\t\t\tif(trackSet[sampleRateTxt]){\n\t\t\t\tThis.CLog($T(\"IjL3::注意:已配置{1}参数,可能会出现浏览器不能正确选用麦克风、移动端无法启用回声消除等现象\",0,atsTxt+\".\"+sampleRateTxt),3);\n\t\t\t};\n\t\t\t\n\t\t\tvar mSet={audio:trackSet, video:set.videoTrackSet||false};\n\t\t\ttry{\n\t\t\t\tvar pro=Recorder.Scope[getUserMediaTxt](mSet,f1,f2);\n\t\t\t}catch(e){//不能设置trackSet就算了\n\t\t\t\tThis.CLog(getUserMediaTxt,3,e);\n\t\t\t\tmSet={audio:true, video:false};\n\t\t\t\tpro=Recorder.Scope[getUserMediaTxt](mSet,f1,f2);\n\t\t\t};\n\t\t\tThis.CLog(getUserMediaTxt+\"(\"+ToJson(mSet)+\") \"+CtxState(ctx)\n\t\t\t\t+$T(\"RiWe::,未配置 {1} 时浏览器可能会自动启用回声消除,移动端未禁用回声消除时可能会降低系统播放音量(关闭录音后可恢复)和仅提供16k采样率的音频流(不需要回声消除时可明确配置成禁用来获得48k高音质的流),请参阅文档中{2}配置\",0,atsTxtJs,atsTxt)\n\t\t\t\t+\"(\"+GitUrl+\") LM:\"+LM+\" UA:\"+navigator.userAgent);\n\t\t\tif(pro&&pro.then){\n\t\t\t\tpro.then(f1)[CatchTxt](f2); //fix 关键字,保证catch压缩时保持字符串形式\n\t\t\t};\n\t\t};\n\t\tcallUserMedia();\n\t}\n\t//关闭释放录音资源\n\t,close:function(call){\n\t\tcall=call||NOOP;\n\t\t\n\t\tvar This=this,streamStore=This._streamStore();\n\t\tThis._stop();\n\t\tvar sTag=\" stream:\"+This._streamTag;\n\t\t\n\t\tvar Lock=streamStore.Sync;\n\t\tThis._O=0;\n\t\tif(This._O_!=Lock.O){\n\t\t\t//唯一资源Stream的控制权已交给新对象,这里不能关闭。此处在每次都弹权限的浏览器内可能存在泄漏,新对象被拒绝权限可能不会调用close,忽略这种不处理\n\t\t\tThis.CLog($T(\"hWVz::close被忽略(因为同时open了多个rec,只有最后一个会真正close)\")+sTag,3);\n\t\t\tcall();\n\t\t\treturn;\n\t\t};\n\t\tLock.C++;//获得控制权\n\t\t\n\t\tDisconnect(streamStore);\n\t\t\n\t\tThis.CLog(\"close,\"+sTag);\n\t\tcall();\n\t}\n\t\n\t\n\t\n\t\n\t\n\t/*模拟一段录音数据,后面可以调用stop进行编码,需提供pcm数据[1,2,3...],pcm的采样率*/\n\t,mock:function(pcmData,pcmSampleRate){\n\t\tvar This=this;\n\t\tThis._stop();//清理掉已有的资源\n\t\t\n\t\tThis.isMock=1;\n\t\tThis.mockEnvInfo=null;\n\t\tThis.buffers=[pcmData];\n\t\tThis.recSize=pcmData.length;\n\t\tThis._setSrcSR(pcmSampleRate);\n\t\tThis._streamTag=\"mock\";\n\t\treturn This;\n\t}\n\t,_setSrcSR:function(sampleRate){\n\t\tvar This=this,set=This.set;\n\t\tvar setSr=set[sampleRateTxt];\n\t\tif(setSr>sampleRate){\n\t\t\tset[sampleRateTxt]=sampleRate;\n\t\t}else{ setSr=0 }\n\t\tThis[srcSampleRateTxt]=sampleRate;\n\t\tThis.CLog(srcSampleRateTxt+\": \"+sampleRate+\" set.\"+sampleRateTxt+\": \"+set[sampleRateTxt]+(setSr?\" \"+$T(\"UHvm::忽略\")+\": \"+setSr:\"\"), setSr?3:0);\n\t}\n\t,envCheck:function(envInfo){//平台环境下的可用性检查,任何时候都可以调用检查,返回errMsg:\"\"正常,\"失败原因\"\n\t\t//envInfo={envName:\"H5\",canProcess:true}\n\t\tvar errMsg,This=this,set=This.set;\n\t\t\n\t\t//检测CPU的数字字节序,TypedArray字节序是个迷,直接拒绝罕见的大端模式,因为找不到这种CPU进行测试\n\t\tvar tag=\"CPU_BE\";\n\t\tif(!errMsg && !Recorder[tag] && typeof Int8Array==\"function\" && !new Int8Array(new Int32Array([1]).buffer)[0]){\n\t\t\tTraffic(tag); //如果开启了流量统计,这里将发送一个图片请求\n\t\t\terrMsg=$T(\"Essp::不支持{1}架构\",0,tag);\n\t\t};\n\t\t\n\t\t//编码器检查环境下配置是否可用\n\t\tif(!errMsg){\n\t\t\tvar type=set.type,hasFn=This[type+\"_envCheck\"];\n\t\t\tif(set.takeoffEncodeChunk){//需要实时编码返回数据,此时需要检查环境是否有实时特性、和是否可实时编码\n\t\t\t\tif(!hasFn){\n\t\t\t\t\terrMsg=$T(\"2XBl::{1}类型不支持设置takeoffEncodeChunk\",0,type)+(This[type]?\"\":$T(\"LG7e::(未加载编码器)\"));\n\t\t\t\t}else if(!envInfo.canProcess){\n\t\t\t\t\terrMsg=$T(\"7uMV::{1}环境不支持实时处理\",0,envInfo.envName);\n\t\t\t\t};\n\t\t\t};\n\t\t\t\n\t\t\tif(!errMsg && hasFn){//编码器已实现环境检查\n\t\t\t\terrMsg=This[type+\"_envCheck\"](envInfo,set);\n\t\t\t};\n\t\t};\n\t\t\n\t\treturn errMsg||\"\";\n\t}\n\t,envStart:function(mockEnvInfo,sampleRate){//平台环境相关的start调用\n\t\tvar This=this,set=This.set;\n\t\tThis.isMock=mockEnvInfo?1:0;//非H5环境需要启用mock,并提供envCheck需要的环境信息\n\t\tThis.mockEnvInfo=mockEnvInfo;\n\t\tThis.buffers=[];//数据缓冲\n\t\tThis.recSize=0;//数据大小\n\t\tif(mockEnvInfo){\n\t\t\tThis._streamTag=\"env$\"+mockEnvInfo.envName;\n\t\t};\n\t\t\n\t\tThis.state=1;//运行状态,0未录音 1录音中 2暂停 3等待ctx激活\n\t\tThis.envInLast=0;//envIn接收到最后录音内容的时间\n\t\tThis.envInFirst=0;//envIn接收到的首个录音内容的录制时间\n\t\tThis.envInFix=0;//补偿的总时间\n\t\tThis.envInFixTs=[];//补偿计数列表\n\t\t\n\t\t//engineCtx需要提前确定最终的采样率\n\t\tThis._setSrcSR(sampleRate);\n\t\t\n\t\tThis.engineCtx=0;\n\t\t//此类型有边录边转码(Worker)支持\n\t\tif(This[set.type+\"_start\"]){\n\t\t\tvar engineCtx=This.engineCtx=This[set.type+\"_start\"](set);\n\t\t\tif(engineCtx){\n\t\t\t\tengineCtx.pcmDatas=[];\n\t\t\t\tengineCtx.pcmSize=0;\n\t\t\t};\n\t\t};\n\t}\n\t,envResume:function(){//和平台环境无关的恢复录音\n\t\t//重新开始计数\n\t\tthis.envInFixTs=[];\n\t}\n\t,envIn:function(pcm,sum){//和平台环境无关的pcm[Int16]输入\n\t\tvar This=this,set=This.set,engineCtx=This.engineCtx;\n\t\tif(This.state!=1){\n\t\t\tif(!This.state)This.CLog(\"envIn at state=0\",3);\n\t\t\treturn;\n\t\t};\n\t\tvar bufferSampleRate=This[srcSampleRateTxt];\n\t\tvar size=pcm.length;\n\t\tvar powerLevel=Recorder.PowerLevel(sum,size);\n\t\t\n\t\tvar buffers=This.buffers;\n\t\tvar bufferFirstIdx=buffers.length;//之前的buffer都是经过onProcess处理好的,不允许再修改\n\t\tbuffers.push(pcm);\n\t\t\n\t\t//有engineCtx时会被覆盖,这里保存一份\n\t\tvar buffersThis=buffers;\n\t\tvar bufferFirstIdxThis=bufferFirstIdx;\n\t\t\n\t\t//卡顿丢失补偿:因为设备很卡的时候导致H5接收到的数据量不够造成播放时候变速,结果比实际的时长要短,此处保证了不会变短,但不能修复丢失的音频数据造成音质变差。当前算法采用输入时间侦测下一帧是否需要添加补偿帧,需要(6次输入||超过1秒)以上才会开始侦测,如果滑动窗口内丢失超过1/3就会进行补偿\n\t\tvar now=Date.now();\n\t\tvar pcmTime=Math.round(size/bufferSampleRate*1000);\n\t\tThis.envInLast=now;\n\t\tif(This.buffers.length==1){//记下首个录音数据的录制时间\n\t\t\tThis.envInFirst=now-pcmTime;\n\t\t};\n\t\tvar envInFixTs=This.envInFixTs;\n\t\tenvInFixTs.splice(0,0,{t:now,d:pcmTime});\n\t\t//保留3秒的计数滑动窗口,另外超过3秒的停顿不补偿\n\t\tvar tsInStart=now,tsPcm=0;\n\t\tfor(var i=0;i<envInFixTs.length;i++){\n\t\t\tvar o=envInFixTs[i];\n\t\t\tif(now-o.t>3000){\n\t\t\t\tenvInFixTs.length=i;\n\t\t\t\tbreak;\n\t\t\t};\n\t\t\ttsInStart=o.t;\n\t\t\ttsPcm+=o.d;\n\t\t};\n\t\t//达到需要的数据量,开始侦测是否需要补偿\n\t\tvar tsInPrev=envInFixTs[1];\n\t\tvar tsIn=now-tsInStart;\n\t\tvar lost=tsIn-tsPcm;\n\t\tif( lost>tsIn/3 && (tsInPrev&&tsIn>1000 || envInFixTs.length>=6) ){\n\t\t\t//丢失过多,开始执行补偿\n\t\t\tvar addTime=now-tsInPrev.t-pcmTime;//距离上次输入丢失这么多ms\n\t\t\tif(addTime>pcmTime/5){//丢失超过本帧的1/5\n\t\t\t\tvar fixOpen=!set.disableEnvInFix;\n\t\t\t\tThis.CLog(\"[\"+now+\"]\"+i18n.get(fixOpen?$T(\"4Kfd::补偿{1}ms\",1):$T(\"bM5i::未补偿{1}ms\",1),[addTime]),3);\n\t\t\t\tThis.envInFix+=addTime;\n\t\t\t\t\n\t\t\t\t//用静默进行补偿\n\t\t\t\tif(fixOpen){\n\t\t\t\t\tvar addPcm=new Int16Array(addTime*bufferSampleRate/1000);\n\t\t\t\t\tsize+=addPcm.length;\n\t\t\t\t\tbuffers.push(addPcm);\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t\t\n\t\t\n\t\tvar sizeOld=This.recSize,addSize=size;\n\t\tvar bufferSize=sizeOld+addSize;\n\t\tThis.recSize=bufferSize;//此值在onProcess后需要修正,可能新数据被修改\n\t\t\n\t\t\n\t\t//此类型有边录边转码(Worker)支持,开启实时转码\n\t\tif(engineCtx){\n\t\t\t//转换成set的采样率\n\t\t\tvar chunkInfo=Recorder.SampleData(buffers,bufferSampleRate,set[sampleRateTxt],engineCtx.chunkInfo);\n\t\t\tengineCtx.chunkInfo=chunkInfo;\n\t\t\t\n\t\t\tsizeOld=engineCtx.pcmSize;\n\t\t\taddSize=chunkInfo.data.length;\n\t\t\tbufferSize=sizeOld+addSize;\n\t\t\tengineCtx.pcmSize=bufferSize;//此值在onProcess后需要修正,可能新数据被修改\n\t\t\t\n\t\t\tbuffers=engineCtx.pcmDatas;\n\t\t\tbufferFirstIdx=buffers.length;\n\t\t\tbuffers.push(chunkInfo.data);\n\t\t\tbufferSampleRate=chunkInfo[sampleRateTxt];\n\t\t};\n\t\t\n\t\tvar duration=Math.round(bufferSize/bufferSampleRate*1000);\n\t\tvar bufferNextIdx=buffers.length;\n\t\tvar bufferNextIdxThis=buffersThis.length;\n\t\t\n\t\t//允许异步处理buffer数据\n\t\tvar asyncEnd=function(){\n\t\t\t//重新计算size,异步的早已减去添加的,同步的需去掉本次添加的然后重新计算\n\t\t\tvar num=asyncBegin?0:-addSize;\n\t\t\tvar hasClear=buffers[0]==null;\n\t\t\tfor(var i=bufferFirstIdx;i<bufferNextIdx;i++){\n\t\t\t\tvar buffer=buffers[i];\n\t\t\t\tif(buffer==null){//已被主动释放内存,比如长时间实时传输录音时\n\t\t\t\t\thasClear=1;\n\t\t\t\t}else{\n\t\t\t\t\tnum+=buffer.length;\n\t\t\t\t\t\n\t\t\t\t\t//推入后台边录边转码\n\t\t\t\t\tif(engineCtx&&buffer.length){\n\t\t\t\t\t\tThis[set.type+\"_encode\"](engineCtx,buffer);\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\t\n\t\t\t//同步清理This.buffers,不管buffers到底清了多少个,buffersThis是使用不到的进行全清\n\t\t\tif(hasClear && engineCtx){\n\t\t\t\tvar i=bufferFirstIdxThis;\n\t\t\t\tif(buffersThis[0]){\n\t\t\t\t\ti=0;\n\t\t\t\t};\n\t\t\t\tfor(;i<bufferNextIdxThis;i++){\n\t\t\t\t\tbuffersThis[i]=null;\n\t\t\t\t};\n\t\t\t};\n\t\t\t\n\t\t\t//统计修改后的size,如果异步发生clear要原样加回来,同步的无需操作\n\t\t\tif(hasClear){\n\t\t\t\tnum=asyncBegin?addSize:0;\n\t\t\t\t\n\t\t\t\tbuffers[0]=null;//彻底被清理\n\t\t\t};\n\t\t\tif(engineCtx){\n\t\t\t\tengineCtx.pcmSize+=num;\n\t\t\t}else{\n\t\t\t\tThis.recSize+=num;\n\t\t\t};\n\t\t};\n\t\t//实时回调处理数据,允许修改或替换上次回调以来新增的数据 ,但是不允许修改已处理过的,不允许增删第一维数组 ,允许将第二维数组任意修改替换成空数组也可以\n\t\tvar asyncBegin=0,procTxt=\"rec.set.onProcess\";\n\t\ttry{\n\t\t\tasyncBegin=set.onProcess(buffers,powerLevel,duration,bufferSampleRate,bufferFirstIdx,asyncEnd);\n\t\t}catch(e){\n\t\t\t//此错误显示不要用CLog,这样控制台内相同内容不会重复打印\n\t\t\tconsole.error(procTxt+$T(\"gFUF::回调出错是不允许的,需保证不会抛异常\"),e);\n\t\t};\n\t\t\n\t\tvar slowT=Date.now()-now;\n\t\tif(slowT>10 && This.envInFirst-now>1000){ //1秒后开始onProcess性能监测\n\t\t\tThis.CLog(procTxt+$T(\"2ghS::低性能,耗时{1}ms\",0,slowT),3);\n\t\t};\n\t\t\n\t\tif(asyncBegin===true){\n\t\t\t//开启了异步模式,onProcess已接管buffers新数据,立即清空,避免出现未处理的数据\n\t\t\tvar hasClear=0;\n\t\t\tfor(var i=bufferFirstIdx;i<bufferNextIdx;i++){\n\t\t\t\tif(buffers[i]==null){//已被主动释放内存,比如长时间实时传输录音时 ,但又要开启异步模式,此种情况是非法的\n\t\t\t\t\thasClear=1;\n\t\t\t\t}else{\n\t\t\t\t\tbuffers[i]=new Int16Array(0);\n\t\t\t\t};\n\t\t\t};\n\t\t\t\n\t\t\tif(hasClear){\n\t\t\t\tThis.CLog($T(\"ufqH::未进入异步前不能清除buffers\"),3);\n\t\t\t}else{\n\t\t\t\t//还原size,异步结束后再统计仅修改后的size,如果发生clear要原样加回来\n\t\t\t\tif(engineCtx){\n\t\t\t\t\tengineCtx.pcmSize-=addSize;\n\t\t\t\t}else{\n\t\t\t\t\tThis.recSize-=addSize;\n\t\t\t\t};\n\t\t\t};\n\t\t}else{\n\t\t\tasyncEnd();\n\t\t};\n\t}\n\t\n\t\n\t\n\t\n\t//开始录音,需先调用open;只要open成功时,调用此方法是安全的,如果未open强行调用导致的内部错误将不会有任何提示,stop时自然能得到错误;注意:open和start至少有一个应当在用户操作(触摸、点击等)下进行调用,原因参考runningContext配置\n\t,start:function(){\n\t\tvar This=this;\n\t\t\n\t\tvar isOpen=1;\n\t\tif(This.set.sourceStream){//直接提供了流,仅判断是否调用了open\n\t\t\tif(!This.Stream){\n\t\t\t\tisOpen=0;\n\t\t\t}\n\t\t}else if(!Recorder.IsOpen()){//监测全局麦克风是否打开并且有效\n\t\t\tisOpen=0;\n\t\t};\n\t\tif(!isOpen){\n\t\t\tThis.CLog($T(\"6WmN::start失败:未open\"),1);\n\t\t\treturn;\n\t\t};\n\t\tvar ctx=This._streamCtx();\n\t\tThis.CLog($T(\"kLDN::start 开始录音,\")+CtxState(ctx)+\" stream:\"+This._streamTag);\n\t\t\n\t\tThis._stop();\n\t\tThis.envStart(null, ctx[sampleRateTxt]);\n\t\tThis.state=3;//0未录音 1录音中 2暂停 3等待ctx激活\n\t\t\n\t\t//检查open过程中stop是否已经调用过\n\t\tif(This._SO&&This._SO+1!=This._S){//上面调用过一次 _stop\n\t\t\t//open未完成就调用了stop,此种情况终止start。也应尽量避免出现此情况\n\t\t\tThis.CLog($T(\"Bp2y::start被中断\"),3);\n\t\t\treturn;\n\t\t};\n\t\tThis._SO=0;\n\t\t\n\t\tvar end=function(){\n\t\t\tif(This.state==3){\n\t\t\t\tThis.state=1;\n\t\t\t\tThis.resume();\n\t\t\t}\n\t\t};\n\t\tvar tag=\"AudioContext resume: \";\n\t\t\n\t\t//如果有数据回调,就不等待ctx resume\n\t\tvar stream=This._streamGet();\n\t\tstream._call[This.id]=function(){\n\t\t\tThis.CLog(tag+ctx.state+'|stream ok');\n\t\t\tend();\n\t\t};\n\t\tResumeCtx(ctx,function(runC){\n\t\t\trunC&&This.CLog(tag+\"wait...\");\n\t\t\treturn This.state==3;\n\t\t},function(runC){\n\t\t\trunC&&This.CLog(tag+ctx.state);\n\t\t\tend();\n\t\t},function(err){ //比较少见,可能对录音没有影响\n\t\t\tThis.CLog(tag+ctx.state+$T(\"upkE::,可能无法录音:\")+err,1);\n\t\t\tend();\n\t\t});\n\t}\n\t\n\t\n\t\n\t/*暂停录音*/\n\t,pause:function(){\n\t\tvar This=this,stream=This._streamGet();\n\t\tif(This.state){\n\t\t\tThis.state=2;\n\t\t\tThis.CLog(\"pause\");\n\t\t\tif(stream) delete stream._call[This.id];\n\t\t};\n\t}\n\t/*恢复录音*/\n\t,resume:function(){\n\t\tvar This=this,stream=This._streamGet();\n\t\tvar tag=\"resume\",tag3=tag+\"(wait ctx)\";\n\t\tif(This.state==3){ //start还在等ctx恢复\n\t\t\tThis.CLog(tag3);\n\t\t}else if(This.state){\n\t\t\tThis.state=1;\n\t\t\tThis.CLog(tag);\n\t\t\tThis.envResume();\n\t\t\t\n\t\t\tif(stream){\n\t\t\t\tstream._call[This.id]=function(pcm,sum){\n\t\t\t\t\tif(This.state==1){\n\t\t\t\t\t\tThis.envIn(pcm,sum);\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tConnAlive(stream);//AudioWorklet只会在ctx激活后运行\n\t\t\t};\n\t\t\t\n\t\t\tvar ctx=This._streamCtx();\n\t\t\tif(ctx){ //AudioContext如果被暂停,尽量恢复\n\t\t\t\tResumeCtx(ctx,function(runC){\n\t\t\t\t\trunC&&This.CLog(tag3+\"...\");\n\t\t\t\t\treturn This.state==1;\n\t\t\t\t},function(runC){\n\t\t\t\t\trunC&&This.CLog(tag3+ctx.state);\n\t\t\t\t\tConnAlive(stream);\n\t\t\t\t},function(err){\n\t\t\t\t\tThis.CLog(tag3+ctx.state+\"[err]\"+err,1);\n\t\t\t\t});\n\t\t\t};\n\t\t};\n\t}\n\t\n\t\n\t\n\t\n\t,_stop:function(keepEngine){\n\t\tvar This=this,set=This.set;\n\t\tif(!This.isMock){\n\t\t\tThis._S++;\n\t\t};\n\t\tif(This.state){\n\t\t\tThis.pause();\n\t\t\tThis.state=0;\n\t\t};\n\t\tif(!keepEngine && This[set.type+\"_stop\"]){\n\t\t\tThis[set.type+\"_stop\"](This.engineCtx);\n\t\t\tThis.engineCtx=0;\n\t\t};\n\t}\n\t/*\n\t结束录音并返回录音数据blob对象\n\t\tTrue(blob,duration,mime)\n\t\t\tblob:录音数据audio/mp3|wav格式;默认是Blob对象,可设置rec.dataType=\"arraybuffer\"改成ArrayBuffer\n\t\t\tduration:录音时长,单位毫秒\n\t\t\tmime:\"auido/mp3\" blob数据的类型,方便ArrayBuffer时区分类型\n\t\tFalse(msg)\n\t\tautoClose:false 可选,是否自动调用close,默认为false\n\t*/\n\t,stop:function(True,False,autoClose){\n\t\tvar This=this,set=This.set,t1;\n\t\tvar envInMS=This.envInLast-This.envInFirst, envInLen=envInMS&&This.buffers.length; //可能未start\n\t\tThis.CLog($T(\"Xq4s::stop 和start时差:\")\n\t\t\t+(envInMS?envInMS+\"ms \"+$T(\"3CQP::补偿:\")+This.envInFix+\"ms\"\n\t\t\t\t+\" envIn:\"+envInLen+\" fps:\"+(envInLen/envInMS*1000).toFixed(1)\n\t\t\t:\"-\")+\" stream:\"+This._streamTag+\" (\"+GitUrl+\") LM:\"+LM);\n\t\t\n\t\tvar end=function(){\n\t\t\tThis._stop();//彻底关掉engineCtx\n\t\t\tif(autoClose){\n\t\t\t\tThis.close();\n\t\t\t};\n\t\t};\n\t\tvar err=function(msg){\n\t\t\tThis.CLog($T(\"u8JG::结束录音失败:\")+msg,1);\n\t\t\tFalse&&False(msg);\n\t\t\tend();\n\t\t};\n\t\tvar ok=function(blob,mime,duration){\n\t\t\tvar tBlob=\"blob\",tABuf=\"arraybuffer\",tDT=\"dataType\",tDDT=\"DefaultDataType\";\n\t\t\tvar dType=This[tDT]||Recorder[tDDT]||tBlob,dTag=tDT+\"=\"+dType;\n\t\t\tvar isAB=blob instanceof ArrayBuffer,dErr=0;\n\t\t\tvar dLen=isAB?blob.byteLength:blob.size;\n\t\t\tif(dType==tABuf){\n\t\t\t\tif(!isAB) dErr=1;\n\t\t\t}else if(dType==tBlob){\n\t\t\t\tif(typeof Blob!=\"function\"){\n\t\t\t\t\tdErr=$T.G(\"NonBrowser-1\",[dTag])+$T(\"1skY::,请设置{1}\",0,RecTxt+\".\"+tDDT+'=\"'+tABuf+'\"');\n\t\t\t\t}else{\n\t\t\t\t\tif(isAB) blob=new Blob([blob],{type:mime});\n\t\t\t\t\tif(!(blob instanceof Blob)) dErr=1;\n\t\t\t\t\tmime=blob.type||mime;\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tdErr=$T.G(\"NotSupport-1\",[dTag]);\n\t\t\t};\n\t\t\t\n\t\t\tThis.CLog($T(\"Wv7l::结束录音 编码花{1}ms 音频时长{2}ms 文件大小{3}b\",0,Date.now()-t1,duration,dLen)+\" \"+dTag+\",\"+mime);\n\t\t\tif(dErr){\n\t\t\t\terr(dErr!=1?dErr:$T(\"Vkbd::{1}编码器返回的不是{2}\",0,set.type,dType)+\", \"+dTag);\n\t\t\t\treturn;\n\t\t\t};\n\t\t\tif(set.takeoffEncodeChunk){//接管了输出,此时blob长度为0\n\t\t\t\tThis.CLog($T(\"QWnr::启用takeoffEncodeChunk后stop返回的blob长度为0不提供音频数据\"),3);\n\t\t\t}else if(dLen<Math.max(50,duration/5)){//1秒小于0.2k?\n\t\t\t\terr($T(\"Sz2H::生成的{1}无效\",0,set.type));\n\t\t\t\treturn;\n\t\t\t};\n\t\t\t\n\t\t\tTrue&&True(blob,duration,mime);\n\t\t\tend();\n\t\t};\n\t\tif(!This.isMock){\n\t\t\tvar isCtxWait=This.state==3;\n\t\t\tif(!This.state || isCtxWait){\n\t\t\t\terr($T(\"wf9t::未开始录音\")+(isCtxWait?$T(\"Dl2c::,开始录音前无用户交互导致AudioContext未运行\"):\"\"));\n\t\t\t\treturn;\n\t\t\t};\n\t\t};\n\t\tThis._stop(true); //将录音状态改成未录音\n\t\tvar size=This.recSize;\n\t\tif(!size){\n\t\t\terr($T(\"Ltz3::未采集到录音\"));\n\t\t\treturn;\n\t\t};\n\t\tif(!This[set.type]){\n\t\t\terr($T(\"xGuI::未加载{1}编码器,请尝试到{2}的src/engine内找到{1}的编码器并加载\",0,set.type,RecTxt));\n\t\t\treturn;\n\t\t};\n\t\t\n\t\t//环境配置检查,此处仅针对mock调用,因为open已经检查过了\n\t\tif(This.isMock){\n\t\t\tvar checkMsg=This.envCheck(This.mockEnvInfo||{envName:\"mock\",canProcess:false});//没有提供环境信息的mock时没有onProcess回调\n\t\t\tif(checkMsg){\n\t\t\t\terr($T(\"AxOH::录音错误:\")+checkMsg);\n\t\t\t\treturn;\n\t\t\t};\n\t\t};\n\t\t\n\t\t//此类型有边录边转码(Worker)支持\n\t\tvar engineCtx=This.engineCtx;\n\t\tif(This[set.type+\"_complete\"]&&engineCtx){\n\t\t\tvar duration=Math.round(engineCtx.pcmSize/set[sampleRateTxt]*1000);//采用后的数据长度和buffers的长度可能微小的不一致,是采样率连续转换的精度问题\n\t\t\t\n\t\t\tt1=Date.now();\n\t\t\tThis[set.type+\"_complete\"](engineCtx,function(blob,mime){\n\t\t\t\tok(blob,mime,duration);\n\t\t\t},err);\n\t\t\treturn;\n\t\t};\n\t\t\n\t\t//标准UI线程转码,调整采样率\n\t\tt1=Date.now();\n\t\tif(!This.buffers[0]){\n\t\t\terr($T(\"xkKd::音频buffers被释放\"));\n\t\t\treturn;\n\t\t};\n\t\tvar chunk=Recorder.SampleData(This.buffers,This[srcSampleRateTxt],set[sampleRateTxt]);\n\t\t\n\t\tset[sampleRateTxt]=chunk[sampleRateTxt];\n\t\tvar res=chunk.data;\n\t\tvar duration=Math.round(res.length/set[sampleRateTxt]*1000);\n\t\t\n\t\tThis.CLog($T(\"CxeT::采样:{1} 花:{2}ms\",0,size+\"->\"+res.length,Date.now()-t1));\n\t\t\n\t\tsetTimeout(function(){\n\t\t\tt1=Date.now();\n\t\t\tThis[set.type](res,function(blob,mime){\n\t\t\t\tok(blob,mime,duration);\n\t\t\t},function(msg){\n\t\t\t\terr(msg);\n\t\t\t});\n\t\t});\n\t}\n\n};\n\n\n\n\n\n//=======从WebM字节流中提取pcm数据,提取成功返回Float32Array,失败返回null||-1=====\nvar WebM_Extract=function(inBytes, scope){\n\tif(!scope.pos){\n\t\tscope.pos=[0]; scope.tracks={}; scope.bytes=[];\n\t};\n\tvar tracks=scope.tracks, position=[scope.pos[0]];\n\tvar endPos=function(){ scope.pos[0]=position[0] };\n\t\n\tvar sBL=scope.bytes.length;\n\tvar bytes=new Uint8Array(sBL+inBytes.length);\n\tbytes.set(scope.bytes); bytes.set(inBytes,sBL);\n\tscope.bytes=bytes;\n\t\n\t//先读取文件头和Track信息\n\tif(!scope._ht){\n\t\treadMatroskaVInt(bytes, position);//EBML Header\n\t\treadMatroskaBlock(bytes, position);//跳过EBML Header内容\n\t\tif(!BytesEq(readMatroskaVInt(bytes, position), [0x18,0x53,0x80,0x67])){\n\t\t\treturn;//未识别到Segment\n\t\t}\n\t\treadMatroskaVInt(bytes, position);//跳过Segment长度值\n\t\twhile(position[0]<bytes.length){\n\t\t\tvar eid0=readMatroskaVInt(bytes, position);\n\t\t\tvar bytes0=readMatroskaBlock(bytes, position);\n\t\t\tvar pos0=[0],audioIdx=0;\n\t\t\tif(!bytes0)return;//数据不全,等待缓冲\n\t\t\t//Track完整数据,循环读取TrackEntry\n\t\t\tif(BytesEq(eid0, [0x16,0x54,0xAE,0x6B])){\n\t\t\t\twhile(pos0[0]<bytes0.length){\n\t\t\t\t\tvar eid1=readMatroskaVInt(bytes0, pos0);\n\t\t\t\t\tvar bytes1=readMatroskaBlock(bytes0, pos0);\n\t\t\t\t\tvar pos1=[0],track={channels:0,sampleRate:0};\n\t\t\t\t\tif(BytesEq(eid1, [0xAE])){//TrackEntry\n\t\t\t\t\t\twhile(pos1[0]<bytes1.length){\n\t\t\t\t\t\t\tvar eid2=readMatroskaVInt(bytes1, pos1);\n\t\t\t\t\t\t\tvar bytes2=readMatroskaBlock(bytes1, pos1);\n\t\t\t\t\t\t\tvar pos2=[0];\n\t\t\t\t\t\t\tif(BytesEq(eid2, [0xD7])){//Track Number\n\t\t\t\t\t\t\t\tvar val=BytesInt(bytes2);\n\t\t\t\t\t\t\t\ttrack.number=val;\n\t\t\t\t\t\t\t\ttracks[val]=track;\n\t\t\t\t\t\t\t}else if(BytesEq(eid2, [0x83])){//Track Type\n\t\t\t\t\t\t\t\tvar val=BytesInt(bytes2);\n\t\t\t\t\t\t\t\tif(val==1) track.type=\"video\";\n\t\t\t\t\t\t\t\telse if(val==2) {\n\t\t\t\t\t\t\t\t\ttrack.type=\"audio\";\n\t\t\t\t\t\t\t\t\tif(!audioIdx) scope.track0=track;\n\t\t\t\t\t\t\t\t\ttrack.idx=audioIdx++;\n\t\t\t\t\t\t\t\t}else track.type=\"Type-\"+val;\n\t\t\t\t\t\t\t}else if(BytesEq(eid2, [0x86])){//Track Codec\n\t\t\t\t\t\t\t\tvar str=\"\";\n\t\t\t\t\t\t\t\tfor(var i=0;i<bytes2.length;i++){\n\t\t\t\t\t\t\t\t\tstr+=String.fromCharCode(bytes2[i]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttrack.codec=str;\n\t\t\t\t\t\t\t}else if(BytesEq(eid2, [0xE1])){\n\t\t\t\t\t\t\t\twhile(pos2[0]<bytes2.length){//循环读取 Audio 属性\n\t\t\t\t\t\t\t\t\tvar eid3=readMatroskaVInt(bytes2, pos2);\n\t\t\t\t\t\t\t\t\tvar bytes3=readMatroskaBlock(bytes2, pos2);\n\t\t\t\t\t\t\t\t\t//采样率、位数、声道数\n\t\t\t\t\t\t\t\t\tif(BytesEq(eid3, [0xB5])){\n\t\t\t\t\t\t\t\t\t\tvar val=0,arr=new Uint8Array(bytes3.reverse()).buffer;\n\t\t\t\t\t\t\t\t\t\tif(bytes3.length==4) val=new Float32Array(arr)[0];\n\t\t\t\t\t\t\t\t\t\telse if(bytes3.length==8) val=new Float64Array(arr)[0];\n\t\t\t\t\t\t\t\t\t\telse CLog(\"WebM Track !Float\",1,bytes3);\n\t\t\t\t\t\t\t\t\t\ttrack[sampleRateTxt]=Math.round(val);\n\t\t\t\t\t\t\t\t\t}else if(BytesEq(eid3, [0x62,0x64])) track.bitDepth=BytesInt(bytes3);\n\t\t\t\t\t\t\t\t\telse if(BytesEq(eid3, [0x9F])) track.channels=BytesInt(bytes3);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tscope._ht=1;\n\t\t\t\tCLog(\"WebM Tracks\",tracks);\n\t\t\t\tendPos();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//校验音频参数信息,如果不符合代码要求,统统拒绝处理\n\tvar track0=scope.track0;\n\tif(!track0)return;\n\tvar trackSR=track0[sampleRateTxt]; scope.webmSR=trackSR;\n\tif(track0.bitDepth==16 && /FLOAT/i.test(track0.codec)){\n\t\ttrack0.bitDepth=32; //chrome v66 实际为浮点数\n\t\tCLog(\"WebM 16->32 bit\",3);\n\t}\n\tif(trackSR<8000 || track0.bitDepth!=32 || track0.channels<1 || !/(\\b|_)PCM\\b/i.test(track0.codec)){\n\t\tscope.bytes=[];//格式非预期 无法处理,清空缓冲数据\n\t\tif(!scope.bad)CLog(\"WebM Track Unexpected\",3,scope);\n\t\tscope.bad=1;\n\t\treturn -1;\n\t}\n\t\n\t//循环读取Cluster内的SimpleBlock\n\tvar datas=[],dataLen=0;\n\twhile(position[0]<bytes.length){\n\t\tvar eid1=readMatroskaVInt(bytes, position);\n\t\tvar bytes1=readMatroskaBlock(bytes, position);\n\t\tif(!bytes1)break;//数据不全,等待缓冲\n\t\tif(BytesEq(eid1, [0xA3])){//SimpleBlock完整数据\n\t\t\tvar trackNo=bytes1[0]&0xf;\n\t\t\tvar track=tracks[trackNo];\n\t\t\tif(!track){//不可能没有,数据出错?\n\t\t\t\tCLog(\"WebM !Track\"+trackNo,1,tracks);\n\t\t\t}else if(track.idx===0){\n\t\t\t\tvar u8arr=new Uint8Array(bytes1.length-4);\n\t\t\t\tfor(var i=4;i<bytes1.length;i++){\n\t\t\t\t\tu8arr[i-4]=bytes1[i];\n\t\t\t\t}\n\t\t\t\tdatas.push(u8arr); dataLen+=u8arr.length;\n\t\t\t}\n\t\t}\n\t\tendPos();\n\t}\n\t\n\tif(dataLen){\n\t\tvar more=new Uint8Array(bytes.length-scope.pos[0]);\n\t\tmore.set(bytes.subarray(scope.pos[0]));\n\t\tscope.bytes=more; //清理已读取了的缓冲数据\n\t\tscope.pos[0]=0;\n\t\t\n\t\tvar u8arr=new Uint8Array(dataLen); //已获取的音频数据\n\t\tfor(var i=0,i2=0;i<datas.length;i++){\n\t\t\tu8arr.set(datas[i],i2);\n\t\t\ti2+=datas[i].length;\n\t\t}\n\t\tvar arr=new Float32Array(u8arr.buffer);\n\t\t\n\t\tif(track0.channels>1){//多声道,提取一个声道\n\t\t\tvar arr2=[];\n\t\t\tfor(var i=0;i<arr.length;){\n\t\t\t\tarr2.push(arr[i]);\n\t\t\t\ti+=track0.channels;\n\t\t\t}\n\t\t\tarr=new Float32Array(arr2);\n\t\t};\n\t\treturn arr;\n\t}\n};\n//两个字节数组内容是否相同\nvar BytesEq=function(bytes1,bytes2){\n\tif(!bytes1 || bytes1.length!=bytes2.length) return false;\n\tif(bytes1.length==1) return bytes1[0]==bytes2[0];\n\tfor(var i=0;i<bytes1.length;i++){\n\t\tif(bytes1[i]!=bytes2[i]) return false;\n\t}\n\treturn true;\n};\n//字节数组BE转成int数字\nvar BytesInt=function(bytes){\n\tvar s=\"\";//0-8字节,js位运算只支持4字节\n\tfor(var i=0;i<bytes.length;i++){var n=bytes[i];s+=(n<16?\"0\":\"\")+n.toString(16)};\n\treturn parseInt(s,16)||0;\n};\n//读取一个可变长数值字节数组\nvar readMatroskaVInt=function(arr,pos,trim){\n\tvar i=pos[0];\n\tif(i>=arr.length)return;\n\tvar b0=arr[i],b2=(\"0000000\"+b0.toString(2)).substr(-8);\n\tvar m=/^(0*1)(\\d*)$/.exec(b2);\n\tif(!m)return;\n\tvar len=m[1].length, val=[];\n\tif(i+len>arr.length)return;\n\tfor(var i2=0;i2<len;i2++){ val[i2]=arr[i]; i++; }\n\tif(trim) val[0]=parseInt(m[2]||'0',2);\n\tpos[0]=i;\n\treturn val;\n};\n//读取一个自带长度的内容字节数组\nvar readMatroskaBlock=function(arr,pos){\n\tvar lenVal=readMatroskaVInt(arr,pos,1);\n\tif(!lenVal)return;\n\tvar len=BytesInt(lenVal);\n\tvar i=pos[0], val=[];\n\tif(len<0x7FFFFFFF){ //超大值代表没有长度\n\t\tif(i+len>arr.length)return;\n\t\tfor(var i2=0;i2<len;i2++){ val[i2]=arr[i]; i++; }\n\t}\n\tpos[0]=i;\n\treturn val;\n};\n//=====End WebM读取=====\n\n\n//=====i18n 简版国际化多语言支持=====\nvar i18n=Recorder.i18n={\n\tlang: \"zh-CN\" //默认中文\n\t,alias:{\"zh-CN\":\"zh\",\"en-US\":\"en\"} //别名配置,映射到一个语言实例\n\t,locales:{} //语言实例:zh:{key:\"text\"}\n\t,data:{} //各种数据,desc$xx:语言描述,rtl$xx:文本方向是否从右到左 rtl$zh:false rtl$ar:true\n\t//添加语言文本内容,set={lang:\"\",overwrite:true},texts=[\"key:text{1}\",...]\n\t,put:function(set,texts){\n\t\tvar tag=RecTxt+\".i18n.put: \";\n\t\tvar overwrite=set.overwrite; overwrite=overwrite==null||overwrite;\n\t\tvar lang=set.lang; lang=i18n.alias[lang]||lang;\n\t\tif(!lang)throw new Error(tag+\"set.lang?\");\n\t\tvar locale=i18n.locales[lang];\n\t\tif(!locale){ locale={}; i18n.locales[lang]=locale };\n\t\tvar exp=/^([\\w\\-]+):/,m;\n\t\tfor(var i=0;i<texts.length;i++){\n\t\t\tvar v=texts[i]; m=exp.exec(v);\n\t\t\tif(!m){ CLog(tag+\"'key:'? \"+v,3,set); continue }\n\t\t\tvar key=m[1],v=v.substr(key.length+1);\n\t\t\tif(!overwrite && locale[key]) continue;\n\t\t\tlocale[key]=v;\n\t\t}\n\t}\n\t//获取key对应的文本,如果没有对应文本,将返回en的,en的也没有将返回zh的\n\t,get:function(/*key,args,lang*/){\n\t\treturn i18n.v_G.apply(null,arguments);\n\t}, v_G:function(key,args,lang){ //全局可重写get\n\t\targs=args||[];\n\t\tlang=lang||i18n.lang; lang=i18n.alias[lang]||lang;\n\t\tvar locale=i18n.locales[lang];\n\t\tvar val=locale&&locale[key]||\"\";\n\t\tif(!val&&lang!=\"zh\"){\n\t\t\tif(lang==\"en\")return i18n.v_G(key,args,\"zh\");\n\t\t\treturn i18n.v_G(key,args,\"en\");\n\t\t}\n\t\ti18n.lastLang=lang;\n\t\tif(val==\"=Empty\")return \"\";\n\t\treturn val.replace(/\\{(\\d+)(\\!?)\\}/g,function(v,a,b){\n\t\t\ta=+a||0; v=args[a-1];\n\t\t\tif(a<1 || a>args.length){ v=\"{?}\"; CLog(\"i18n[\"+key+\"] no {\"+a+\"}: \"+val,3) }\n\t\t\treturn b?\"\":v;\n\t\t});\n\t}\n\t/**返回一个国际化文本,返回的文本取决于i18n.lang。\n\t\t调用参数:T(\"key:[lang]:中文{1}\",\"[lang]:英文{1}\",...,0,\"args1\",\"args2\"),除了key:,其他都是可选的,文本如果在语言实例中不存在会push进去,第一个文本无lang时默认zh,第二个无lang时默认en,文本中用{1-n}来插入args\n\t\t第一个args前面这个参数必须是0;也可以不提供args,这个参数填args的数量,此时不返回文本,只返回key,再用i18n.get提供参数获取文本\n\t\t本函数调用,第一个文本需中文,调用尽量简单,不要换行,方便后续自动提取翻译列表\n\t\targs如果旧的参数位置发生了变更,应当使用新的key,让旧的翻译失效,增加args无需更换key\n\t\tkey的生成使用随机字符串,不同源码里面可以搞个不同前缀:\n\t\t\ts=\"\";L=4; for(var i=0,n;i<L;i++){ n=~~(Math.random()*62);s+=n<10?n:String.fromCharCode(n<36?55+n:61+n); }; s\n\t**/\n\t,$T:function(){\n\t\treturn i18n.v_T.apply(null,arguments);\n\t} ,v_T:function(){ //全局可重写$T\n\t\tvar a=arguments,key=\"\",args=[],isArgs=0,tag=RecTxt+\".i18n.$T:\";\n\t\tvar exp=/^([\\w\\-]*):/,m;\n\t\tfor(var i=0;i<a.length;i++){\n\t\t\tvar v=a[i];\n\t\t\tif(i==0){\n\t\t\t\tm=exp.exec(v); key=m&&m[1];\n\t\t\t\tif(!key)throw new Error(tag+\"0 'key:'?\");\n\t\t\t\tv=v.substr(key.length+1);\n\t\t\t}\n\t\t\tif(isArgs===-1) args.push(v);\n\t\t\telse if(isArgs) throw new Error(tag+\" bad args\");\n\t\t\telse if(v===0) isArgs=-1;\n\t\t\telse if(IsNum(v)){\n\t\t\t\tif(v<1) throw new Error(tag+\" bad args\");\n\t\t\t\tisArgs=v;\n\t\t\t}else{\n\t\t\t\tvar lang=i==1?\"en\":i?\"\":\"zh\";\n\t\t\t\tm=exp.exec(v); if(m){ lang=m[1]||lang; v=v.substr(m[1].length+1); }\n\t\t\t\tif(!m || !lang)throw new Error(tag+i+\" 'lang:'?\");\n\t\t\t\ti18n.put({lang:lang,overwrite:false},[key+\":\"+v]);\n\t\t\t}\n\t\t}\n\t\tif(!key)return \"\";\n\t\tif(isArgs>0)return key;\n\t\treturn i18n.v_G(key,args);\n\t}\n};\nvar $T=i18n.$T; $T.G=i18n.get;\n//预定义文本\n$T(\"NonBrowser-1::非浏览器环境,不支持{1}\",1);\n$T(\"IllegalArgs-1::参数错误:{1}\",1);\n$T(\"NeedImport-2::调用{1}需要先导入{2}\",2);\n$T(\"NotSupport-1::不支持:{1}\",1);\n//=====End i18n=====\n\n\n\n//流量统计用1像素图片地址,设置为空将不参与统计\nRecorder.TrafficImgUrl=\"//ia.51.la/go1?id=20469973&pvFlag=1\";\nvar Traffic=Recorder.Traffic=function(report){\n\tif(!isBrowser)return;\n\treport=report?\"/\"+RecTxt+\"/Report/\"+report:\"\";\n\tvar imgUrl=Recorder.TrafficImgUrl;\n\tif(imgUrl){\n\t\tvar data=Recorder.Traffic;\n\t\tvar m=/^(https?:..[^\\/#]*\\/?)[^#]*/i.exec(location.href)||[];\n\t\tvar host=(m[1]||\"http://file/\");\n\t\tvar idf=(m[0]||host)+report;\n\t\t\n\t\tif(imgUrl.indexOf(\"//\")==0){\n\t\t\t//给url加上http前缀,如果是file协议下,不加前缀没法用\n\t\t\tif(/^https:/i.test(idf)){\n\t\t\t\timgUrl=\"https:\"+imgUrl;\n\t\t\t}else{\n\t\t\t\timgUrl=\"http:\"+imgUrl;\n\t\t\t};\n\t\t};\n\t\tif(report){\n\t\t\timgUrl=imgUrl+\"&cu=\"+encodeURIComponent(host+report);\n\t\t};\n\t\t\n\t\tif(!data[idf]){\n\t\t\tdata[idf]=1;\n\t\t\t\n\t\t\tvar img=new Image();\n\t\t\timg.src=imgUrl;\n\t\t\tCLog(\"Traffic Analysis Image: \"+(report||RecTxt+\".TrafficImgUrl=\"+Recorder.TrafficImgUrl));\n\t\t};\n\t};\n};\n\n\n\nif(WRec2){\n\tCLog($T(\"8HO5::覆盖导入{1}\",0,RecTxt),1);\n\tWRec2.Destroy();\n};\nExport[RecTxt]=Recorder;\n\n}));"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"script","externalDependencies":[]}