当前位置:首页 >> 信息与通信 >>

(转)aac 以adts格式封装的分析


AAC ADTS 格式分析
格式: 一、ADTS 格式 ADTS 的全称是 Audio Data Transport Stream。是 AAC 音频的传输流格式。 AAC 音频格式在 MPEG-2(ISO-13318-7 2003)中有定义。AAC 后来又被采用到 MPEG-4 标准 中。
1. adts_sequence() { while (nextbit

s() == 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 MPEG 标示符, 设置为 1.

layer Indicates 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 96000 88200 64000

0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf

48000 44100 32000 24000 22050 16000 2000 11025 8000 reserved reserved reserved reserved

channel_configuration 表示声道数 frame_length 一个 ADTS 帧的长度包括 ADTS 头和 raw data block. adts_buffer_fullness 0x7FF 说明是码率可变的码流 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 头。
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 full byte */ adts_header[0] = 0xFF; /* Sync point continued over first 4 bits + static 4 bits * (ID, layer, protection)*/ adts_header[1] = 0xF9; /* Object type over first 2 bits */ adts_header[2] = obj_type << 6;// /* rate index over next 4 bits */ adts_header[2] |= (rate_idx << 2); /* channels over last 2 bits */ adts_header[2] |= (channels & 0x4) >> 2; /* channels continued over next 2 bits + 4 bits at zero */ adts_header[3] = (channels & 0x3) << 6; /* frame size over last 2 bits */ adts_header[3] |= (frame_length & 0x1800) >> 11; /* frame size continued over full byte */ adts_header[4] = (frame_length & 0x1FF8) >> 3; /* frame size continued first 3 bits */ adts_header[5] = (frame_length & 0x7) << 5; /* buffer fullness (0x7FF for VBR) over 5 last bits*/ adts_header[5] |= 0x1F; /* buffer fullness (0x7FF for VBR) continued over 6 first bits + 2 zeros * number of raw data blocks */ 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 1 Low Complexity profile (LC) AAC-LC

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; uint16 frame_Length; frame_Length = wDataLen + 7; /* frame size over last 2 bits */ aac_buf[3] |= (frame_length & 0x1800) >> 11;// the upper 2 bit /* frame size continued over full byte */ aac_buf[4] = (frame_length & 0x1FF8) >> 3;// the middle 8 bit /* frame size continued first 3 bits */ aac_buf[5] |= (frame_length & 0x7) << 5;//the last 3 bit aac_bug[6] |= num_data_block & 0x03; //Set raw Data blocks. 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 音频码流的封装格式之 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 可直接映射到一个 RTP 负载上。 下面是一个 audoMuxEmlemt
AudioMuxElement(muxConfigPresent) { if (muxConfigPresent) { useSameStreamMux; if (!useSameStreamMux) StreamMuxConfig(); } if (audioMuxVersionA == 0) { for (i = 0; i <= numSubFrames; i++) { PayloadLengthInfo(); PayloadMux(); }. } }

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


相关文章:
AAC以ADTS格式封装的分析
AAC以ADTS格式封装的分析_计算机软件及应用_IT/计算机_专业资料。AAC以ADTS格式封装的分析 AAC ADTS 格式分析一、ADTS 格式: ADTS 的全称是 Audio Data Transport ...
AAC的ADTS格式及解码算法详解
AACADTS格式及解码算法详解_计算机软件及应用_IT/计算机_专业资料。AACADTS格式...(转)aac 以adts格式封装... 8页 免费 MP3解码算法原理 17页 免费 AAC 文...
aac编码介绍
封装[ADTS|LATM(较主流)] 待续 Ps:原始数据块以帧的形式存在,故又称为原始帧...RTP 协议采用的 AAC 封装格式是 LATM 格式,这里 ADTS LATM 间的转换尤为重要...
aac
adts_sequnce() { while(nextbits==syncword) { ...2014教师资格材料分析辅... 2014小学教师资格考试《...AAC格式介绍 16页 免费 AAC施工技术 19页 1下载券...
AAC音频编解码器相关
音频编解码器 AAC 的学习 AAC 编解码器资料 下载网址:http://www.audiocoding...(转)aac 以adts格式封装... 8页 免费 音频压缩编码原理及标准 57页 免费 ...
RTP包里面得到H.264数据和AAC数据的方法
RTP包里面得到H.264数据和AAC数据的方法_工学_高等...一个封装单个 NAL 单元包到 RTP 的 NAL 单元流的...[20]; unsigned char ADTS[] = {0xFF, 0xF1,...
高清的格式及封装汇总
视频封装格式 8页 免费如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题...(新增) 新增) 新增 音频解 码格式 音频封 AAC, M4A, MPEG audio (MP1, ...
ac3转aac简单教程
ac3转aac简单教程_计算机软件及应用_IT/计算机_专业资料。鉴于看到论坛很多人都...音频封装格式吧现阶段 ms 出现在爱情动 作片的 avi 文件多些 mkv 还封装 ac3...
AAC音频编码格式
AAC 音频编码格式,完整名称叫做"高级音频编码(...即 X.264+AAC 封装于 MKV 容器或者 MP4容器之中...aac 等等,因功能不同(ADTS、ADIF 等文件头)以及 ...
音频的提取分离转换之大全(一)
AAC,格式比较特殊,它的文件格式AAC,扩展名也是 AAC ,其实它是 ADTS 音频...Flac 音频,一般很少封装到 MKV、ts、m2ts 里,它通常以单独的 falc 文件存在,...
更多相关标签:
aac adts 封装与解析 | aac 封装格式 | aac adts | aac adtstoasc | ffmpeg aac adtstoasc | bsf a aac adtstoasc | aac adts header定义 | aac adts解码器 |