WAV格式音频转G.711A

本文介绍了将从微信获取的AMR格式音频转换为终端设备支持的G.711A格式的过程。首先通过AMR转WAV,然后提取PCM数据,再将其压缩为G.711A。详细解析了WAV文件格式,并提供了读取WAV音频数据的代码,以及PCM到G711A编码的算法。在实践中遇到噪音问题,通过修正PCM取值方式得以解决。
摘要由CSDN通过智能技术生成

        有个项目,要求从微信录音,远程传输到终端设备广播。终端只支持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++)
                {
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值