
4.5.1 AAC格式
与MP3格式类似,AAC标准也提供了对应的音频信号的文件封装格式,即AAC格式。在AAC的标准协议中,共定义了两种AAC格式。
◎ ADIF格式:Audio Data Interchange Format,即音频数据交换格式。
◎ ADTS格式:Audio Data Transport Stream,即音频数据传输流。
1.ADIF格式
在一个ADIF格式的音频文件中通常包含一个单独的ADIF Header()(文件头)和一个完整的Raw Data Stream()(音频流数据)。当解码和播放ADIF格式的音频文件时,需要从文件的开始位置读取完整的文件头信息,并按顺序解析文件的音频流数据。一个 ADIF 格式的音频文件的结构如图4-17所示。

图4-17
ADIF Header()
ADIF Header()通常位于一个ADIF格式的音频文件的头部,用来保存音频文件的版权、解码和播放参数等信息,如图4-18所示。

图4-18
其中,部分常用字段的含义如表4-9所示。
表4-9

在表4-9中,program_config_element()字段用于保存音频文件中某一路节目的配置信息,其数量与文件中保存的节目数量一致,由参数 num_program_config_elements 指定。program_config-element()如图4-19所示。

图4-19
Raw Data Stream()
在ADIF格式的音频文件中,Raw Data Stream()用于保存主要的音频压缩数据流信息,如图4-20所示。

图4-20
Raw Data Stream()以循环的方式保存若干raw_data_block(),并在每个raw_data_block()的末尾都添加填充位,使其按照字节位置对齐。raw_data_block()如图4-21所示。

图4-21
2.ADTS格式
ADTS 格式是在 AAC 编码标准中定义的另一种音频文件格式。与 ADIF 格式不同的是,ADTS 格式没有一个独立且完整的文件头和音频流数据,而是将文件头和音频流数据与同步字节和差错校验信息组合为一个数据帧,如图4-22所示。

图4-22
其结构如图4-23所示。

图4-23
在这个结构中,一个数据帧的头部可分为固定头结构(adts_fixed_header())和可变头结构(adts_variable_header())两部分。其中,固定头结构如图4-24所示。

图4-24
在ADTS格式中,固定头结构的每一帧的数据都固定不变,其作用为在音频流媒体等信息连续传输场景下确认随机接入点。在固定头结构中,前端的12 bit为同步字节Syncword,其固定取值为0xFFF,解码器在码流中查找该字段作为解码的起始位置。
在ADTS格式中,可变头结构的每一帧的数据都可以变化,可变头结构如图4-25所示。

图4-25
在可变头结构之后,ADTS 格式设置了循环冗余校验(adts_error_check()),用于在网络传输中进行差错控制,如图4-26所示。

图4-26
如图4-25所示,在一个ADTS Frame的末尾通常包含一个函数raw_data_block。在ADIF格式中,函数raw_data_block是集中保存在raw_data_stream中的。而在ADTS Frame中,函数raw_data_block是按顺序依次保存在函数adts_error_check之后的,函数raw_data_block的个数由可变头结构中的参数no_raw_data_blocks_in_frame指定。