您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > (转)aac以adts格式封装的分析
AACADTS格式分析一、ADTS格式:ADTS的全称是AudioDataTransportStream。是AAC音频的传输流格式。AAC音频格式在MPEG-2(ISO-13318-72003)中有定义。AAC后来又被采用到MPEG-4标准中。1.adts_sequence(){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;12bslbfID;1bslbflayer;2uimsbfprotection_absent;1bslbfprofile;2uimsbfsampling_frequency_index;4uimsbfprivate_bit;1bslbfchannel_configuration;3uimsbforiginal/copy;1bslbfhome;1bslbf}adts_variable_header(){copyright_identification_bit;1bslbfcopyright_identification_start;1bslbfframe_length;13bslbfadts_buffer_fullness;11bslbfnumber_of_raw_data_blocks_in_frame;2uimsfb}详细说明下ADTS头的重要数据部分:syncword同步字Thebitstring‘111111111111’,说明一个ADTS帧的开始。IDMPEG标示符,设置为1.layerIndicateswhichlayerisused.Setto‘00’protection_absent表示是否误码校验profile表示使用哪个级别的AAC,如01LowComplexity(LC)---AACLCsampling_frequency_index表示使用的采样率下标sampling_frequency_indexsamplingfrequeny[Hz]0x0960000x1882000x2640000x3480000x4441000x5320000x6240000x7220500x8160000x920000xa110250xb80000xcreserved0xdreserved0xereserved0xfreservedchannel_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;//includetheheaderlengthalsoframe_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_type6;///*rateindexovernext4bits*/adts_header[2]|=(rate_idx2);/*channelsoverlast2bits*/adts_header[2]|=(channels&0x4)2;/*channelscontinuedovernext2bits+4bitsatzero*/adts_header[3]=(channels&0x3)6;/*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--0xfffID:0x1---1---MPEG2identifier,LAYER--00protection_absent---01profile--011LowComplexityprofile(LC)AAC-LCsmaping_freuency_index---0110--0x06---采样率24KHZchannel_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;/*framesizeoverlast2bits*/aac_buf[3]|=(frame_length&0x1800)11;//theupper2bit/*framesizecontinuedoverfullbyte*/aac_buf[4]=(frame_length&0x1FF8)3;//themiddle8bit/*framesizecontinuedfirst3bits*/aac_buf[5]|=(frame_length&0x7)5;//thelast3bitaac_bug[6]|=num_data_block&0x03;//SetrawDatablocks.memcpy(&aac_buf[7],data,wDataLen);//形成一个ADTS帧写入文件。fwrite(aac_buf,wDataLen+7,sizeof(byte),f_audio);}三.LATM格式LATM的全称为“Low-overheadMPEG-4AudioTransportMultiplex”(低开销音频传输复用),是MPEG-4AAC制定的一种高效率的码流传输方式,MPEG-2TS流也采用LATM作为AAC音频码流的封装格式之LATM格式也以帧为单位,主要由AudioSpecificConfig(音频特定配置单元)与音频负载组成。AudioSpecificConfig描述了一个LATM帧的信息,音频负载主要由PayloadLengthInfo(负载长度信息)和PayloadMux(负载净荷)组成。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帧净荷一样,音频负载主要包含原始帧数据。AAC打包成TS流通常有两种方式,分别是先打包成ADTS或LATM。ADTS的每一帧都有个帧头,在每个帧头信息都一样的状况下,会有很大的冗余。LATM格式具有很大的灵活性,每帧的音频配置单元既可以带内传输,有可以带外传输。正因为如此,LATM不仅适用于流传输还可以用于RTP传输,RTP传输时,若音频数据配置信息是保持不变,可以先通过SDP会话先传输StreamMuxConfig(AudioSpecificConfig)信息,由于LATM流由一个包含了一个或多个音频帧的audioMuxElements序列组成。一个完整或部分完整的audioMuxElement可直接映射到一个
本文标题:(转)aac以adts格式封装的分析
链接地址:https://www.777doc.com/doc-3045992 .html