有个项目,要求从微信录音,远程传输到终端设备广播。终端只支持G.711A格式,而从微信获取的音频文件是AMR格式(具体获取见微信开发文档),所以就需要音频转码。以前没有做过音频开发,对各种格式不了解,花了几天学习AMR、WAV、G.711等格式编解码,定下技术方案:把AMR转码成WAV,然后提取PCM数据,再压缩成G.711A。在AMR转WAV时,没弄明白AMR格式中每帧数据去掉帧头后那段数据该怎么编解码,不得已只好用ffmpeg转成WAV临时解决。
WAV格式:
//wav文件格式:
//0-3字节:RIFF标识
//4-7字节:文件长度
//8-11字节:WAVE标识
//12-15字节:fmt 标识,最后有个空格符
//16-19字节:文件内部格式信息块大小
//20-21字节:音频编码方式,1表示PCM格式
//22-23字节:声道数,单声道1,双声道2
//24-27字节:采样率,比如44100
//20-31字节:音频传输速率,单位字节
//32-33字节:每次采样的字节数,例如,双声道16位,就是4字节
//34-35字节:采样值的精度,8bit 16bit 24bit
//[附加数据 2字节]
//[可选块 12字节]
//36-39字节:data标识
//40-43字节:音频数据长度
//...................:PCM音频数据
获取音频数据部分代码:
int channel = (data[23] << 8) + data[22];
//获取每次采用的字节数
int bytesPerSample = (data[33] << 8) + data[32];
//查找data标记
int index = 36;
for (; index < data.Length; index++)
{