Files
Arbitrate-FrontendH5/node_modules/.cache/babel-loader/2babf1fd8150659771913124ede5c7fbafcedfd1bae89e604a2eacb580deb522.json
T
2024-01-18 10:46:33 +08:00

1 line
33 KiB
JSON

{"ast":null,"code":"import \"core-js/modules/es.typed-array.to-reversed.js\";\nimport \"core-js/modules/es.typed-array.to-sorted.js\";\nimport \"core-js/modules/es.typed-array.with.js\";\nimport \"core-js/modules/web.url-search-params.delete.js\";\nimport \"core-js/modules/web.url-search-params.has.js\";\nimport \"core-js/modules/web.url-search-params.size.js\";\nimport \"core-js/modules/es.array.push.js\";\nexport function to16BitPCM(input) {\n const dataLength = input.length * (16 / 8);\n const dataBuffer = new ArrayBuffer(dataLength);\n const dataView = new DataView(dataBuffer);\n let offset = 0;\n for (let i = 0; i < input.length; i++, offset += 2) {\n const s = Math.max(-1, Math.min(1, input[i]));\n dataView.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true);\n }\n return dataView;\n}\nexport function to16kHz(audioData, sampleRate = 44100) {\n const data = new Float32Array(audioData);\n const fitCount = Math.round(data.length * (16000 / sampleRate));\n const newData = new Float32Array(fitCount);\n const springFactor = (data.length - 1) / (fitCount - 1);\n newData[0] = data[0];\n for (let i = 1; i < fitCount - 1; i++) {\n const tmp = i * springFactor;\n const before = Math.floor(tmp).toFixed();\n const after = Math.ceil(tmp).toFixed();\n const atPoint = tmp - before;\n newData[i] = data[before] + (data[after] - data[before]) * atPoint;\n }\n newData[fitCount - 1] = data[data.length - 1];\n return newData;\n}\nconst audioWorkletCode = `\n class MyProcessor extends AudioWorkletProcessor {\n constructor(options) {\n super(options);\n this.audioData = [];\n this.nextUpdateFrame = 40;\n this.sampleCount = 0;\n this.bitCount = 0;\n }\n \n get intervalInFrames() {\n return 40 / 1000 * sampleRate;\n }\n \n process(inputs) {\n // 去处理音频数据\n // eslint-disable-next-line no-undef\n if (inputs[0][0]) {\n const output = ${to16kHz}(inputs[0][0], sampleRate);\n this.sampleCount += 1;\n const audioData = ${to16BitPCM}(output);\n this.bitCount += 1;\n const data = [...new Int8Array(audioData.buffer)];\n this.audioData = this.audioData.concat(data);\n this.nextUpdateFrame -= inputs[0][0].length;\n if (this.nextUpdateFrame < 0) {\n this.nextUpdateFrame += this.intervalInFrames;\n this.port.postMessage({\n audioData: new Int8Array(this.audioData),\n sampleCount: this.sampleCount,\n bitCount: this.bitCount\n });\n this.audioData = [];\n }\n return true;\n }\n }\n }\n \n registerProcessor('my-processor', MyProcessor);\n `;\nconst audioWorkletBlobURL = window.URL.createObjectURL(new Blob([audioWorkletCode], {\n type: 'text/javascript'\n}));\nconst TAG = 'WebRecorder';\nnavigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;\nexport default class WebRecorder {\n constructor(requestId, isLog) {\n this.audioData = [];\n this.allAudioData = [];\n this.stream = null;\n this.audioContext = null;\n this.requestId = requestId;\n this.frameTime = [];\n this.frameCount = 0;\n this.sampleCount = 0;\n this.bitCount = 0;\n this.mediaStreamSource = null;\n this.isLog = isLog;\n }\n static isSupportMediaDevicesMedia() {\n return !!(navigator.getUserMedia || navigator.mediaDevices && navigator.mediaDevices.getUserMedia);\n }\n static isSupportUserMediaMedia() {\n return !!navigator.getUserMedia;\n }\n static isSupportAudioContext() {\n return typeof AudioContext !== 'undefined' || typeof webkitAudioContext !== 'undefined';\n }\n static isSupportMediaStreamSource(requestId, audioContext) {\n return typeof audioContext.createMediaStreamSource === 'function';\n }\n static isSupportAudioWorklet(audioContext) {\n return audioContext.audioWorklet && typeof audioContext.audioWorklet.addModule === 'function' && typeof AudioWorkletNode !== 'undefined';\n }\n static isSupportCreateScriptProcessor(requestId, audioContext) {\n return typeof audioContext.createScriptProcessor === 'function';\n }\n start() {\n this.frameTime = [];\n this.frameCount = 0;\n this.allAudioData = [];\n this.audioData = [];\n this.sampleCount = 0;\n this.bitCount = 0;\n this.getDataCount = 0;\n this.audioContext = null;\n this.mediaStreamSource = null;\n this.stream = null;\n try {\n if (WebRecorder.isSupportAudioContext()) {\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)();\n } else {\n this.isLog && console.log(this.requestId, '浏览器不支持AudioContext', TAG);\n this.OnError('浏览器不支持AudioContext');\n }\n } catch (e) {\n this.isLog && console.log(this.requestId, '浏览器不支持webAudioApi相关接口', e, TAG);\n this.OnError('浏览器不支持webAudioApi相关接口');\n }\n this.getUserMedia(this.requestId, this.getAudioSuccess, this.getAudioFail);\n }\n stop() {\n if (!(/Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent))) {\n this.audioContext && this.audioContext.suspend();\n }\n this.audioContext && this.audioContext.suspend();\n this.isLog && console.log(this.requestId, `webRecorder stop ${this.sampleCount}/${this.bitCount}/${this.getDataCount}`, JSON.stringify(this.frameTime), TAG);\n this.OnStop(this.allAudioData);\n }\n destroyStream() {\n // 关闭通道\n if (this.stream) {\n this.stream.getTracks().map(val => {\n val.stop();\n });\n this.stream = null;\n }\n }\n async getUserMedia(requestId, getStreamAudioSuccess, getStreamAudioFail) {\n const mediaOption = {\n audio: true,\n video: false\n };\n // 获取用户的麦克风\n if (WebRecorder.isSupportMediaDevicesMedia()) {\n navigator.mediaDevices.getUserMedia(mediaOption).then(stream => {\n this.stream = stream;\n getStreamAudioSuccess.call(this, requestId, stream);\n }).catch(e => {\n getStreamAudioFail.call(this, requestId, e);\n });\n } else if (WebRecorder.isSupportUserMediaMedia()) {\n navigator.getUserMedia(mediaOption, stream => {\n this.stream = stream;\n getStreamAudioSuccess.call(this, requestId, stream);\n }, function (err) {\n getStreamAudioFail.call(this, requestId, err);\n });\n } else {\n if (navigator.userAgent.toLowerCase().match(/chrome/) && location.origin.indexOf('https://') < 0) {\n this.OnError('chrome下获取浏览器录音功能,因为安全性问题,需要在localhost或127.0.0.1或https下才能获取权限');\n } else {\n this.OnError('无法获取浏览器录音功能,请升级浏览器或使用chrome');\n }\n this.audioContext && this.audioContext.close();\n }\n }\n async getAudioSuccess(requestId, stream) {\n if (!this.audioContext) {\n return false;\n }\n if (this.mediaStreamSource) {\n this.mediaStreamSource.disconnect();\n this.mediaStreamSource = null;\n }\n this.audioTrack = stream.getAudioTracks()[0];\n const mediaStream = new MediaStream();\n mediaStream.addTrack(this.audioTrack);\n this.mediaStreamSource = this.audioContext.createMediaStreamSource(mediaStream);\n if (WebRecorder.isSupportMediaStreamSource(requestId, this.audioContext)) {\n if (WebRecorder.isSupportAudioWorklet(this.audioContext)) {\n // 不支持 AudioWorklet 降级\n this.audioWorkletNodeDealAudioData(this.mediaStreamSource, requestId);\n } else {\n this.scriptNodeDealAudioData(this.mediaStreamSource, requestId);\n }\n } else {\n // 不支持 MediaStreamSource\n this.OnError('不支持MediaStreamSource');\n }\n }\n getAudioFail(requestId, err) {\n if (err && err.err && err.err.name === 'NotAllowedError') {\n this.isLog && console.log(requestId, '授权失败', JSON.stringify(err.err), TAG);\n }\n this.OnError(err);\n this.stop();\n }\n scriptNodeDealAudioData(mediaStreamSource, requestId) {\n if (WebRecorder.isSupportCreateScriptProcessor(requestId, this.audioContext)) {\n // 创建一个音频分析对象,采样的缓冲区大小为0(自动适配),输入和输出都是单声道\n const scriptProcessor = this.audioContext.createScriptProcessor(1024, 1, 1);\n // 连接\n this.mediaStreamSource && this.mediaStreamSource.connect(scriptProcessor);\n scriptProcessor && scriptProcessor.connect(this.audioContext.destination);\n scriptProcessor.onaudioprocess = e => {\n this.getDataCount += 1;\n // 去处理音频数据\n const inputData = e.inputBuffer.getChannelData(0);\n const output = to16kHz(inputData, this.audioContext.sampleRate);\n const audioData = to16BitPCM(output);\n this.audioData.push(...new Int8Array(audioData.buffer));\n this.allAudioData.push(...new Int8Array(audioData.buffer));\n if (this.audioData.length > 1280) {\n this.frameTime.push(`${Date.now()}-${this.frameCount}`);\n this.frameCount += 1;\n const audioDataArray = new Int8Array(this.audioData);\n this.OnReceivedData(audioDataArray);\n this.audioData = [];\n this.sampleCount += 1;\n this.bitCount += 1;\n }\n };\n } else {\n // 不支持\n this.isLog && console.log(this.requestId, '不支持createScriptProcessor');\n }\n }\n async audioWorkletNodeDealAudioData(mediaStreamSource, requestId) {\n try {\n await this.audioContext.audioWorklet.addModule(audioWorkletBlobURL);\n const myNode = new AudioWorkletNode(this.audioContext, 'my-processor', {\n numberOfInputs: 1,\n numberOfOutputs: 1,\n channelCount: 1\n });\n myNode.onprocessorerror = event => {\n // 降级\n this.scriptNodeDealAudioData(mediaStreamSource, this.requestId);\n return false;\n };\n myNode.port.onmessage = event => {\n this.frameTime.push(`${Date.now()}-${this.frameCount}`);\n this.OnReceivedData(event.data.audioData);\n this.frameCount += 1;\n this.allAudioData.push(...event.data.audioData);\n this.sampleCount = event.data.sampleCount;\n this.bitCount = event.data.bitCount;\n };\n myNode.port.onmessageerror = event => {\n // 降级\n this.scriptNodeDealAudioData(mediaStreamSource, requestId);\n return false;\n };\n mediaStreamSource && mediaStreamSource.connect(myNode).connect(this.audioContext.destination);\n } catch (e) {\n this.OnError(e);\n }\n }\n // 获取音频数据\n OnReceivedData(data) {}\n OnError(res) {}\n OnStop(res) {}\n}","map":{"version":3,"names":["to16BitPCM","input","dataLength","length","dataBuffer","ArrayBuffer","dataView","DataView","offset","i","s","Math","max","min","setInt16","to16kHz","audioData","sampleRate","data","Float32Array","fitCount","round","newData","springFactor","tmp","before","floor","toFixed","after","ceil","atPoint","audioWorkletCode","audioWorkletBlobURL","window","URL","createObjectURL","Blob","type","TAG","navigator","getUserMedia","webkitGetUserMedia","mozGetUserMedia","msGetUserMedia","WebRecorder","constructor","requestId","isLog","allAudioData","stream","audioContext","frameTime","frameCount","sampleCount","bitCount","mediaStreamSource","isSupportMediaDevicesMedia","mediaDevices","isSupportUserMediaMedia","isSupportAudioContext","AudioContext","webkitAudioContext","isSupportMediaStreamSource","createMediaStreamSource","isSupportAudioWorklet","audioWorklet","addModule","AudioWorkletNode","isSupportCreateScriptProcessor","createScriptProcessor","start","getDataCount","console","log","OnError","e","getAudioSuccess","getAudioFail","stop","test","userAgent","suspend","JSON","stringify","OnStop","destroyStream","getTracks","map","val","getStreamAudioSuccess","getStreamAudioFail","mediaOption","audio","video","then","call","catch","err","toLowerCase","match","location","origin","indexOf","close","disconnect","audioTrack","getAudioTracks","mediaStream","MediaStream","addTrack","audioWorkletNodeDealAudioData","scriptNodeDealAudioData","name","scriptProcessor","connect","destination","onaudioprocess","inputData","inputBuffer","getChannelData","output","push","Int8Array","buffer","Date","now","audioDataArray","OnReceivedData","myNode","numberOfInputs","numberOfOutputs","channelCount","onprocessorerror","event","port","onmessage","onmessageerror","res"],"sources":["/Users/Guest/nouiroom/src/utils/webrecorder.js"],"sourcesContent":["\nexport function to16BitPCM(input) {\n const dataLength = input.length * (16 / 8);\n const dataBuffer = new ArrayBuffer(dataLength);\n const dataView = new DataView(dataBuffer);\n let offset = 0;\n for (let i = 0; i < input.length; i++, offset += 2) {\n const s = Math.max(-1, Math.min(1, input[i]));\n dataView.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true);\n }\n return dataView;\n }\n export function to16kHz(audioData, sampleRate= 44100) {\n const data = new Float32Array(audioData);\n const fitCount = Math.round(data.length * (16000 / sampleRate));\n const newData = new Float32Array(fitCount);\n const springFactor = (data.length - 1) / (fitCount - 1);\n newData[0] = data[0];\n for (let i = 1; i < fitCount - 1; i++) {\n const tmp = i * springFactor;\n const before = Math.floor(tmp).toFixed();\n const after = Math.ceil(tmp).toFixed();\n const atPoint = tmp - before;\n newData[i] = data[before] + (data[after] - data[before]) * atPoint;\n }\n newData[fitCount - 1] = data[data.length - 1];\n return newData;\n }\n \n const audioWorkletCode = `\n class MyProcessor extends AudioWorkletProcessor {\n constructor(options) {\n super(options);\n this.audioData = [];\n this.nextUpdateFrame = 40;\n this.sampleCount = 0;\n this.bitCount = 0;\n }\n \n get intervalInFrames() {\n return 40 / 1000 * sampleRate;\n }\n \n process(inputs) {\n // 去处理音频数据\n // eslint-disable-next-line no-undef\n if (inputs[0][0]) {\n const output = ${to16kHz}(inputs[0][0], sampleRate);\n this.sampleCount += 1;\n const audioData = ${to16BitPCM}(output);\n this.bitCount += 1;\n const data = [...new Int8Array(audioData.buffer)];\n this.audioData = this.audioData.concat(data);\n this.nextUpdateFrame -= inputs[0][0].length;\n if (this.nextUpdateFrame < 0) {\n this.nextUpdateFrame += this.intervalInFrames;\n this.port.postMessage({\n audioData: new Int8Array(this.audioData),\n sampleCount: this.sampleCount,\n bitCount: this.bitCount\n });\n this.audioData = [];\n }\n return true;\n }\n }\n }\n \n registerProcessor('my-processor', MyProcessor);\n `;\n const audioWorkletBlobURL = window.URL.createObjectURL(new Blob([audioWorkletCode], { type: 'text/javascript' }));\n const TAG = 'WebRecorder';\n navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia\n || navigator.mozGetUserMedia || navigator.msGetUserMedia;\n \n \n export default class WebRecorder {\n constructor(requestId, isLog) {\n this.audioData = [];\n this.allAudioData = [];\n this.stream = null;\n this.audioContext = null;\n this.requestId = requestId;\n this.frameTime = [];\n this.frameCount = 0;\n this.sampleCount = 0;\n this.bitCount = 0;\n this.mediaStreamSource = null;\n this.isLog = isLog;\n }\n static isSupportMediaDevicesMedia() {\n return !!(navigator.getUserMedia || (navigator.mediaDevices && navigator.mediaDevices.getUserMedia));\n }\n static isSupportUserMediaMedia() {\n return !!navigator.getUserMedia;\n }\n static isSupportAudioContext() {\n return typeof AudioContext !== 'undefined' || typeof webkitAudioContext !== 'undefined';\n }\n static isSupportMediaStreamSource(requestId, audioContext) {\n return typeof audioContext.createMediaStreamSource === 'function';\n }\n static isSupportAudioWorklet(audioContext) {\n return audioContext.audioWorklet && typeof audioContext.audioWorklet.addModule === 'function'\n && typeof AudioWorkletNode !== 'undefined';\n }\n static isSupportCreateScriptProcessor(requestId, audioContext) {\n return typeof audioContext.createScriptProcessor === 'function';\n }\n start() {\n this.frameTime = [];\n this.frameCount = 0;\n this.allAudioData = [];\n this.audioData = [];\n this.sampleCount = 0;\n this.bitCount = 0;\n this.getDataCount = 0;\n this.audioContext = null;\n this.mediaStreamSource = null;\n this.stream = null;\n try {\n if (WebRecorder.isSupportAudioContext()) {\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)();\n } else {\n this.isLog && console.log(this.requestId, '浏览器不支持AudioContext', TAG);\n this.OnError('浏览器不支持AudioContext');\n }\n } catch (e) {\n this.isLog && console.log(this.requestId, '浏览器不支持webAudioApi相关接口', e, TAG);\n this.OnError('浏览器不支持webAudioApi相关接口');\n }\n this.getUserMedia(this.requestId, this.getAudioSuccess, this.getAudioFail);\n }\n stop() {\n if (!(/Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent))){\n this.audioContext && this.audioContext.suspend();\n }\n this.audioContext && this.audioContext.suspend();\n this.isLog && console.log(this.requestId, `webRecorder stop ${this.sampleCount}/${this.bitCount}/${this.getDataCount}` , JSON.stringify(this.frameTime), TAG);\n this.OnStop(this.allAudioData);\n }\n destroyStream() {\n // 关闭通道\n if (this.stream) {\n this.stream.getTracks().map((val) => {\n val.stop();\n });\n this.stream = null;\n }\n }\n async getUserMedia(requestId, getStreamAudioSuccess, getStreamAudioFail) {\n const mediaOption = {\n audio: true,\n video: false,\n };\n // 获取用户的麦克风\n if (WebRecorder.isSupportMediaDevicesMedia()) {\n navigator.mediaDevices\n .getUserMedia(mediaOption)\n .then(stream => {\n this.stream = stream;\n getStreamAudioSuccess.call(this, requestId, stream);\n })\n .catch(e => {\n getStreamAudioFail.call(this, requestId, e);\n });\n } else if (WebRecorder.isSupportUserMediaMedia()) {\n navigator.getUserMedia(mediaOption,\n stream => {\n this.stream = stream;\n getStreamAudioSuccess.call(this, requestId, stream);\n },\n function(err) {\n getStreamAudioFail.call(this, requestId, err);\n }\n );\n } else {\n if (navigator.userAgent.toLowerCase().match(/chrome/) && location.origin.indexOf('https://') < 0) {\n this.OnError('chrome下获取浏览器录音功能,因为安全性问题,需要在localhost或127.0.0.1或https下才能获取权限');\n } else {\n this.OnError('无法获取浏览器录音功能,请升级浏览器或使用chrome');\n }\n this.audioContext && this.audioContext.close();\n }\n }\n async getAudioSuccess(requestId, stream) {\n if (!this.audioContext) {\n return false;\n }\n if (this.mediaStreamSource) {\n this.mediaStreamSource.disconnect();\n this.mediaStreamSource = null;\n }\n this.audioTrack = stream.getAudioTracks()[0];\n const mediaStream = new MediaStream();\n mediaStream.addTrack(this.audioTrack);\n this.mediaStreamSource = this.audioContext.createMediaStreamSource(mediaStream);\n if (WebRecorder.isSupportMediaStreamSource(requestId, this.audioContext)) {\n if (WebRecorder.isSupportAudioWorklet(this.audioContext)) { // 不支持 AudioWorklet 降级\n this.audioWorkletNodeDealAudioData(this.mediaStreamSource, requestId);\n } else {\n this.scriptNodeDealAudioData(this.mediaStreamSource, requestId);\n }\n } else { // 不支持 MediaStreamSource\n this.OnError('不支持MediaStreamSource');\n }\n }\n getAudioFail(requestId, err) {\n if (err && err.err && err.err.name === 'NotAllowedError') {\n this.isLog && console.log(requestId,'授权失败', JSON.stringify(err.err), TAG);\n }\n this.OnError(err);\n this.stop();\n }\n scriptNodeDealAudioData(mediaStreamSource, requestId) {\n if (WebRecorder.isSupportCreateScriptProcessor(requestId, this.audioContext)) {\n // 创建一个音频分析对象,采样的缓冲区大小为0(自动适配),输入和输出都是单声道\n const scriptProcessor = this.audioContext.createScriptProcessor(1024, 1, 1);\n // 连接\n this.mediaStreamSource && this.mediaStreamSource.connect(scriptProcessor);\n scriptProcessor && scriptProcessor.connect(this.audioContext.destination);\n scriptProcessor.onaudioprocess = (e) => {\n this.getDataCount += 1;\n // 去处理音频数据\n const inputData = e.inputBuffer.getChannelData(0);\n const output = to16kHz(inputData, this.audioContext.sampleRate);\n const audioData = to16BitPCM(output);\n this.audioData.push(...new Int8Array(audioData.buffer));\n this.allAudioData.push(...new Int8Array(audioData.buffer));\n if (this.audioData.length > 1280) {\n this.frameTime.push(`${Date.now()}-${this.frameCount}`);\n this.frameCount += 1;\n const audioDataArray = new Int8Array(this.audioData);\n this.OnReceivedData(audioDataArray);\n this.audioData = [];\n this.sampleCount += 1;\n this.bitCount += 1;\n }\n };\n } else { // 不支持\n this.isLog && console.log(this.requestId, '不支持createScriptProcessor');\n }\n }\n async audioWorkletNodeDealAudioData(mediaStreamSource, requestId) {\n try {\n await this.audioContext.audioWorklet.addModule(audioWorkletBlobURL);\n const myNode = new AudioWorkletNode(this.audioContext, 'my-processor', { numberOfInputs: 1, numberOfOutputs: 1, channelCount: 1 });\n myNode.onprocessorerror = (event) => {\n // 降级\n this.scriptNodeDealAudioData(mediaStreamSource, this.requestId);\n return false;\n }\n myNode.port.onmessage = (event) => {\n this.frameTime.push(`${Date.now()}-${this.frameCount}`);\n this.OnReceivedData(event.data.audioData);\n this.frameCount += 1;\n this.allAudioData.push(...event.data.audioData);\n this.sampleCount = event.data.sampleCount;\n this.bitCount = event.data.bitCount;\n };\n myNode.port.onmessageerror = (event) => {\n // 降级\n this.scriptNodeDealAudioData(mediaStreamSource, requestId);\n return false;\n }\n mediaStreamSource &&mediaStreamSource.connect(myNode).connect(this.audioContext.destination);\n } catch (e) {\n this.OnError(e);\n }\n }\n // 获取音频数据\n OnReceivedData(data) {}\n OnError(res) {}\n OnStop(res) {}\n }"],"mappings":"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"},"metadata":{},"sourceType":"module","externalDependencies":[]}