为什么要进行音频编码?
在音视频开发过程中,无论是进行传输还是本地保存,都是希望采用比较小的资源获得更好的效果。在本地存储相对来说要好很多,目前的计算机本地存储还是比较大的。但是相对于有一些资源不是很充足的计算机来说,就不是那么友好了。比如一般的mac book。本地存储只有那么几百个G而已,安装一个xcode或者其他的ide,硬盘空间就所剩无几了。
尤其是需要传输的音频中,众所周知,目前的带宽还是比较昂贵的(对我来说)。因此希望把数据压缩再传输出去。这样有限带宽能传输更多的资源。说了这么多,到底音频能有多费资源呢?根据上一篇的内容可以计算出,假如有一路音频,采样率44.1khz(回顾一下,常见的音频采样率,22khz,44.1khz,48khz,96khz,192khz。那么这么多的采样率常用于哪里?如果忘记了,可以参见上一篇,加深一下映像),双通道,16位其码率为:
44.1khz x 2 x 16bit = 1.411Mbit/s
从这个数据来看,每秒1.411Mbit数据量还是比较大的。比如100M带宽的话能带职能带70多路。这样一算其实还是比较大的。那么应该如何减少码率呢?
压缩原理
刚才也算了一下,数据量还是比较大的,那么如何减少数据量呢。是不是把一些没有用的数据去掉就可以了呢?个人觉得就应该这么干。那么什么数据不需要呢?就是人耳听不到的就可以理解为无效数据。在这引出了“频谱屏蔽效应”和“时域屏蔽效应”。
频谱屏蔽效应
人耳能听到的频率范围是20hz ~ 20khz,那么低于这个频率的和高于这个频率的就可以去掉了。称之为 频谱屏蔽效应。
从网上找了一张图,更加方便自己的理解,如下图:
y轴为音量强度,x轴为声音频率。从图中可以看出,人耳对声音最敏感的事2khz~5khz。声音比较小的时候,人耳也是可以听到。对其他的频率的反应都不是很好。在接近20khz的事声音需要很大的时候,人耳才会听见,0.02khz的时候,也需要差不多80db人耳才能有感觉。那么在0.2khz的频率上,出现一个60db的声音,那么其附近的频率的音量值需要提高很高,人耳才能感觉到。那在编码过程,被掩蔽的音频音量就不进行编码了。
时域屏蔽效应
根据人的听觉系统和心理作用的情况下,当一个强音量的和一个弱音量的声音出现时,往往只会感觉只有一个强音量的声音(两个音量相差比较大)。这种称之为时域屏蔽效应。同时我也在网上找了一张图,便于理解
图中,y轴表示声音强度,x轴表示时间。时域掩蔽又可以分成三种,超前掩蔽和同时掩蔽以及滞后掩蔽。
超前掩蔽
当出现一个强音量出现的很短时间内,人耳对一个弱音量的声音,敏感度会降低。从而感觉上我们是听不到的。
同时掩蔽
同时存在一个强音量和弱音量的声音时,通常对弱音量敏感度也会降低,感觉我们只是听到了一个声音
滞后掩蔽
存在这样的一种场景,当一个音量特别大的声音出现时,短暂的失聪应该很多人都有感觉,不在叙述。
常用编码器
oplus : 常用于音频通话
aac:rtmp直播
mp3:本地文件
ac3和eac3 等等