音频编码
去年做了很多关于音频方面的开发工作,自己从一个完全的门外汉,一步一步的模索,趟过了不少的坑,学习和掌握到了不少的关于音频编码方面的知识,鉴于这一块的资料较少,而很多朋友在基础上有较多迷惑的地方,写一篇文章,简要的描述一下音频方面的几个基础的知识点。
名词解释
- PCM:脉冲信号调制
- 采样率:每秒采样几个点进行模拟量到数字量
- 通道:声道,有几个麦克风
- 模数转换ADC:将连续的模拟量使用离散的数字进行表示的方法
声音采集与模数转换
因为人耳敏感的声音频率,大约是20Hz~20000Hz之间,所以计算机里,通常使用一个16位的数字来表示一个采样点的数字量(-32767 ~ 32767),也叫做位深度。16的位深度下,精度大约是1Hz,而在24位下,精度大约到0.001Hz,采样精度更加准确。
假如单通道,采样率8000(每秒取8000个点进行模拟到数字量的转换),那每秒将产生 8000 * 1 * (16 / 8) = 16000
个字节的数据量产生。
采样率 | 通道数 | 位数 | 每秒数据量 | kB |
---|---|---|---|---|
8000 | 1 | 16 | 16000 | 15.63kB |
44100 | 1 | 16 | 88200 | 86.13kB |
48000 | 1 | 16 | 96000 | 93.75kB |
96000 | 1 | 16 | 192000 | 187.50kB |
192000 | 1 | 16 | 384000 | 375.00kB |
8000的采样率太低,只适用于低要求下的人声传输,一般按44.1kHz的采样率,每秒产生的数据量为93.75kB,这个数据量太大了,对于网络传输来说,相当的不利,所以在车载终端这一块,通常使用最低能够接受的8000采样率来录制声音,同时配合G711A等简单、快速的编码方法,来进一步降低数据量的大小,因为终端CPU性能比较低下,需要节省出来,交给其它的事务。
影响音质的关键要素
- 位深度:决定了每个采样点的精度,比如16位/24位
- 采样率:决定了每秒采样的次数,比如常见的44100Hz
通过上面的理论而推断,影响音质的最根本的参数在于上面的两个参数,它也决定了最终产生的音频数据量的大小。
编码与压缩
一般的编码方式,如G711A、G711U、ADPCM、G726等,是对PCM数据的无损编码方法,通常会达到50%或25%的压缩率(即原数据的一半或四分之一)。
而对于MP3、AAC等高级压缩算法,会通过有损压缩,去除掉一些人耳不敏感的采样点,通常能够达到非常高的压缩比。
常用工具
- Audacity:一个开源免费、跨平台的音频处理的图形化工具,支持很多种编码的音频解析,以及很多种音效的处理,大力推荐。
- ffmpeg:ffmpeg支持很多种音频编码与压缩算法的实现,可以在各种音频编码间转换,特别是ffplay,支持无封装的比如G711A的裸数据文件的播放。
提交留言: