{"ast":null,"code":"/*\nwav编码器+编码引擎\nhttps://github.com/xiangyuecn/Recorder\n\n当然最佳推荐使用mp3、wav格式,代码也是优先照顾这两种格式\n浏览器支持情况\nhttps://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats\n\n编码原理:给pcm数据加上一个44字节的wav头即成wav文件;pcm数据就是Recorder中的buffers原始数据(重新采样),16位时为LE小端模式(Little Endian),实质上是未经过任何编码处理\n\n注意:其他wav编码器可能不是44字节的头,要从任意wav文件中提取pcm数据,请参考:assets/runtime-codes/fragment.decode.wav.js\n*/\n(function (factory) {\n var browser = typeof window == \"object\" && !!window.document;\n var win = browser ? window : Object; //非浏览器环境,Recorder挂载在Object下面\n var rec = win.Recorder,\n ni = rec.i18n;\n factory(rec, ni, ni.$T, browser);\n})(function (Recorder, i18n, $T, isBrowser) {\n \"use strict\";\n\n Recorder.prototype.enc_wav = {\n stable: true,\n fast: true,\n getTestMsg: function () {\n return $T(\"gPSE::支持位数8位、16位(填在比特率里面),采样率取值无限制;此编码器仅在pcm数据前加了一个44字节的wav头,编码出来的16位wav文件去掉开头的44字节即可得到pcm(注:其他wav编码器可能不是44字节)\");\n }\n };\n var NormalizeSet = function (set) {\n var bS = set.bitRate,\n b = bS == 8 ? 8 : 16;\n if (bS != b) Recorder.CLog($T(\"wyw9::WAV Info: 不支持{1}位,已更新成{2}位\", 0, bS, b), 3);\n set.bitRate = b;\n };\n Recorder.prototype.wav = function (res, True, False) {\n var This = this,\n set = This.set;\n NormalizeSet(set);\n var size = res.length,\n sampleRate = set.sampleRate,\n bitRate = set.bitRate;\n var dataLength = size * (bitRate / 8);\n\n //生成wav头\n var header = Recorder.wav_header(1, 1, sampleRate, bitRate, dataLength);\n var offset = header.length;\n var bytes = new Uint8Array(offset + dataLength);\n bytes.set(header);\n\n // 写入采样数据\n if (bitRate == 8) {\n for (var i = 0; i < size; i++) {\n //16转8据说是雷霄骅的 https://blog.csdn.net/sevennight1989/article/details/85376149 细节比blqw的按比例的算法清晰点\n var val = (res[i] >> 8) + 128;\n bytes[offset++] = val;\n }\n ;\n } else {\n bytes = new Int16Array(bytes.buffer); //长度一定是偶数\n bytes.set(res, offset / 2);\n }\n ;\n True(bytes.buffer, \"audio/wav\");\n };\n\n /**\n 根据参数生成wav文件头,返回Uint8Array(format=1时固定返回44字节,其他返回46字节)\n format: 1 (raw pcm) 2 (ADPCM) 3 (IEEE Float) 6 (g711a) 7 (g711u)\n numCh: 声道数\n dataLength: wav中的音频数据二进制长度\n **/\n Recorder.wav_header = function (format, numCh, sampleRate, bitRate, dataLength) {\n //文件头 http://soundfile.sapp.org/doc/WaveFormat/ https://www.jianshu.com/p/63d7aa88582b https://github.com/mattdiamond/Recorderjs https://www.cnblogs.com/blqw/p/3782420.html https://www.cnblogs.com/xiaoqi/p/6993912.html\n var extSize = format == 1 ? 0 : 2;\n var buffer = new ArrayBuffer(44 + extSize);\n var data = new DataView(buffer);\n var offset = 0;\n var writeString = function (str) {\n for (var i = 0; i < str.length; i++, offset++) {\n data.setUint8(offset, str.charCodeAt(i));\n }\n ;\n };\n var write16 = function (v) {\n data.setUint16(offset, v, true);\n offset += 2;\n };\n var write32 = function (v) {\n data.setUint32(offset, v, true);\n offset += 4;\n };\n\n /* RIFF identifier */\n writeString('RIFF');\n /* RIFF chunk length */\n write32(36 + extSize + dataLength);\n /* RIFF type */\n writeString('WAVE');\n /* format chunk identifier */\n writeString('fmt ');\n /* format chunk length */\n write32(16 + extSize);\n /* audio format */\n write16(format);\n /* channel count */\n write16(numCh);\n /* sample rate */\n write32(sampleRate);\n /* byte rate (sample rate * block align) */\n write32(sampleRate * (numCh * bitRate / 8)); // *1 声道\n /* block align (channel count * bytes per sample) */\n write16(numCh * bitRate / 8); // *1 声道\n /* bits per sample */\n write16(bitRate);\n if (format != 1) {\n // ExtraParamSize 0\n write16(0);\n }\n /* data chunk identifier */\n writeString('data');\n /* data chunk length */\n write32(dataLength);\n return new Uint8Array(buffer);\n };\n});","map":{"version":3,"names":["factory","browser","window","document","win","Object","rec","Recorder","ni","i18n","$T","isBrowser","prototype","enc_wav","stable","fast","getTestMsg","NormalizeSet","set","bS","bitRate","b","CLog","wav","res","True","False","This","size","length","sampleRate","dataLength","header","wav_header","offset","bytes","Uint8Array","i","val","Int16Array","buffer","format","numCh","extSize","ArrayBuffer","data","DataView","writeString","str","setUint8","charCodeAt","write16","v","setUint16","write32","setUint32"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/recorder-core/src/engine/wav.js"],"sourcesContent":["/*\nwav编码器+编码引擎\nhttps://github.com/xiangyuecn/Recorder\n\n当然最佳推荐使用mp3、wav格式,代码也是优先照顾这两种格式\n浏览器支持情况\nhttps://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats\n\n编码原理:给pcm数据加上一个44字节的wav头即成wav文件;pcm数据就是Recorder中的buffers原始数据(重新采样),16位时为LE小端模式(Little Endian),实质上是未经过任何编码处理\n\n注意:其他wav编码器可能不是44字节的头,要从任意wav文件中提取pcm数据,请参考:assets/runtime-codes/fragment.decode.wav.js\n*/\n(function(factory){\n\tvar browser=typeof window==\"object\" && !!window.document;\n\tvar win=browser?window:Object; //非浏览器环境,Recorder挂载在Object下面\n\tvar rec=win.Recorder,ni=rec.i18n;\n\tfactory(rec,ni,ni.$T,browser);\n}(function(Recorder,i18n,$T,isBrowser){\n\"use strict\";\n\nRecorder.prototype.enc_wav={\n\tstable:true,fast:true\n\t,getTestMsg:function(){\n\t\treturn $T(\"gPSE::支持位数8位、16位(填在比特率里面),采样率取值无限制;此编码器仅在pcm数据前加了一个44字节的wav头,编码出来的16位wav文件去掉开头的44字节即可得到pcm(注:其他wav编码器可能不是44字节)\");\n\t}\n};\n\nvar NormalizeSet=function(set){\n\tvar bS=set.bitRate,b=bS==8?8:16;\n\tif(bS!=b) Recorder.CLog($T(\"wyw9::WAV Info: 不支持{1}位,已更新成{2}位\",0,bS,b),3);\n\tset.bitRate=b;\n};\n\nRecorder.prototype.wav=function(res,True,False){\n\tvar This=this,set=This.set;\n\t\n\tNormalizeSet(set);\n\tvar size=res.length,sampleRate=set.sampleRate,bitRate=set.bitRate;\n\tvar dataLength=size*(bitRate/8);\n\t\n\t//生成wav头\n\tvar header=Recorder.wav_header(1,1,sampleRate,bitRate,dataLength);\n\tvar offset=header.length;\n\tvar bytes=new Uint8Array(offset+dataLength);\n\tbytes.set(header);\n\t\n\t// 写入采样数据\n\tif(bitRate==8) {\n\t\tfor(var i=0;i>8)+128;\n\t\t\tbytes[offset++]=val;\n\t\t};\n\t}else{\n\t\tbytes=new Int16Array(bytes.buffer);//长度一定是偶数\n\t\tbytes.set(res,offset/2);\n\t};\n\t\n\tTrue(bytes.buffer,\"audio/wav\");\n};\n\n/**\n根据参数生成wav文件头,返回Uint8Array(format=1时固定返回44字节,其他返回46字节)\nformat: 1 (raw pcm) 2 (ADPCM) 3 (IEEE Float) 6 (g711a) 7 (g711u)\nnumCh: 声道数\ndataLength: wav中的音频数据二进制长度\n**/\nRecorder.wav_header=function(format,numCh,sampleRate,bitRate,dataLength){\n\t//文件头 http://soundfile.sapp.org/doc/WaveFormat/ https://www.jianshu.com/p/63d7aa88582b https://github.com/mattdiamond/Recorderjs https://www.cnblogs.com/blqw/p/3782420.html https://www.cnblogs.com/xiaoqi/p/6993912.html\n\tvar extSize=format==1?0:2;\n\tvar buffer=new ArrayBuffer(44+extSize);\n\tvar data=new DataView(buffer);\n\t\n\tvar offset=0;\n\tvar writeString=function(str){\n\t\tfor (var i=0;i