一、ADTS格式:
ADTS的全称是Audio Data Transport Stream。是AAC音频的传输流格式。
AAC音频格式在MPEG-2(ISO-13318-7 2003)中有定义。AAC后来又被采用到MPEG-4标准中。
1.
{
while (nextbits() == syncword) {
adts_frame();
}
}
2.adts_frame()
{
adts_fixed_header();
adts_variable_header();
if (number_of_raw_data_blocks_in_frame == 0) {
adts_error_check();
raw_data_block();
}
else {
adts_header_error_check();
for (i = 0; i <= number_of_raw_data_blocks_in_frame; i++) {
raw_data_block();
adts_raw_data_block_error_check();
}
}
}
3.
adts_fixed_header()
{
syncword; 12 bslbf
ID; 1 bslbf
layer; 2 uimsbf
protection_absent; 1 bslbf
profile; 2 uimsbf
sampling_frequency_index; 4 uimsbf
private_bit; 1 bslbf
channel_configuration; 3 uimsbf
original/copy; 1 bslbf
home; 1 bslbf
}
adts_variable_header()
{
copyright_identification_bit; 1 bslbf
copyright_identification_start; 1 bslbf
frame_length; 13 bslbf
adts_buffer_fullness; 11 bslbf
number_of_raw_data_blocks_in_frame; 2 uimsfb
}
详细说明下ADTS头的重要数据部分:
syncword同步字The bit string ‘1111 1111 1111’,说明一个ADTS帧的开始。
ID
layerIndicates which layer is used. Set to ‘00’
protection_absent表示是否误码校验
profile表示使用哪个级别的AAC,如01 Low Complexity(LC)--- AACLC
sampling_frequency_index表示使用的采样率下标
sampling_frequency_index sampling frequeny [Hz]
0x0
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
0x9
0xa
0xb
0xc
0xd
0xe
0xf
channel_configuration表示声道数
frame_length一个ADTS帧的长度包括ADTS头和raw data block.
adts_buffer_fullness
number_of_raw_data_blocks_in_frame
表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧.
所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有一个AAC数据块并不是说没有。(一个AAC原始帧包含一段时间内1024个采样及相关数据)
二、封装AAC为ADTS帧
下面是把AAC原始数据帧加工为ADTS帧,根据相关参数填写组成7个字节的ADTS头。
The ADTS header is defined below -
adts_header[6] = 0xFC;// one raw data blocks .
adts_header[6] |= num_data_block & 0x03; //Set raw Data blocks.
在CMMB中,采用AAC音频压缩标准,默认状况下,编码参数如下:双声道,采样率24KHZ,帧长变长,码流可变码率的码流,一般采用的AAC profile为AAC-LC。将从CMMB复用帧解析的一个AAC原始帧封装为ADTS帧的方法如下:
uint8 aac_buf[ADTS_FRAME_SIZE]={0x0ff,0x0f9,0x058,0x80,0,0x1f,0xfc};
从上述7个字节分析音频参数如下:
synword--0xfff
ID:0x1--- 1--- MPEG2 identifier,
LAYER--00
protection_absent ---01
profile--01
smaping_freuency_index---0110-->0x06--->采样率24KHZ
channel_configuration --- aac_buf[3] = 0x08---->2---->双声道。。
adts_buffer_fullness--->0x7ff码率可变的码流
现插入长度参数wDataLen;
void OnAudioAacFrame(byte* data, uint16 wDataLen)
{
unsigned int num_data_block = wDataLen / 1024;
memcpy(&aac_buf[7],data,wDataLen);
//形成一个ADTS帧写入文件。
fwrite(aac_buf,wDataLen+7,sizeof(byte),f_audio);
}
三.LATM格式
LATM的全称为“Low-overhead MPEG-4 Audio TransportMultiplex”(低开销音频传输复用),是MPEG-4 AAC制定的一种高效率的码流传输方式,MPEG-2 TS流也采用LATM作为AAC音频码流的封装格式之
AudioSpecificConfig信息可以是带内传,也可以是带外传。所谓带内传,就是指每一个LATM帧,都含有一个AudioSpecificConfig信息;而带外传,则每一个LATM帧都不含有AudioSpecificConfig信息,而通过其他方式把AudioSpecificConfig信息发送到解码端,由于AudioSpecificConfig信息一般是不变的,所以只需发送一次即可。由此可见,AudioSpecificConfig信息采用带内传输可适应音频编码信息不断变化的情况,而采用带外传输,可以节省音频传输码率。带内或带外传,由muxconfigPresent标志位决定。例如流媒体应用中,muxconfigPresent可设置为0,这样LATM帧中将不含有AudioSpecificConfig信息,LATM帧通过RTP包发送出去,AudioSpecificConfig可通过SDP文件一次性传送到解码端。
AudioSpecificConfig主要参数
numSubFrames
numProgram
numLayer
frameLengthType
audioObjectType
samplingFrequency
channelConfiguration
音频负载由若干子帧组成,每个子帧由PayloadLengthInfo和PayloadMux组成,与ADTS帧净荷一样,音频负载主要包含原始帧数据。
AudioMuxElement(muxConfigPresent)
{
}
for (i = 0; i <= numSubFrames; i++)
}
四、CMMB中的LATM
allStreamSameTiemFraming
numSubFrames:0
freameLengthType:0帧长度是可变的
latmBufferFullness:0xFF码率可变的码流
参考:
[1]ISO/IEC 13818-7(2003 MPEG-2 AAC, Second Edition)
[2]ISO13818-7(2006 Fourth edition AAC)
[3]RFC 3016 (rfc3016) - RTP Payload Format for MPEG-4 Audio-Visual Streams
[4]AAC音频压缩编码标准的ADTS与LATM格式分析
[5]GYZ 234-2008: CMMB复用实施指南