LV050-AAC简介
一、AAC 简介
1. 什么是 AAC?
AAC 全称是 Advanced Audio Coding,即高级音频编码。是一种有损音频压缩格式,可以在 更低的码率下提供更高的音频质量,被广泛用于音乐存储和流媒体传输。出现于 1997 年,基于 MPEG-2 的音频编码技术。Dolby、Sony 和 AT&T 是主要的贡献者,目的是取代 MP3 格式。
2000 年,MPEG-4 标准出现后,AAC 重新集成了其特性,加入了 SBR 技术和 PS 技术,为了区别于传统的 MPEG-2 AAC 又称为 MPEG-4 AAC。使得 AAC 规格有三种:AAC(LC-AAC,低复杂度规格,Low Complexity),HE-AAC(AACPlus v1),HE-AAC v2(AACPlus v2)其关系如下(参考 ISO IEC 14496-3-2019):

HE:“High Efficiency”(高效性)。HE-AAC v1(又称 AACPlusV1,SBR),用容器的方法实现了 AAC(LC)和 SBR 技术。SBR 其实代表的是 Spectral Band Replication(频段复制)。
简要叙述一下,音乐的主要频谱集中在低频段,高频段幅度很小,但很重要,决定了音质。如果对整个频段编码,若是为了 保护高频就会造成低频段编码过细以致文件巨大;若是保存了低频的主要成分而失去高频成分就会丧失音质。SBR 把频谱切割开来,低频单独编码保存主要成分, 高频单独放大编码保存音质,“统筹兼顾”了,在减少文件大小的情况下还保存了音质,完美的化解这一矛盾。
HEv2:用容器的方法包含了 HE-AAC v1 和 PS 技术。PS 指“parametric stereo”(参数立体声)。原来的立体声文件文件大小是一个声道的两倍。但是两个声道的声音存在某种相似性,根据香农信息熵编码定理,相关性应该被去 掉才能减小文件大小。所以 PS 技术存储了一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方。
LC-AAC,HE-AAC,HE-AAC v2 比特率和主观质量之间的关系。由图可见,在低码率的情况下,HE-AAC,HE-AAC v2 编码后的音质要明显好于 LC-AAC。

作为 mp3 的后继者,AAC 相较于 MP3 的改进有:更多的采样率选择(8 KHz 至 96 KHz,MP3 为 16 KHz 至 48 KHz);更高的声道数上限(48 个,MP3 在 MPEG-1 模式下为最多双声道,MPEG-2 模式下 5.1 声道);任意的比特率和可变的帧长度。
应用上,AAC 编码最大的支持者是 苹果,iPhone、iPad 和 AirPods 等设备都支持 AAC,iTunes 软件里的音乐很多也是以 AAC 编码格式存储的。
2. 有哪些特点
(1)AAC 是一种高压缩比的音频压缩算法,但它的压缩比要远超过较老的音频压缩算法, 如 AC-3、MP3 等。并且其质量可以同未压缩的 CD 音质相媲美。
(2)同其他类似的音频编码算法一样,AAC 也是采用了变换编码算法(MDCT 技术,改进离散余弦变换),但 AAC 使用了分辨率更高的滤波器组,因此它可以达到更高的压缩比。
(3)AAC 使用了临时噪声重整、后向自适应线性预测、联合立体声技术和量化哈夫曼编码等最新技术,这些新技术的使用都使压缩比得到进一步的提高。
(4)AAC 支持 8K,16K,32K,44.1K 等多种采样率,支持 8Kbps,16Kbps,32Kbps,64Kbps 等多种比特率。
| 采样率 | 声道 | 可用码率 |
|---|---|---|
| 8K | 单声道 | 8Kbps, 16Kbps, 32Kbps |
| 8K | 双声道 | 16 Kbps, 32 Kbps, 64 Kbps |
| 16K,32K, 44.1K | 单声道 | 8 Kbps, 16 Kbps, 32 Kbps, 64Kbps |
| 16K,32K, 44.1K | 双声道 | 16 Kbps, 32 Kbps, 64 Kbps |
(5)AAC 支持更宽的声音频率范围,最高可达到 96kHz,最低可达 8KHz,远宽于 MP3 的 16KHz-48kHz 的范围。
(7)不同于 MP3 及 WMA,AAC 几乎不损失声音频率中的甚高、甚低频率成分,并且比 WMA 在频谱结构上更接近于原始音频,因而声音的保真度更好。专业评测中表明,AAC 比 WMA 声音更清晰,而且更接近原音。
(8)AAC 采用优化的算法达到了更高的解码效率,解码时只需较少的处理能力。
(9)AAC 可以支持 1 到 48 路之间任意数目的音频声道组合、包括 15 路低频效果声道、配音/多语音声道,以及 15 路数据。它可同时传送 16 套节目,每套节目的音频及数据结构可任意规定。
(10)输入的每帧的音频数据为 1024 个采样点,即 2048Byte 音频数据,与配置的音频采样率无关。
(11)AAC 音频编码为动态码率编码,因此,输出每帧数据长度不是固定的。
Tips:在 8K 采样率,单声道的条件下,可设的码率有 8Kbps,16Kbps,32Kbps,64Kbps;在双通道的条件下,可设置的码率有 16Kbps,32Kbps,64Kbps。在 16K,32K,44.1K 采样率,单声道条件下,可设置的码率有 8Kbps,16Kbps,32Kbps,64Kbps; 在双声道的条件下,可设置的码率有 16Kbps,32Kbps,64Kbps。
3. 应用场景
- aac 文件格式 : 这是纯 AAC 格式的音频文件 , 一般都是 裸音频流 ;
- m4a 文件格式 : AAC 格式的音频流 被封装在 MPEG-4 容器中 , 常用于 苹果设备 ;
- mp4 文件格式 : mp4 格式的视频文件 中的 音频流部分 常采用 AAC 编码格式 ;
二、AAC 音频文件格式
AAC 有两种封装格式:
- ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中,它也更适用于 数据存储 。
- ADTS(Audio Data Transport Stream),音频数据传输流,这种格式的特点是可以将数据看做一个个的音频帧,而每帧都存储了用于音频解码播放的头信息(例如采样率,通道数等),即可以从任何帧位置解码播放,更适用于流媒体传输。它的特征类似于 mp3 数据流格式。
Tips:ADTS 可以在任意帧解码,也就是说它每一帧都有头信息。ADIF 只有一个统一的头,所以必须得到所有的数据后解码。且这两种的 header 的格式也是不同的,目前一般编码后的和抽取出的都是 ADTS 格式的音频流。
1. ADIF
1.1 简介
ADIF 格式 的 ACC 音频文件 结构简单 , 只包含一个 文件头部和紧随其后的连续音频数据 ;
adif_sequence()
{
adif_header()
raw_data_stream() // ADIF 头信息位于 AAC 文件的起始处,接下来就是连续的 raw data blocks。
}ADIF 格式 头部信息 包含 全局的解码参数 , 如采样率、比特率、声道信息等 , 解码器 读取 ADIF 头部后 , 可以直接获得 上述 解码所需的所有信息。
1.2 header
头部信息如下所示,可以参考 ISO IEC 14496-3-2019 的 152 页:
adif_header()
{ // No. of bits Mnemonic
adif_id // 32 bslbf 这个就是 ADIF 标识
copyright_id_present // 1 bslbf
if(copyright_id_present)
copyright_id // 72 bslbf
original_copy // 1 bslbf
home // 1 bslbf
bitstream_type // 1 bslbf
bitrate // 23 uimsbf
num_program_config_elements // 4 bslbf
for ( i = 0; i < num_program_config_elements + 1; i++ ) {
if( bitstream_type == '0' )
adif_buffer_fullness // 20 uimsbf
program_config_element()
}
}2. ADTS
2.1 简介
目前在网络传输中常用的就是 ADTS 格式的封装,所以我们常见的 AAC 原始码流是由一个一个的 ADTS frame(音频数据传输流帧)组成,每一帧由 ADTS 的帧头和原始数据块(MEPG2 TS),也就是说每个 ADTS frame 都可以单独去解码。ADTS 头中包含了音频的采样率,声道,帧长度等信息,这样解码器就可以通过 ADTS 头解析读取音频的相关数据。
有的时候当编码 AAC 裸流的时候,会遇到写出来的 AAC 文件并不能在 PC 和手机上播放,很大的可能就是 AAC文件的每 ⼀ 帧里缺少 ADTS 头信息文件的包装拼接, 只需要加在头中加入 ADTS 即可。
一个 AAC 原始数据块的长度是不固定的,在原始帧上加上 ADTS 头进行封装,就形成了 ADTS 帧。AAC 的 ADTS 封装格式见下图:
中间的四部分数据 是 一个完整的 音频帧 数据 , 前后的空白部分是 前后 音频帧 数据 ;
2.2 音频格式分析
AAC 音频文件的每一帧都由 ADTS Header 和 AAC Audio Data 组成,ADTS 头部又分为固定头部、可变头部。如下图所示:

ADTS帧头有两种长度:一种是 固定帧头,7 字节 , protection_absent 位为 1 , 没有 CRC 校验位 ,另一种是 扩展帧头,9 字节 , protection_absent 位为 0 时 , 有 CRC 校验位 。不过一般情况喜爱都是 7 字节的,后面我们继续学习的也是 7 字节的头。
2.2.1 固定头部信息
adts_fixed_header()
{ // No. of bits Mnemonic
Syncword // 12 bslbf
ID // 1 bslbf
Layer // 2 uimsbf
protection_absent // 1 bslbf
profile_ObjectType // 2 uimsbf
sampling_frequency_index // 4 uimsbf
private_bit // 1 bslbf
channel_configuration // 3 uimsbf
original_copy // 1 bslbf
home // 1 bslbf
}| 字段 | 长度(位) | 描述 |
|---|---|---|
| syncword | 12 | 同步标志位,所有位都必须设置为 1,固定为 0xFF,表示 ADTS 的帧开始 |
| id | 1 | MPEG 版本,0:MPEG-4;1:MPEG-2 |
| layer | 2 | 图层,始终设置为 0。 |
| protection_absent | 1 | CRC 校验标识,设置 1 表示没有 CRC,整个 ADST 头为 7 字节;0 表示有 CRC,整个 ADST 头为 9 字节。 |
| profile_ObjectType | 2 | 表示使用的 AAC 规格(profile),可以按照 MPEG-4 的音频对象类型序 号减 1。 该字段的解释也取决于 ID 位的值。如果 ID 等于 1,则该字段包含与 ISO/IEC 13818-7 中定义的 ADTS 流中的配置文件字段相同的信息,也就是 MPEG-2 的规格;当 ID 为 0 是表示的是 MPEG-4 的规格,该字段的值等于 Audio Object Type 的值减 1。字段取值如下面图片的表格: ![]() |
| sampling_frequency_index | 4 | 音频采样频率索引,如下所示: 0: 96000 Hz 1: 88200 Hz 2 : 64000 Hz 3 : 48000 Hz 4: 44100 Hz ... |
| private_bit | 1 | 私有位,编码设置为 0,解码时忽略 |
| channel_configuration | 3 | 声道配置 ISO IEC 14496-3-2019 - 道客巴巴 Pages-90 Table 1.23 - Channel Configuration 0: Defined in AOT Specifc Config 1: 1 channel : front - center 2 : 2 channels : front - left, front - right 3 : 3 channels : front - center, front - left, front - right ... |
| original_copy | 1 | 设置为 1 表示音频的原创性,否则设置为 0, 解码时忽略 |
| home | 1 | 编码时设置为 0,解码时忽略 |
2.2.2 可变头部信息
adts_variable_header()
{ // No. of bits Mnemonic
copyright_identification_bit // 1 bslbf
copyright_identification_start // 1 bslbf
aac_frame_length // 13 bslbf
adts_buffer_fullness // 11 bslbf
number_of_raw_data_blocks_in_frame // 2 uimsbf
}| 字段 | 长度(位) | 描述 |
|---|---|---|
| copyright_identification_bit | 1 | 版权 ID 位 |
| copyright_identification_start | 1 | 通过设置 1 和 0 来表示此帧的版权 ID 位的第一位 |
| aac_frame_length | 13 | 一个 ADTS 帧的 ⻓ 度,包括 ADTS 头(固定+可变)和 AAC 原始流 |
| adts_buffer_fullness | 11 | 缓冲区充满度,0x7FF 说明是码率可变的码流,不需要此字段。CBR 可能需要此字段,不同编码器使用情况不同 |
| no_raw_data_blocks_in_frame | 2 | 该字段表示当前 ADST 帧中所包含的 AAC 帧的个数减一。为了最大的兼容性通常每个 ADTS frame 包含一个 AAC frame,所以该值一般为 0。一个 AAC 原始帧包含一段时间内 1024 个采样及相关数据 |
三、相关计算
AAC 输入的每帧的音频数据为 1024 个采样点,即 2048 Byte (16 bit 位深)音频数据,与配置的音频采样率无关,所以采样率 16K 的时候,也要保证采样点数为 1024 个,这里我们使用 16bit 位深,比特率设置为 16kbps。
帧时间长度 = 原始采样点数 ÷ 原始采样率 = 1024 ÷ 16,000 = 0.064秒 = 64毫秒(每秒大概是15.6帧)
一帧的大小 = 采样点数 x 位深 = 1024*(16/8) = 2048Byte
压缩后一帧字节大小 = 不固定长度,从算法输出获取。参考资料:
音频格式之 AAC:(1)AAC 简介_libaacplus 解码-CSDN 博客
AAC 音频基础知识及码流解析_aac 码率-CSDN 博客
Advanced Audio Coding (AAC) 音频编码格式介绍(改进离散余弦变换(MDCT)算法)频谱带复制(SBR)参数立体声(PS)_aac 扩展 sbr ps-CSDN 博客
