标准G726音频解码和与H264视频封装为avi

avilib库并不能直接支持G726音频的封装,源码中只支持G711A、G711U和MULAW_PCM,但查看源码可发现,avilib其实也是将G711U等音频先解码为16位linear PCM,再将PCM与H264封装为avi格式音视频,从而实现G711U等与H264的封装。因此我们可以将G726先解码为linear PCM,再用avilib接口将音视频封装为avi文件。

线性PCM是最原始的音频数据,各种格式的音频都可以由线性PCM经过一系统压缩算法而得到。 G.726是ITU-T定义的音频编码算法,有16kbps、24kbps、32kbps、40kbps四种比特率,不同的比特率区别在于码字的不同,其采样率都是8000HZ。 G.726编解码器把 128kbit/s 线性数据(64kbit/s PCM数据)压缩为 16kbit/s、24kbit/s、32kbit/s、40kbit/s 数据压缩比分别为8:1、16:3、4:1和16:5,码字分别为2、3、4和5 bits。采用越高压缩比,码率越小,质量越差。

将G726解码为PCM可利用标准的G726解码库,网上有源码可供下载,这里提供我所用的一个开源源码,https://download.csdn.net/download/zqj6893/5649281。在解码时要注意,g726_decode()的返回值应该*2再返回给上一级调用。

自己解码封装过程中所遇见的问题:

(1)解码G726后并封装为avi文件后,音视频只有视频没有声音,后来在网上看到一个可以分析avi文件格式的软件AtomicBrowser,将我的avi文件与正常的avi文件比较分析后发现,是在封装过程中没有正确设置avi文件音频的通道、频率等参数。之后检查代码发现没有是使用avilib库中的AVI_set_audio()接口进行设置所致,使用该接口并填入正确的参数后便有了声音。

标准G726音频解码和与H264视频封装为avi

(2)解决avi文件没有声音的问题后,发现虽然视频有声音,但都是噪音,猜想很可能是音频填入的参数,于是仔细检查代码,发现g726_decode()解码之后的返回值没有*2,改过后声音就正常了。

 

注意:海思平台的G726解码可能和标准的不一样。

参考:https://blog.csdn.net/byxdaz/article/details/83183770

https://blog.csdn.net/byxdaz/article/details/78430490

https://blog.csdn.net/li_wen01/article/details/80623580

https://blog.csdn.net/chinadragon76/article/details/22917003