AAC音频码流

一、概述

AAC(Advanced Audio Coding),高级音频编码,给予MPEG-2的音频编码技术,于1997年诞生,主要用于取代MP3格式。2000年,MPEG-4标准的更新,AAC重新集成了其新的技术特性,称为MEPG-4 AAC。

二、码流类型

AAC是一种高压缩比的音频压缩算法。格式有两种:

  • ADTS:Audio Data Transport Stream。音频数据传输流格式,每一帧都有头信息,可以在任意帧解码,适用于传输流(重点)。
  • ADIF:Audio Data Interchage Format。音频数据交换格式,只有一个统一的头,必须得到所有数据后解码,适用于本地文件。

三、ADTS

该格式是由一个个ADTS frame组成;其中每个ADTS frame之间通过syncword进行分割,该同步字为0XFFF(二进制111111111111)
github

3.1 信息头(ADTS Header)

头信息包含了AAC文件的采样率、通道数、真数据长度等基本信息。分为固定头信息(adts_fixed_header)可变头信息(adts_variable_header)两个部分。
长度可能为7或9字节,差别在于CRC校验。
github

3.1.1 固定头信息(adts_fixed_header())

固定头的信息在每一帧中都是一样的。

  • Syncword:12bit,一帧的开始,用于分界符。
  • ID(MPEG version):1bit,0(MPEG-4),1(MPEG-2)。
  • layer:2bit,总是00。
  • protection_absent:1bit,是否有CRC检验字符,1表示没有,0表示有。
  • profile:2bit,使用哪个级别的AAC。
    • 1:AAC Main
    • 2:AAC LC(低复杂度)
    • 3:AAC SSR(可扩展采样)
    • 4:AAC LTP(长期预测)
  • sampling_frequency_index:4bit,标识使用的采样率的下标。
    • 0:96000Hz,DVD、蓝光、高清等
    • 1:88200Hz
    • 2:64000Hz
    • 3:48000Hz,电视、专业音频
    • 4:44100Hz,音频CD用
    • 5:32000Hz
    • 6:24000Hz
    • 7:22050Hz
    • 8:16000Hz
    • 9:12000Hz
    • 10:11025Hz
    • 11:8000Hz,电话用
    • 12:7350Hz
    • 13-14:保留
    • 15:其他使用
  • private_bit:1bit,私有位,默认为0。
  • channel_configuration:3bit,声道数
    • 0:在 AOT 特定配置中定义
    • 1:1通道,前中
    • 2:2通道,左前,右前
    • 3:3通道,前中,左前,右前
    • 4:4通道,前中,左前,右前,后中
    • 5:5通道,前中,左前,右前,左后,右后
    • 6:6通道,前中,左前,右前,左后,右后,LEF声道
    • 7:8通道,前中,左前,右前,左侧,右侧,左后,右后,LEF声道
    • 8-15:保留
  • original_copy:1bit,默认为0。
  • home:1bit,默认为0。

3.1.2 可变头信息(adts_variable_header())

  • copyrighted_id_bit:1bit,默认为0。
  • copyrighted_id_start:1bit,默认为0。
  • aac_frame_length:13bit,一个ADTS帧的长度(ADTS头和AAC原始流)。用AAC原始流长度+7或者9。( 当proection_ansent = 0 则+9;proection_ansent = 1 则+7)。
  • adts_buffer_fullness:11bit,0x7FF 说明是码率可变的码流;0x000代表是固定码率的码流。
  • number_of_raw_data_blocks_in_frame:2bit,表示当前帧有number_of_raw_data_blocks_in_frame + 1 个原始帧(一个AAC原始帧包含一段时间内1024个采样及相关数据)。
  • CRC:16bit,校验字段,可选。

3.2 音频数据(ACC ES)

根据其中的3bit的标识位id_syn_ele运行到不同的流处理:

  • ID_SCE:0X0,single_channel_element(),单通道元素基本上只由一个ICS组成。一个原始数据块最可能由16个SCE组成(核心算法)。
  • ID_CPE:0X1,channel_pair_element(),由两个可能共享边信息的ICS和一些联合立体声编码信息组成。一个原始数据块最多可能由16个SCE组成(核心算法)。
  • ID_CCE:0X2,coupling_channel_element(),藕合通道元素。代表一个块的多通道联合立体声信息或者多语种程序的对话信息(核心算法)。
  • ID_LFE:0X3,lfe_channel_element(),低频元素。包含了一个加强低采样频率的通道(核心算法)。
  • ID_DSE:0X4,data_stream_element(),数据流元素,包含了一些并不属于音频的附加信息。
  • ID_PCE:0X5,program_config_element(),程序配置元素。包含了声道的配置信息。它可能出现在ADIF 头部信息中。
  • ID_FIL:0X6,fill_element(),填充元素。包含了一些扩展信息。如SBR,动态范围控制信息等。
  • ID_END:0X7,END。

四、ADIF

相对简单,有信息头和信息体构成整个AAC数据:
github

4.1 信息头

  • adif_id
  • copyright_id_present
  • copyrightid
  • original_copy
  • home
  • bitstream_type
  • num_program_config_elements
  • adif_buffer_fullness
  • program_config_element()

4.2 信息体