本文记录一点工作经验,讨论音频文件的格式。访问我的博客某源的pcm文件当时处理了一些技巧,后台记录一下:业务需求,在web后台播放pcm文件,文件不大(300KB左右,已知的pcm的参数采样率为16000,采样位数为16,如何播放声道数1浏览器不能直接播放pcm音频,因为pcm是一种比较原始的音频格式:PCM(PulsCodeModulation)全称脉冲编码调制录音,PCM录音是将声音的模拟信号表示为0,1标识的数字信号没有经过编码和压缩,所以可以认为PCM是一种未压缩的音频原始格式。PCM格式文件确实不包含头信息,播放器不知道采样率,声道数,采样位数,音频数据大小等信息,导致无法播放。如何让浏览器识别pcm浏览器可以播放另一种音频格式:WAV格式的全称是WAVE。前面说了,只需要在PCM文件前面加上WAV文件头即可。生成一个WAV格式的文件,所以我的方案是给pcm加上一个wav头,接下来就是浏览器javascript的实践,对javascript如何处理文件流进行编码。js常用于处理文件流和网络数据。ArrayBuffer类型,关于ArrayBuffer类型方法的API调用需要先验知识。第一步,ajax异步获取网络pcm文件的ArrayBufferconstgetWebFileArrayBuffer=async(url)=>{returnawaitfetch(url).then(response=>response.arrayBuffer())}第二步获取pcmfilestream在ArrayBuffer中添加wavheader,先了解一下header的结构:看上图,我们需要在获取的pcm数据中添加44字节的header,根据header的结构,对齐紧凑的填充信息way,在javascript中,我们需要使用DataView类型帮助我们进行字节填充操作。注意DataView提供的API默认使用小端数据格式,需要额外定义大端格式填充字节的方法。下面的代码说明了如何逐步填充字节信息:constgetWebPcm2WavArrayBuffer=async(url)=>{constbytes=awaitgetWebFileArrayBuffer(url)returnaddWavHeader(bytes,16000,16,1)//这里是当前业务需求,具体参数,采样率16000,样本数16,通道数1}constaddWavHeader=function(samples,sampleRateTmp,sampleBits,channelCount){letdataLength=samples.byteLength/*newbufferclass,reservedfor44bytes♂heaerspace*/letbuffer=newArrayBuffer(44+dataLength)/*转换为Dataview,使用API??填充字节*/letview=newDataView(buffer)/*定义一个内部函数将bigenddataFormatfillstringtoDataView*/functionwriteString(view,offset,string){for(leti=0;i
