一、AAC概述
AAC(Advanced Audio Coding),高级音频编码,是基于MPEG-2的音频编码技术,于1997年推出,主要用于取代MP3格式。2000年,随着MPEG-4标准的推出,AAC重新集成了新的技术(如SBR、PS等)特性,称之为MEPG-4 AAC。AAC共有9种规格,具体如下所示:
编号 | 规格 | 说明 |
---|---|---|
1 | MPEG-2 AAC LC | 低复杂度规格 |
2 | MPEG-2 AAC Main | 主规格 |
3 | MPEG-2 AAC SSR | 可变采样率规格 |
4 | MPEG-4 AAC LC | 低复杂度规格 |
5 | MPEG-4 AAC Main | 主规格 |
6 | MPEG-4 AAC SSR | 可变采样率规格 |
7 | MPEG-4 AAC LTP | 长期预测规格 |
8 | MPEG-4 AAC LD | 低延迟规格 |
9 | MPEG-4 AAC HE | 高效率规格 |
AAC是一种高压缩比的音频压缩算法,本文主要从数据处理的角度对AAC音频码流进行分析。
二、AAC码流结构
AAC音频格式有两种:具体如下:
ADIF(Audio Data Interchange Format),音频数据交换格式:只有一个统一的头,必须得到所有数据后解码,适用于本地文件。
ADTS(Audio Data Transport Stream),音视数据传输流:每一帧都有头信息,可在任意帧解码,适用于传输流。
ADIF格式如下所示:
ADIF Header | raw_data_stream |
---|
ADIF Header格式定义如下所示:
ADTS码流是由连续的多个ADTS Frame组成的,ADTS Frame是由ADTS Header和AAC ES组成的,具体如下所示:
...... | ADTS Header | AAC ES | ADTS Header | AAC ES | ...... |
---|
ADTS Header,一般为7字节或9字节(有CRC校验),包含采样率、声道数、帧长度等信息,主要由adts_fixed_header、adts_variable_header、crc三部分组成。
adts_fixed_header:固定头,内容是不变的,每一帧的内容都相同,具体格式如下所示:
syncword(12bit):同步字值为0xFFF,所有位为1。
ID(1bit):0表示MPEG-4,1表示MPEG-2。
layer(2bit):所有位值为0。
protection_absent(1bit):0表示有CRC,1表示没有CRC。
profile(2bit):配置级别,MPEG-2中定义profile取值如下图所示:
sampling_frequency_index(4bit):采样频率,具体取值如下图所示:
private_bit(1bit):see ISO/IEC 11172-3, subclause 2.4.2.3 (Table 8)。
channel_configuration(3bit):表示声道数。
original/copy(1bit):编码默认值为0,解码忽略此值。
home(1bit):编码默认值为0,解码忽略此值。
adts_variable_header:可变头,内容是变化的,每一帧的内容存在变化,具体格式如下所示:
copyright_identification_bit(1bit):编码默认值为0,解码忽略此值。
copyright_identification_start(1bit):编码默认值为0,解码忽略此值。
frame_length(13bit):帧长度,即整个ADTS Frame的长度。
adts_buffer_fullness(11bit):默认值为0x7FF,表示可变码流。
number_of_raw_data_blocks_in_frame(2bit):其值加1表示ADTS Frame中原始数据块的个数。
三、AAC数据示例
利用UItraEdit工具打开一个AAC文件进行数据分析,如下图所示:
红色标注部分为ADTS Header,根据前文所述,第一个Header详细数据分析如下:
syncword(12bit):值为0xFFF。
ID(1bit):值为1,表示MPEG-2。
layer(2bit):值为0。
protection_absent(1bit):值为1,表示没有CRC。
profile(2bit):值为1,表示LC。
sampling_frequency_index(4bit):值为4,表示44100Hz。
private_bit(1bit):值为0。
channel_configuration(3bit):值为2,表示双通道。
original/copy(1bit):值为0。
home(1bit):值为0。
copyright_identification_bit(1bit):值为0。
copyright_identification_start(1bit):值为0。
frame_length(13bit):值为106,表示整个ADTS Frame的长度。
adts_buffer_fullness(11bit):值为0x7FF,表示可变码流。
number_of_raw_data_blocks_in_frame(2bit):值为0,表示ADTS Frame中原始数据块的个数为1。