萨尔瓦多·Rio Sapo
(本文基本逻辑:音频编码的理论基础 → PCM 编码 → AAC 编码工具集、编码流程、编码规格和数据格式)
对音频或视频进行编码最重要目的就是为了进行数据压缩,以此来降低数据传输和存储的成本。
拿音频来举例,一路采样率为 44100 Hz,量化位深为 16 bit,声道数为 2 的声音,如果不进行编码压缩,对应的码率是:。一分钟的时间所需要的数据量是:。
对于单单一路音频来说,这个数据量还是比较大的,在存储或传输时如果能进行压缩编码,可以一定程度上提高效率。
通常,对信息进行压缩,可以从这几个方面着手:
要对音频数据进行编码压缩,主要是寻找音频数据中的冗余信息对其进行压缩:
1)时域冗余
音频信号时域上的冗余主要表现为下面几个方面:
2)频域冗余
音频信号频域上的冗余主要表现为下面几个方面:
3)听觉冗余
人是音频信号的最终用户,因此,要充分利用人类听觉的生理和心理特性对音频信号感知的影响。利用人耳的频率特性灵敏度以及掩蔽效应,可以压缩数字音频的数据量:
人耳的掩蔽效应包括下面几种:
对音频进行编码常见的格式有:
PCM 是音频原始数据的基础格式;AAC 则在短视频和直播场景广泛使用。这里,我们只详细介绍一下 PCM 和 AAC。
PCM 是指脉冲编码调制(Pulse Code Modulation),是数字通信的编码方式之一,是一种将模拟信号数字化的方法。主要过程是将话音等模拟信号每隔一定时间进行取样,使其离散化,同时将抽样值按分层单位四舍五入取整量化,同时将抽样值按一组二进制码来表示抽样脉冲的幅值。
从声音的模拟信号得到 PCM 编码数据的过程包括 3 个步骤:
在计算机应用中,PCM 是能达到音频最高保真水平的格式,它被广泛用于素材保存及音乐欣赏,PCM 也因此被称为无损编码格式。但这并不意味着 PCM 就能够确保信号绝对保真,它只能做到最大程度的无限接近原始声音。要计算一个 PCM 音频流的码率需要数字音频的三要素信息即可:。
在处理 PCM 数据时,对于音频不同声道的数据,有两种不同的存储格式:
下面是一个示例:
此外,在处理 PCM 数据时,还需要注意大小端字节序类型。
由于 PCM 编码是无损编码,且广泛应用,所以我们通常可以认为音频的裸数据格式就是 PCM 的。但为了节省存储空间以及传输成本,通常我们会对音频 PCM 数据进行压缩,这也就是音频编码,比如 MP3、AAC、OPUS 都是我们常见的音频编码格式。
2.1、背景介绍
AAC,英文全称 Advanced Audio Coding,是由 Fraunhofer IIS、杜比实验室、AT&T、Sony 等公司共同开发,在 1997 年推出的基于 MPEG-2 的有损数字音频压缩的专利音频编码标准。2000 年,MPEG-4 标准在原 AAC 的基础上加上了 LTP(Long Term Prediction)、PNS(Perceptual Noise Substitution)、SBR(Spectral Band Replication)、PS(Parametric Stereo)等技术,并提供了多种扩展工具。
AAC 作为 MP3 的后继者而被设计出来,综合了许多新的技术,有很多新的特性,它支持从 8k 到 96k 的各种采样率,支持多种声道配置方案。在相同的比特率之下,AAC 相较于 MP3 通常可以达到更好的声音质量。
2.2、编码工具及流程
AAC 属于感知音频编码。与所有感知音频编码类似,其原理是利用人耳听觉的掩蔽效应,对变换域中的谱线进行编码,去除将被掩蔽的信息,并控制编码时的量化噪声不被分辨。
在编码过程中,时域信号先通过滤波器组(进行加窗 MDCT 变换)分解成频域谱线,同时时域信号经过心理声学模型获得信掩比,掩蔽阈值,M/S 立体声编码以及强度立体声编码需要的控制信息,还有滤波器组中应使用长短窗选择信息。瞬时噪声整形(TNS)模块将噪声整形为与能量谱包络形状类似,控制噪声的分布。强度立体声编码和预测以及 M/S 立体声编码都能有效降低编码所需比特数,随后的量化模块用两个嵌套循环进行了比特分配并控制量化噪声小于掩蔽阈值,之后就是改进了码本的哈夫曼编码。这样,与前面各模块得到的边带信息一起,就能构成 AAC 码流了。
AAC 系统包含了增益控制、滤波器组、心理声学模型、量化与编码、预测、TNS、立体声处理等多种高效的编码工具。这些模块或过程的有机组合形成了 AAC 系统的基本编解码流程。
在实际应用中,并不是所有的功能模块都是必需的,下表列出了 MPEG-2 AAC 各模块的可选性:
1)Bitstream Formatter,码流解析模块。在解码时,该模块将 AAC 数据流分解为各个工具模块对应的数据模块,并为每个工具模块提供与该工具相关的比特流数据信息。这个模块的输出包括:
2)Noiseless Decoding,无噪编解码模块。无噪编码就是哈夫曼编码,它的作用在于进一步减少尺度因子和量化后频谱的冗余,即将尺度因子和量化后的频谱信息进行哈夫曼编码。在解码时,该模块从码流解析模块获得输入的数据流,从中解码霍夫曼编码数据,并重建量化频谱、霍夫曼编码和 DPCM 编码的比例因子。
这个模块的输入包括:
输出包括:
3)Inverse Quantization,量化和反量化模块。在 AAC 编码中,逆量化频谱系数是由一个非均匀量化器来实现的,在解码中需进行其逆运算。在解码时,该模块将频谱的量化值转换为整数值来表示未缩放的重建频谱。此量化器是非均匀的量化器。通过对量化分析的良好控制,比特率能够被更高效地利用。在频域调整量化噪声的基本方法就是用尺度因子来进行噪声整形,尺度因子就是一个用来改变在一个尺度因子带的所有的频谱系数的振幅增益值,使用尺度因子这种机制是为了使用非均匀量化器在频域中改变量化噪声的比特分配。
这个模块的输入包括:
输出包括:
4)Rescaling,缩放因子处理模块。解码时,该模块将比例因子的整数表示转换为实际值,然后将未缩放的逆量化频谱乘以相关比例因子。
这个模块的输入包括:
输出包括:
5)M/S,Mid/Side 立体声编解码模块。是联合立体声编码(Joint Stereo)的一种方案,编码时兼顾了这两个声道的共同信息量。该模块基于 Mid/Side 决策信息将频谱对从 Mid/Side 模式转换为 Left/Right 模式,以提高编码效率。一般在左右声道信息相似度较高时使用,处理方式是将左右声道信息合并(L+R)得到新的一轨,再将左右声道信息相减(L-R)得到另外一轨,然后再将这两轨信息用心理声学模型和滤波器处理。
这个模块的输入包括:
输出包括:
6)Prediction,预测模块。解码时,该模块会在预测状态信息的控制下重新插入在编码时提取出的冗余信息。该模块实现为二阶后向自适应预测器。对音频信号进行预测可以减少重复冗余信号的处理,提高效率。
这个模块的输入包括:
输出包括:
7)Intensity,强度立体声编解码模块。是联合立体声编码(Joint Stereo)的一种方案,编码时兼顾了这两个声道的共同信息量。一般在低流量时使用,利用了人耳对于低频信号指向性分辨能力的不足,将音频信息中的低频分解出来合成单声道数据,剩余的高频信息则合成另一个单声道数据,并记录高频信息的位置数据来重建立体声效果。解码时,该模块对频谱对执行强度立体声解码。Mid/Side Stereo 和 Intensity Stereo 都有利用部分相位信息的损失来换得较高的音色数据信息。
这个模块的输入包括:
输出包括:
8)Dependently Switched Coupling,非独立交换耦合模块。解码时,该模块基于耦合控制信息的指导,将非独立交换耦合声道中的相关数据添加到频谱中。
这个模块的输入包括:
输出包括:
9)TNS,瞬时噪音整形模块。该模块实现了对编码噪声的精细时间结构的控制。在编码时,TNS 处理过程会修整声音信号的时域包络。在解码时,该模块会基于 TNS 信息的控制,在对应的逆处理过程中会还原实际的时域包络。这是通过对部分频谱数据进行滤波处理来实现的。这项神奇的技术可以通过在频率域上的预测,来修整时域上的量化噪音的分布。在一些特殊的语音和剧烈变化信号的量化上,TNS 技术对音质的提高贡献巨大。
这个模块的输入包括:
输出包括:
10)Filterbank/Block Switching,滤波器组/块切换模块。解码时,该模块应用了在编码器中执行的频率映射的逆函数。滤波器组工具使用了一个逆修正离散余弦变换(IMDCT),这个 IMDCT 可以配置为支持一组 128 或 1024,或四组 32 或 256 频谱系数。
这个模块的输入包括:
输出包括:
11)Gain Control,增益控制模块。当输出时,该模块将单独的时域增益控制应用于已由编码器中的增益控制 PQF 滤波器组创建的 4 个频带中的每个频带。然后,它会组合 4 个频带,并通过增益控制工具的滤波器组来重建时间波形。该模块仅可用于 SSR(Scalable SampleRate) Profile。
这个模块的输入包括:
输出包括:
12)Independently Switched Coupling,独立交换耦合模块。解码时,该模块基于耦合控制信息的指导,将独立交换耦合声道中的相关数据添加到时间信号中。
这个模块的输入包括:
输出包括:
以上是 MPEG-2 AAC 各模块的介绍,在 MPEG-4 AAC 还新增了其他功能模块,比如:
1)LTP(Long Term Prediction),长时预测模块。它用来减少连续两个编码音框之间的信号冗余,对于处理低码率的语音非常有效。
2)PNS(Perceptual Noise Substitution),知觉噪声替换模块。当编码器发现类似噪音的信号时,并不对其进行量化,而是作个标记就忽略过去,当解码时再还原出来,这样就提高了效率。在具体操作上,PNS 模块对每个尺度因子带侦测频率 4k Hz 以下的信号成分。如果这个信号既不是音调,在时间上也无强烈的能量变动,就被认为是噪声信号。其信号的音调及能量变化都在心理声学模型中算出。
3)SBR(Spectral Band Replication),频段复制技术。音乐的主要频谱集中在低频段,高频段幅度很小,但很重要,决定了音质。对整个频段编码时,若为保护高频就会造成低频段编码过细导致编码效率较低;若只保存低频的主要成分而丢掉高频成分又会损失音质。SBR 把频谱切开,低频单独编码只保存主要成分,提高编码效率;高频单独放大编码,兼顾音质。
4)PS(Parametric Stereo),参数立体声技术。原本立体声双声道的编码输出是一个声道的两倍,但是两个声道的声音存在某种相似性。PS 存储一个声道的全部信息,然后花较少的字节用参数描述另一个声道的差异部分来提升编码效率。
ISO/IEC 13818-7 标准中 MPEG-2 AAC 的编码流程如图:
对应的 MPEG-2 AAC 的解码流程如图:
2.3、编码规格
为了能够适应于不同的应用场合,在 MPEG-2 AAC 标准中定义了三种不同编码规格:
1)MPEG-2 AAC LC(Low Complexity),低复杂度规格。用于要求在有限的存储空间和计算能力的条件下进行压缩场合。在这种框架中,没有预测和增益控制这两种工具,TNS 的阶数比较低。编码码率在 96kbps-192kbps 之间的可以用该规格。MP4 的音频部分常用该规格。
2)MPEG-2 AAC Main,主规格。具有最高的复杂度,可以用于存储量和计算能力都很充足的场合。在这种框架中,利用了除增益控制以外的所有编码工具来提高压缩效率。
3)MPEG-2 AAC SSR(Scalable Sample Rate),可变采样率规格。在这种框架中,使用了增益控制工具,但是预测和耦合工具是不被允许的,具有较低的带宽和 TNS 阶数。对于最低的一个 PQF 子带不使用增益控制工具。当带宽降低时,SSR 框架的复杂度也可降低,特别适应于网络带宽变化的场合。
Main 和 LC 框架是变化编码算法,采用 MDCT 作为其时/频分析模块,SSR 框架则采用混合滤波器组,先将信号等带宽地分成 4 个子带,再作 MDCT 变换。在三种方案里,通过选用不同模块在编码质量和编码算法复杂度之间进行折衷。
在 MPEG-4 AAC 标准中除了继承上面的三种规格进行改进外,还新增了三种编码规格:
1)MPEG-4 AAC LC(Low Complexity),低复杂度规格。
2)MPEG-4 AAC Main,主规格。
3)MPEG-4 AAC SSR(Scalable Sample Rate),可变采样率规格。
4)MPEG-4 AAC LD(Low Delay),低延迟规格。AAC 是感知型音频编解码器,可以在较低的比特率下提供很高质量的主观音质。但是这样的编解码器在低比特率下的算法延时往往超过 100ms,所以并不适合实时的双向通信。结合了感知音频编码和双向通信必须的低延时要求。可以保证最大 20ms 的算法延时和包括语音和音乐的信号的很好的音质。
5)MPEG-4 AAC LTP(Long Term Predicition),长时预测规格。在 Main Profile 的基础上增加了前向预测。
6)MPEG-4 AAC HE(High Efficiency),高效率规格。混合了 AAC 与 SBR(Spectral Band Replication,频段复制)技术。而新版本的 HE,即 HE v2 是 AAC 加上 SBR 和 PS(Parametric Stereo,参数立体声)技术。这样能在同样的效果上使用更低的码率。在编码码率为 32-96 Kbps 之间的音频文件时,建议首选这种规格。
2.4、AAC 格式
2.4.1、Audio Object Types
MPEG-4 标准包含了多种 AAC 的版本,像上面提到的 AAC-LC、HE-AAC、AAC-LD 等等,在标准中定义了编解码工具模块、音频对象类型(Audio Object Types)、编码规格(Profiles)来指定编码器。其中音频对象类型(Audio Object Types)是最主要的标记编码器的方式。下图是常用的 MPEG-4 音频对象类型:
2.4.2、Audio Specific Config
在传输和存储 MPEG-4 音频时,音频对象类型(Audio Object Types)和音频的基础信息(比如采样率、位深、声道)必须被编码,这些信息通常在 AudioSpecificConfig 数据结构中来指定。AudioSpecificConfig 的信息使得我们可以不用传输 AAC 比特流就能让解码器理解音频的相关信息,这对于编解码器协商期间的设置很有用,例如对于 SIP(Session Initiation Protocol,会话初始协议)或 SDP(Session Description Protocol,会话描述协议)的初始化设置。MPEG-2 不会指定 AudioSpecificConfig,所以它的 ADIF 和 ADTS 采用固定的 1024 个采样的长度。
AudioSpecificConfig 的结构如下:
它包含了两部分内容:
比如,对于 AAC-LC、HE-AAC、AAC-LD 特定区域就会包含 GASpecificConfig 特性内容;对于 AAC-ELD 则包含 ELDSpecificConfig 特性内容;对于 xHE-AAC(USAC) 则包含 UsacConfig 特性内容。
2.4.3、数据格式
MPEG-4 的传输或存储格式一般都包含 Raw Data Blocks 或 Access Units,其中装载的是实际的音频编码数据的比特流。这些比特流又通过灵活的方式被分为代表不同声道的部分。取到这些数据后,我们就要进一步解析它们的数据格式了。
MPEG-2 AAC 的音频编码数据格式有以下两种:
1)ADIF(Audio Data Interchange Format),音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。这种格式常用在文件存储中。
2)ADTS(Audio Data Transport Stream),音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。这种格式适用于传输流。
MPEG-4 AAC 又增加了两种音频编码数据格式,新增的格式不仅针对传统的 AAC,还针对新的变体:AAC-LD、AAC-ELD。
1)LATM(Low-overhead MPEG-4 Audio Transport Multiplex)。这种格式有独立的比特流,允许使用 MPEG-4 中的错误恢复语法。
2)LOAS(Low Overhead Audio Stream)。这种格式是带有同步信息的 LATM,可以支持随机访问或跳过。
下图展示了各种 AAC 传输格式的重要特性对比:
ADIF 格式的结构大体如下:
ADTS 格式的组成单元是 ADTS frame。它的结构大体如下:
LOAS 格式的结构大体如下:
1)AAC 音频解析
https://charleswyt.github.io/2018/09/04/AAC%E9%9F%B3%E9%A2%91%E8%A7%A3%E6%9E%90/