1 |
- {"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<size;i++) {\n\t\t\t//16转8据说是雷霄骅的 https://blog.csdn.net/sevennight1989/article/details/85376149 细节比blqw的按比例的算法清晰点\n\t\t\tvar val=(res[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<str.length;i++,offset++) {\n\t\t\tdata.setUint8(offset,str.charCodeAt(i));\n\t\t};\n\t};\n\tvar write16=function(v){\n\t\tdata.setUint16(offset,v,true);\n\t\toffset+=2;\n\t};\n\tvar write32=function(v){\n\t\tdata.setUint32(offset,v,true);\n\t\toffset+=4;\n\t};\n\t\n\t/* RIFF identifier */\n\twriteString('RIFF');\n\t/* RIFF chunk length */\n\twrite32(36+extSize+dataLength);\n\t/* RIFF type */\n\twriteString('WAVE');\n\t/* format chunk identifier */\n\twriteString('fmt ');\n\t/* format chunk length */\n\twrite32(16+extSize);\n\t/* audio format */\n\twrite16(format);\n\t/* channel count */\n\twrite16(numCh);\n\t/* sample rate */\n\twrite32(sampleRate);\n\t/* byte rate (sample rate * block align) */\n\twrite32(sampleRate*(numCh*bitRate/8));// *1 声道\n\t/* block align (channel count * bytes per sample) */\n\twrite16(numCh*bitRate/8);// *1 声道\n\t/* bits per sample */\n\twrite16(bitRate);\n\tif(format!=1){// ExtraParamSize 0\n\t\twrite16(0);\n\t}\n\t/* data chunk identifier */\n\twriteString('data');\n\t/* data chunk length */\n\twrite32(dataLength);\n\t\n\treturn new Uint8Array(buffer);\n};\n\n}));"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACC,WAASA,OAAO,EAAC;EACjB,IAAIC,OAAO,GAAC,OAAOC,MAAM,IAAE,QAAQ,IAAI,CAAC,CAACA,MAAM,CAACC,QAAQ;EACxD,IAAIC,GAAG,GAACH,OAAO,GAACC,MAAM,GAACG,MAAM,CAAC,CAAC;EAC/B,IAAIC,GAAG,GAACF,GAAG,CAACG,QAAQ;IAACC,EAAE,GAACF,GAAG,CAACG,IAAI;EAChCT,OAAO,CAACM,GAAG,EAACE,EAAE,EAACA,EAAE,CAACE,EAAE,EAACT,OAAO,CAAC;AAC9B,CAAC,EAAC,UAASM,QAAQ,EAACE,IAAI,EAACC,EAAE,EAACC,SAAS,EAAC;EACtC,YAAY;;EAEZJ,QAAQ,CAACK,SAAS,CAACC,OAAO,GAAC;IAC1BC,MAAM,EAAC,IAAI;IAACC,IAAI,EAAC,IAAI;IACpBC,UAAU,EAAC,SAAAA,CAAA,EAAU;MACrB,OAAON,EAAE,CAAC,gHAAgH,CAAC;IAC5H;EACD,CAAC;EAED,IAAIO,YAAY,GAAC,SAAAA,CAASC,GAAG,EAAC;IAC7B,IAAIC,EAAE,GAACD,GAAG,CAACE,OAAO;MAACC,CAAC,GAACF,EAAE,IAAE,CAAC,GAAC,CAAC,GAAC,EAAE;IAC/B,IAAGA,EAAE,IAAEE,CAAC,EAAEd,QAAQ,CAACe,IAAI,CAACZ,EAAE,CAAC,kCAAkC,EAAC,CAAC,EAACS,EAAE,EAACE,CAAC,CAAC,EAAC,CAAC,CAAC;IACxEH,GAAG,CAACE,OAAO,GAACC,CAAC;EACd,CAAC;EAEDd,QAAQ,CAACK,SAAS,CAACW,GAAG,GAAC,UAASC,GAAG,EAACC,IAAI,EAACC,KAAK,EAAC;IAC9C,IAAIC,IAAI,GAAC,IAAI;MAACT,GAAG,GAACS,IAAI,CAACT,GAAG;IAE1BD,YAAY,CAACC,GAAG,CAAC;IACjB,IAAIU,IAAI,GAACJ,GAAG,CAACK,MAAM;MAACC,UAAU,GAACZ,GAAG,CAACY,UAAU;MAACV,OAAO,GAACF,GAAG,CAACE,OAAO;IACjE,IAAIW,UAAU,GAACH,IAAI,IAAER,OAAO,GAAC,CAAC,CAAC;;IAE/B;IACA,IAAIY,MAAM,GAACzB,QAAQ,CAAC0B,UAAU,CAAC,CAAC,EAAC,CAAC,EAACH,UAAU,EAACV,OAAO,EAACW,UAAU,CAAC;IACjE,IAAIG,MAAM,GAACF,MAAM,CAACH,MAAM;IACxB,IAAIM,KAAK,GAAC,IAAIC,UAAU,CAACF,MAAM,GAACH,UAAU,CAAC;IAC3CI,KAAK,CAACjB,GAAG,CAACc,MAAM,CAAC;;IAEjB;IACA,IAAGZ,OAAO,IAAE,CAAC,EAAE;MACd,KAAI,IAAIiB,CAAC,GAAC,CAAC,EAACA,CAAC,GAACT,IAAI,EAACS,CAAC,EAAE,EAAE;QACvB;QACA,IAAIC,GAAG,GAAC,CAACd,GAAG,CAACa,CAAC,CAAC,IAAE,CAAC,IAAE,GAAG;QACvBF,KAAK,CAACD,MAAM,EAAE,CAAC,GAACI,GAAG;MACpB;MAAC;IACF,CAAC,MAAI;MACJH,KAAK,GAAC,IAAII,UAAU,CAACJ,KAAK,CAACK,MAAM,CAAC,CAAC;MACnCL,KAAK,CAACjB,GAAG,CAACM,GAAG,EAACU,MAAM,GAAC,CAAC,CAAC;IACxB;IAAC;IAEDT,IAAI,CAACU,KAAK,CAACK,MAAM,EAAC,WAAW,CAAC;EAC/B,CAAC;;EAED;AACA;AACA;AACA;AACA;AACA;EACAjC,QAAQ,CAAC0B,UAAU,GAAC,UAASQ,MAAM,EAACC,KAAK,EAACZ,UAAU,EAACV,OAAO,EAACW,UAAU,EAAC;IACvE;IACA,IAAIY,OAAO,GAACF,MAAM,IAAE,CAAC,GAAC,CAAC,GAAC,CAAC;IACzB,IAAID,MAAM,GAAC,IAAII,WAAW,CAAC,EAAE,GAACD,OAAO,CAAC;IACtC,IAAIE,IAAI,GAAC,IAAIC,QAAQ,CAACN,MAAM,CAAC;IAE7B,IAAIN,MAAM,GAAC,CAAC;IACZ,IAAIa,WAAW,GAAC,SAAAA,CAASC,GAAG,EAAC;MAC5B,KAAK,IAAIX,CAAC,GAAC,CAAC,EAACA,CAAC,GAACW,GAAG,CAACnB,MAAM,EAACQ,CAAC,EAAE,EAACH,MAAM,EAAE,EAAE;QACvCW,IAAI,CAACI,QAAQ,CAACf,MAAM,EAACc,GAAG,CAACE,UAAU,CAACb,CAAC,CAAC,CAAC;MACxC;MAAC;IACF,CAAC;IACD,IAAIc,OAAO,GAAC,SAAAA,CAASC,CAAC,EAAC;MACtBP,IAAI,CAACQ,SAAS,CAACnB,MAAM,EAACkB,CAAC,EAAC,IAAI,CAAC;MAC7BlB,MAAM,IAAE,CAAC;IACV,CAAC;IACD,IAAIoB,OAAO,GAAC,SAAAA,CAASF,CAAC,EAAC;MACtBP,IAAI,CAACU,SAAS,CAACrB,MAAM,EAACkB,CAAC,EAAC,IAAI,CAAC;MAC7BlB,MAAM,IAAE,CAAC;IACV,CAAC;;IAED;IACAa,WAAW,CAAC,MAAM,CAAC;IACnB;IACAO,OAAO,CAAC,EAAE,GAACX,OAAO,GAACZ,UAAU,CAAC;IAC9B;IACAgB,WAAW,CAAC,MAAM,CAAC;IACnB;IACAA,WAAW,CAAC,MAAM,CAAC;IACnB;IACAO,OAAO,CAAC,EAAE,GAACX,OAAO,CAAC;IACnB;IACAQ,OAAO,CAACV,MAAM,CAAC;IACf;IACAU,OAAO,CAACT,KAAK,CAAC;IACd;IACAY,OAAO,CAACxB,UAAU,CAAC;IACnB;IACAwB,OAAO,CAACxB,UAAU,IAAEY,KAAK,GAACtB,OAAO,GAAC,CAAC,CAAC,CAAC,CAAC;IACtC;IACA+B,OAAO,CAACT,KAAK,GAACtB,OAAO,GAAC,CAAC,CAAC,CAAC;IACzB;IACA+B,OAAO,CAAC/B,OAAO,CAAC;IAChB,IAAGqB,MAAM,IAAE,CAAC,EAAC;MAAC;MACbU,OAAO,CAAC,CAAC,CAAC;IACX;IACA;IACAJ,WAAW,CAAC,MAAM,CAAC;IACnB;IACAO,OAAO,CAACvB,UAAU,CAAC;IAEnB,OAAO,IAAIK,UAAU,CAACI,MAAM,CAAC;EAC9B,CAAC;AAED,CAAC,CAAC","ignoreList":[]},"metadata":{},"sourceType":"script","externalDependencies":[]}
|