本文主要是介绍AAC的ADTS头信息介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
ADTS是Audio Data Transport Stream的简称。
是AAC音频文件常见的传输格式。
有的时候当你编码AAC裸流的时候,会遇到写出来的AAC文件并不能在PC和手机上播放,很大的可能就是AAC文件的每一帧里缺少了ADTS头信息文件的包装拼接。只需要加入头文件ADTS即可。 一个AAC原始数据块长度是可变的,对原始帧加上ADTS头进行ADTS的封装,就形成了ADTS帧。
下面分析下ADTS头文件结构和信息:
AAC音频文件的每一帧由ADTS Header和AAC Audio Data组成。
大家可以用AAC Audio ES Viewer工具来查看AAC的ADTS Header。
每一帧的ADTS的头文件都包含了音频的采样率,声道,帧长度等信息,这样解码器才能解析读取。
一般情况下ADTS的头信息都是7个字节,分为2部分:
adts_fixed_header();
adts_variable_header();
先来看:adts_fixed_header();
- syncword :总是0xFFF, 代表一个ADTS帧的开始, 用于同步.
解码器可通过0xFFF确定每个ADTS的开始位置.
因为它的存在,解码可以在这个流中任何位置开始, 即可以在任意帧解码。
- ID:MPEG Version: 0 for MPEG-4,1 for MPEG-2
- Layer:always: '00'
- protection_absent:Warning, set to 1 if there is no CRC and 0 if there is CRC
- profile:表示使用哪个级别的AAC,如01 Low Complexity(LC) -- AAC LC
profile的值等于 Audio Object Type的值减1.
profile = MPEG-4 Audio Object Type - 1 - 采样率的下标
- 声道数,比如
接下来看下 adts_variable_header();
- aac_frame_length:一个ADTS帧的长度包括ADTS头和AAC原始流。frame length, this value must include 7 or 9 bytes of header length:
aac_frame_length = (protection_absent == 1 ? 7 : 9) + size(AACFrame)
protection_absent=0时, header length=9bytes
protection_absent=1时, header length=7bytes - 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个采样及相关数据)
两个头文件就讲到这里。
这里给出JAVA和Android里的给AAC添加ADTS头文件的部分方法代码,针对ByteBuffer。
这里是调用:(可根据自己需求,这里的AudioBufFrame是我们自己项目里的类,其实就是个ByteBuffer封装的类)
这篇关于AAC的ADTS头信息介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!