音频基础与音频编码(AMR和PCM)
1、音频基础
1.1 声音是什么
引用百度百科中对声音的一段描述:
声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线。波是无限光滑的,弦线可以看成由无数点组成,由于存储空间是相对有限的,数字编码过程中,必须对弦线的点进行采样。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复原波形,一次 振动中,必须有2个点的采样,人耳能够感觉到的最高频率为20kHz,因此要满足人耳的听觉要求,则需要至少每秒进行40k次采样,用40kHz表达,这个40kHz就是采样率
大致来说,声音需要以下过程才能转变成计算机所能识别的音频编码:
![bd115d163cee0442e942d4e8f69840dd.png](https://i-blog.csdnimg.cn/blog_migrate/c94894ce08e3e6bc48e3be645e510abe.png)
在介绍音频编码的整体知识之前,我们先认识在音频编码中的一些专业术语以及名词。
* 码率/比特率 = 采样率*采样大小*声道数 - 一般情况码率越高代表音频质量越高
* 采样率:每秒从连续信号中提取并组成离散信号的采样个数,一般为44.1KHz 16KHz 8KHz
* 采样大小:将采样个数的采样数据进行整合的单位大小,一般为16bit,8bit,即为一次1字节或者2字节,采样大小越大会使得音频更清晰。
人耳听见的声音范围是20Hz-20KHz,所以根据采样率来计算,每秒40KHz的采样率可以采样20Hz的声音2000次,采样20KHz的声音2次,而生活中大部分的声音都是低频的,所以40KHz采样率已经可以让声音极大程度的还原了。
1.2 有损和无损
我们经常会讨论说音频的有损和无损,其实呢,有损和无损是相对的。相对于大自然中的原始声音,计算机中音频无论怎么编码都是有损的,无法做到完全的复原。而我们大多数人口中的无损一般是指音频采样率为44.1KHz、采样大小16bit、双声道的音频,有损自然是相较于质量差的音频了。
2、音频编码
2.1 PCM
引用百度百科中对PCM的概念描述:
PCM 脉冲编码调制是Pulse Code Modulation的缩写。前面的文字我们提到了PCM大致的工作流程,我们不需要关心PCM最终编码采用的是什么计算方式,我们只需要知道PCM编码的音频流的优点和缺点就可以了。PCM编码的最大的优点就是音质好,最大的缺点就是体积大。我们常见的Audio CD就采用了PCM编码,一张光盘的容量只能容纳72分钟的音乐信息。
PCM是一种波形编码,其记录的信息会尽可能的接近原始采集的信息,没有经过处理,所以体积大。一般来说,较高音质的PCM 1秒需要170KB的大小来存储。
2.2 AMR
AMR音频编码下面又分为两种,分别为:Amr-nb 和 Amr-wb
AMR-NB一般代表8bit 采样大小 8KHz 采样率的音频
AMR-WB一般代表16bit 采样大小 16KHz 采样率的音频
AMR一般用于语音通信的音频数据传输,其具有体积小,转码快,音质能满足基本需求的特点。
一般来说 1秒需要8KB左右
2.3 PCM编码
一段PCM编码的数据结构是非常简单的。因为PCM编码仅仅是将采样的音频数据原样的放起来,所以数据中并没有保存采样率,采样大小等信息。
对于一个16bit双声道的PCM编码数据如下:
![ded87aaf560ac87784b8c7a7ab48e622.png](https://i-blog.csdnimg.cn/blog_migrate/43692cf8ef4bdaa4060a8fc788c95052.jpeg)
上图采样大小为16bit,每一次采样的氛围高8位和低8位。有两个声道,所以是按照声道0,1,0,1依次排列。
在音频里面,帧这个概念不如视频那么明显。对于音频来说,一帧可以变化的,对于44.1 KHz采样率的音频来说,通常1024个采样点为一帧。这样一帧的时间是23.22ms。由于在实际播放中,用户可以调整播放的速度,音频的加快或方面,所以加速播放即为让更多的采样点变为一帧,反之亦然。
2.4 AMR-NB编码
这里我们主要讨论AMR-NB,AMR-WB不做讨论。
首先AMR编码和PCM编码有着很大的不同,也不属于一种编码模型。
AMR编码器将原始的音频数据(PCM)经过AMR编码的模型处理后,才能得出AMR的音频数据。这个过程叫做编码。AMR编码模型主要分为以下几种:
![cd0067f9eca5608cd38efb333efbc35f.png](https://i-blog.csdnimg.cn/blog_migrate/2e19d9d2eb830ddc1ba1173a8c9b698d.jpeg)
这里我们主要以AMR_12.20来分析。其余的可以举一反三。
AMR_12.20 - 12.20kbps 代表码率为12.20kbps的AMR音频。
首先我们来看AMR音频文件的结构。
AMR文件头为6个字节固定,以这6个字节打头代表这是一个音频文件。
![4a15a645994f0434a243a0bbc4823049.png](https://i-blog.csdnimg.cn/blog_migrate/fa4bc79870d4b24c34eb551c4ee748c5.jpeg)
在AMR编码中,
1帧 = 20ms 1s = 50帧。
所以对于我们所选的AMR_12.20编码模型来说。我们可以倒退每一帧所需要的大小。
AMR_12.20 - 12.2 kbps
1帧 = 12200 / 50 = 244bit = 30.5Byte
而每一个语音帧都有1个字节的帧头。
所以一帧的大小为:
1Byte(帧头) + 30.5Byte(数据) ≈ 32Byte
![c8d1e1624ff249695316ab1da953d26d.png](https://i-blog.csdnimg.cn/blog_migrate/72ab45c51488f115bdc203c3b171fb12.png)
那么这30.5个字节的音频数据和PCM也是有很大区别的,主要结构如下:
![2948ddad8826524e93d20fba26ed5c3d.png](https://i-blog.csdnimg.cn/blog_migrate/27e6f88a205ef10cf23371d2d52a5ab5.jpeg)
这里解释一下每一个部分的作用:
AMR辅助信息这一块,一般来说记录这这个帧的类型,是否坏帧,以及一些其他帧的参数。这里就不做更加深入的介绍了,如需了解,可以查阅AMR-NB的相关编码文档。
Class A部分为整个音频帧数据最重要的部分,我们可以以重要程度排序为:
Class A > Class B > Class C
这三个Class都存储着AMR音频数据。我们可以理解为,如果Class A的数据缺失或者损坏,那么这一段音频帧将无法播放被丢弃。而Class C缺失或损坏依然不影响播放。
AMR 编码参考资料(RFC3276):
http://www.rfc-editor.org/rfc/rfc3267.txt
以上就是PCM和AMR编码的基本介绍。