Skip to content

LV050-AAC简介

一、AAC 简介

参考标准文档:ISO_IEC_14496-3ISO IEC 14496-3-2019 - 道客巴巴

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):

image-20251220201529566

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 音频文件 结构简单 , 只包含一个 文件头部和紧随其后的连续音频数据 ;

c
adif_sequence()
{
    adif_header()
    raw_data_stream() // ADIF 头信息位于 AAC 文件的起始处,接下来就是连续的 raw data blocks。
}

image-20251221095601869

ADIF 格式 头部信息 包含 全局的解码参数 , 如采样率、比特率、声道信息等 , 解码器 读取 ADIF 头部后 , 可以直接获得 上述 解码所需的所有信息。

1.2 header

头部信息如下所示,可以参考 ISO IEC 14496-3-2019 的 152 页:

c
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 封装格式见下图:

image-20251221102520966

中间的四部分数据 是 一个完整的 音频帧 数据 , 前后的空白部分是 前后 音频帧 数据 ;

2.2 音频格式分析

AAC 音频文件的每一帧都由 ADTS Header 和 AAC Audio Data 组成,ADTS 头部又分为固定头部、可变头部。如下图所示:

image-20251221103621766

ADTS帧头有两种长度:一种是 固定帧头,7 字节 , protection_absent 位为 1 , 没有 CRC 校验位 ,另一种是 扩展帧头,9 字节 , protection_absent 位为 0 时 , 有 CRC 校验位 。不过一般情况喜爱都是 7 字节的,后面我们继续学习的也是 7 字节的头。

2.2.1 固定头部信息
c
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。字段取值如下面图片的表格:
image-20251221105529485
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 可变头部信息
c
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。

md
帧时间长度 = 原始采样点数 ÷ 原始采样率 = 1024 ÷ 16,000 = 0.064秒 = 64毫秒(每秒大概是15.6帧)
一帧的大小 =  采样点数 x 位深 = 1024*(16/8) = 2048Byte
压缩后一帧字节大小 = 不固定长度,从算法输出获取。

参考资料:

音频格式之 AAC:(1)AAC 简介_libaacplus 解码-CSDN 博客

(6 封私信) 音频编解码学习--MDCT 学习 - 知乎

AAC 音频基础知识及码流解析_aac 码率-CSDN 博客

Advanced Audio Coding (AAC) 音频编码格式介绍(改进离散余弦变换(MDCT)算法)频谱带复制(SBR)参数立体声(PS)_aac 扩展 sbr ps-CSDN 博客

【FFmpeg】AAC 音频格式分析 ( ADIF 格式 | ADTS 格式 | AAC ADTS 音频格式分析 | ADTS 帧头格式解析 | 代码实战 - 生成 ADTS 帧头数据 )_adts 格式-CSDN 博客