高级音频编码AAC音频压缩学习
声音的录制需要设置采样率,声道数量和编码格式。采样率是说:每秒钟采集声音的次数,单位是赫兹(Hz),一般在android录音中,代码里都写44100的采样率,采样率越高,采集到的音频信息越丰富,但在软件里占用的字节也更多。声道一般是写2个,双声道,声音更立体,声道配置多一个,会多占一倍的字节空间。编码格式一般写:ENCODING_PCM_16BIT。
经过设备录音的原始数据是会占用很多字节的,大概录制10分钟就会产生100多兆的原始数据,所以就有音频压缩技术的出现,帮助提高录音效率。常见的mp3格式的文件就是使用的mp3压缩技术,mp3的压缩比是1:10,也就是10分钟的原始音频数据经压缩后只有10兆大小。而这个AAC音频编码是比mp3压缩技术更先进的音频压缩技术。
AAC的压缩比是1:20,也就是10分钟的原始数据100兆,经过它的压缩后,数据就只有5兆大小。虽然它压缩了很多数据,但对于人来说,压缩后的声音的质量却比mp3压缩后的质量总体要高。AAC编码后的音频是需要解码的,它的解码效率也是很高的。AAC有两种数据保存格式:一种是ADIF,另一种是ADTS。它们两者的区别是,第一种不能在随机音频播放位置播放,也就是不能快进,后退什么的,只能从开头播放。另一种可以随机位置播放。我们在开发中一般就用ADTS的数据格式保存。
ADTS其实,是在原始数据经过压缩后的每帧音频的头部增加的一个头部数组,每帧音频数据都有。这个数组中的每个位置的数据都有它自己的含义。经过AAC压缩后的音频在解码时,都会先根据头部信息去解码压缩后的音频数据。
在开发中,需要自己在MediaCode的编码的输出字节数组中,给加上这个头部信息,然后在我们播放时的解码过程就不需要再去指定这个头部信息了。在开发过程中,还需要保证编码和解码所配置的采样率、声道的配置保持一致;还需要为MediaCode的输入的buffer指定足够的空间,否则会报overflow异常。如果解码时,输出的buffer总是返回-1,很可能是编码的配置和解码的配置不一致造成的。
开发参考文章:
https://juejin.cn/post/6844903929440911367,这边文章的ADTS可以参考,我用了是可以的。
https://blog.csdn.net/mozushixin_1/article/details/92830785,这篇文章,有些地方是不对的,它的ADTS计算时是用的采样率是44100,而他在代码中MediaCode配置的采样率是8000,不过他的这些部分可以参考:

就是配置是否有ADTS头和csd_0数组的计算方式可以参考。然后就是这个128000,是说的波特率,表示录音硬件设备每秒发送128000个数据位给软件,8bit=1byte,可以计算一下每秒是上传15.625kb的数据。波特率越高,其android设备上的硬件上传数据的效率就越高。

浙公网安备 33010602011771号