(转)aac以adts格式封装的分析_第1页
(转)aac以adts格式封装的分析_第2页
(转)aac以adts格式封装的分析_第3页
(转)aac以adts格式封装的分析_第4页
(转)aac以adts格式封装的分析_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、AAC ADTS 格式分析一、ADTS格式:ADTS的全称是Audio Data Transport Stream。是AAC音频的传输流格式。AAC音频格式在MPEG-2(ISO-13318-7 2003)中有定义。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

2、_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 bslbfID; 1 bslbflayer; 2 uimsbfprotection_absent; 1 bslbfprofile; 2 uimsbfsampling_frequency_index; 4

3、uimsbfprivate_bit; 1 bslbfchannel_configuration; 3 uimsbforiginal/copy; 1 bslbfhome; 1 bslbfadts_variable_header()copyright_identification_bit; 1 bslbfcopyright_identification_start; 1 bslbfframe_length; 13 bslbfadts_buffer_fullness; 11 bslbfnumber_of_raw_data_blocks_in_frame; 2 uimsfb详细说明下ADTS头的重要数

4、据部分:syncword 同步字The bit string 1111 1111 1111,说明一个ADTS帧的开始。ID MPEG 标示符, 设置为1.layer Indicates which layer is used. Set to 00protection_absent 表示是否误码校验profile 表示使用哪个级别的AAC,如01 Low Complexity(LC)- AACLCsampling_frequency_index 表示使用的采样率下标sampling_frequency_index sampling frequeny Hz0x0 960000x1882000x2

5、640000x3 480000x4 441000x5 320000x6 240000x7 220500x8 160000x9 20000xa 110250xb 80000xc reserved0xd reserved0xe reserved0xf reservedchannel_configuration 表示声道数frame_length 一个ADTS帧的长度包括ADTS头和raw data block.adts_buffer_fullness 0x7FF 说明是码率可变的码流number_of_raw_data_blocks_in_frame表示ADTS帧中有number_of_raw_d

6、ata_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原始数据帧加工为ADT

7、S帧,据相关参数填写组成7字节的ADTS头。The ADTS header is defined below - unsigned int obj_type = 0; unsigned int num_data_block = frame_length / 1024; / include the header length also frame_length += 7; /* We want the same metadata */ /* Generate ADTS header */ if(adts_header = NULL) return; /* Sync point over a fu

8、ll byte */ adts_header0 = 0xFF; /* Sync point continued over first 4 bits + static 4 bits * (ID, layer, protection)*/ adts_header1 = 0xF9; /* Object type over first 2 bits */ adts_header2 = obj_type 6;/ /* rate index over next 4 bits */ adts_header2 |= (rate_idx 2; /* channels continued over next 2

9、bits + 4 bits at zero */ adts_header3 = (channels & 0x3) 11; /* frame size continued over full byte */ adts_header4 = (frame_length & 0x1FF8) 3; /* frame size continued first 3 bits */ adts_header5 = (frame_length & 0x7) 0x06-采样率24KHZ channel_configuration - aac_buf3 = 0x08-2-双声道。adts_buffer_fullnes

10、s-0x7ff 码率可变的码流 现插入长度参数 wDataLen;void OnAudioAacFrame(byte* data, uint16 wDataLen)unsigned int num_data_block = wDataLen / 1024;uint16 frame_Length;frame_Length = wDataLen + 7; /* frame size over last 2 bits */ aac_buf3 |= (frame_length & 0x1800) 11;/ the upper 2 bit /* frame size continued over ful

11、l byte */ aac_buf4 = (frame_length & 0x1FF8) 3;/ the middle 8 bit /* frame size continued first 3 bits */ aac_buf5 |= (frame_length & 0x7) 5;/the last 3 bitaac_bug6 |= num_data_block & 0x03; /Set raw Data blocks.memcpy(&aac_buf7,data,wDataLen);/形成一个ADTS帧写入文件。fwrite(aac_buf,wDataLen+7,sizeof(byte),f_

12、audio);三.LATM格式LATM 的全称为“Low-overhead MPEG-4 Audio TransportMultiplex”(低开销音频传输复用),是MPEG-4 AAC制定的一种高效率的码流传输方式,MPEG-2 TS 流也采用LATM 作为AAC 音频码流的封装格式之 LATM格式也以帧为单位,主要由AudioSpecificConfig(音频特定配置单元)与音频负载组成。AudioSpecificConfig 描述了一个LATM 帧的信息,音频负载主要由PayloadLengthInfo(负载长度信息)和PayloadMux(负载净荷)组成。AudioSpecificCo

13、nfig 信息可以是带内传,也可以是带外传。所谓带内传,就是指每一个LATM 帧,都含有一个AudioSpecificConfig 信息;而带外传,则每一个LATM帧都不含有AudioSpecificConfig 信息,而通过其他方式把AudioSpecificConfig信息发送到解码端,由于AudioSpecificConfig 信息一般是不变的,所以只需发送一次即可。由此可见,AudioSpecificConfig 信息采用带内传输可适应音频编码信息不断变化的情况,而采用带外传输,可以节省音频传输码率。带内或带外传,由muxconfigPresent 标志位决定。例如流媒体应用中,mux

14、configPresent 可设置为0,这样LATM帧中将不含有AudioSpecificConfig 信息,LATM帧通过RTP包发送出去,AudioSpecificConfig 可通过SDP文件一次性传送到解码端。AudioSpecificConfig 主要参数numSubFrames 子帧的数目numProgram 复用的节目数numLayer 复用的层数frameLengthType 负载的帧长度类型,包括固定长度与可变长度audioObjectType 音频对象类型samplingFrequency 采样率channelConfiguration 声道配置音频负载由若干子帧组成,每个

15、子帧由PayloadLengthInfo和PayloadMux组成,与ADTS帧净荷一样,音频负载主要包含原始帧数据。AAC打包成TS流通常有两种方式,分别是先打包成ADTS或LATM。ADTS的每一帧都有个帧头,在每个帧头信息都一样的状况下,会有很大的冗余。LATM格式具有很大的灵活性,每帧的音频配置单元既可以带内传输,有可以带外传输。正因为如此,LATM不仅适用于流传输还可以用于RTP传输,RTP传输时,若音频数据配置信息是保持不变,可以先通过SDP会话先传输StreamMuxConfig(AudioSpecificConfig)信息,由于LATM流由一个包含了一个或多个音频帧的audio

16、MuxElements序列组成。一个完整或部分完整的audioMuxElement可直接映射到一个RTP负载上。下面是一个audoMuxEmlemtAudioMuxElement(muxConfigPresent) if (muxConfigPresent) useSameStreamMux; if (!useSameStreamMux) StreamMuxConfig(); if (audioMuxVersionA = 0) for (i = 0; i = numSubFrames; i+) PayloadLengthInfo(); PayloadMux(); . 可以很简单的把ADTS帧转

17、换为LATM帧,根据ADTS头的信息,生成StreamMuxConfig,将ADTS中的原始帧提取出来,前面加上PayloadLengthInfo做为LATM的音频帧。按照上述格式打包生成AudioMuxElement,作为RTP的负载传输.四、CMMB中的LATM当CMMB中音频压缩标准为AAC时,默认采用LATM封装。StreamMuxConfig采用带外传输。StreamMuxConifg中的若干默认参数如下:audioMuxVersion:0标志流语法版本号为0allStreamSameTiemFraming:1,标志复用到PayLoadMux()中的所有负载共享一个共同的时基numSubFrames:0 表示只有一个音频子帧.audioObjectType:2 AAC-LCfr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论