aac格式分析Word文档格式.docx
《aac格式分析Word文档格式.docx》由会员分享,可在线阅读,更多相关《aac格式分析Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
raw_data_block();
}else
adts_header_error_check();
for(i=0;
i&
lt;
=number_of_raw_data_blocks_in_frame;
i++)
{
adts_raw_data_block_error_check();
3.adts_fixed_header()
syncword:
12bslbf
ID:
1bslbf
layer:
2uimsbf
protection_absent:
profile:
sampling_frequency_index:
4uimsbf
private_bit:
channel_configuration:
3uimsbf
original/copy:
home:
adts_variable_header()
copyright_identification_bit:
copyright_identification_start:
frame_length:
13bslbf
adts_buffer_fullness:
11bslbf
number_of_raw_data_blocks_in_frame:
2uimsfb
}
详细说明下ADTS头的重要数据部分:
syncword同步字Thebitstring‘111111111111’,说明一个ADTS帧的开始。
IDMPEG标示符,设置为1.
layerIndicateswhichlayerisused.Setto‘00’
protection_absent表示是否误码校验
profile表示使用哪个级别的AAC,如01LowComplexity(LC)---AACLC
sampling_frequency_index表示使用的采样率下标
sampling_frequency_indexsamplingfrequeny[Hz]
0x096000
0x188200
0x264000
0x348000
0x444100
0x532000
0x624000
0x722050
0x816000
0x92000
0xa11025
0xb8000
0xcreserved
0xdreserved
0xereserved
0xfreserved
channel_configuration表示声道数
frame_length一个ADTS帧的长度包括ADTS头和rawdatablock.
adts_buffer_fullness0x7FF说明是码率可变的码流
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头进行ADTS的封装,就形成了ADTS帧。
通常我们将得到的AAC原始帧进行封装后写入文件,用常用的播放器如千千静听即可播放,这是个验证AAC数据是否正确的方法。
进行封装前,需要了解相关参数,如采样率,声道数,原始数据块的长度等。
下面把AAC原始数据帧加工为ADTS帧,据相关参数填写组成7字节的ADTS头。
TheADTSheaderisdefinedbelow-
unsignedintobj_type=0;
unsignedintnum_data_block=frame_length/1024;
//includetheheaderlengthalso
frame_length+=7;
/*Wewantthesamemetadata*/
/*GenerateADTSheader*/
if(adts_header==NULL)return;
/*Syncpointoverafullbyte*/
adts_header[0]=0xFF;
/*Syncpointcontinuedoverfirst4bits+static4bits
*(ID,layer,protection)*/
adts_header[1]=0xF9;
/*Objecttypeoverfirst2bits*/
adts_header[2]=obj_type&
&
6;
//
/*rateindexovernext4bits*/
adts_header[2]|=(rate_idx&
2);
/*channelsoverlast2bits*/
adts_header[2]|=(channels&
amp;
0x4)&
gt;
2;
/*channelscontinuedovernext2bits+4bitsatzero*/
adts_header[3]=(channels&
0x3)&
/*framesizeoverlast2bits*/
adts_header[3]|=(frame_length&
0x1800)&
11;
/*framesizecontinuedoverfullbyte*/
adts_header[4]=(frame_length&
0x1FF8)&
3;
/*framesizecontinuedfirst3bits*/
adts_header[5]=(frame_length&
0x7)&
5;
/*bufferfullness(0x7FFforVBR)over5lastbits*/
adts_header[5]|=0x1F;
/*bufferfullness(0x7FFforVBR)continuedover6firstbits+2zeros
*numberofrawdatablocks*/
adts_header[6]=0xFC;
//onerawdatablocks.
adts_header[6]|=num_data_block&
0x03;
//SetrawDatablocks.
在CMMB中,采用AAC音频压缩标准,默认状况下,编码参数如下:
双声道,采样率24KHZ,帧长变长,码流可变码率的码流,一般采用的AACprofile为
AAC-LC。
将从CMMB复用帧解析的一个AAC原始帧封装为ADTS帧的方法如下:
uint8aac_buf[ADTS_FRAME_SIZE]={0x0ff,0x0f9,0x058,0x80,0,0x1f,0xfc};
从上述7个字节分析音频参数如下:
synword--0xfff
0x1---1---MPEG2identifier,
LAYER--00
protection_absent---01
profile--011LowComplexityprofile(LC)AAC-LC
smaping_freuency_index---0110--&
0x06---&
采样率24KHZ
channel_configuration---aac_buf[3]=0x08----&
2----&
双声道。
。
adts_buffer_fullness---&
0x7ff码率可变的码流
现插入长度参数wDataLen;
voidOnAudioAacFrame(byte*data,uint16wDataLen)
unsignedintnum_data_block=wDataLen/1024;
uint16frame_Length;
frame_Length=wDataLen+7;
aac_buf[3]|=(frame_length&
//theupper2bit
aac_buf[4]=(frame_length&
//themiddle8bit
aac_buf[5]|=(frame_length&
//thelast3bit
aac_bug[6]|=num_data_block&
emcpy(&
aac_buf[7],data,wDataLen);
//形成一个ADTS帧写入文件。
fwrite(aac_buf,wDataLen+7,sizeof(byte),f_audio);
三LATM格
LATM的全称为“Low-overheadMPEG-4AudioTransportMultiplex”(低开销音频传输复用),是MPEG-4AAC制定的一种高效率的码流传输方式,MPEG