嘉兴市建设工程监理协会网站,北京网站搭建服务商,jizhicms,天猫商城入驻音视频入门基础#xff1a;AAC专题系列文章#xff1a;
音视频入门基础#xff1a;AAC专题#xff08;1#xff09;——AAC官方文档下载
音视频入门基础#xff1a;AAC专题#xff08;2#xff09;——使用FFmpeg命令生成AAC裸流文件
音视频入门基础#xff1a;AAC…
音视频入门基础AAC专题系列文章
音视频入门基础AAC专题1——AAC官方文档下载
音视频入门基础AAC专题2——使用FFmpeg命令生成AAC裸流文件
音视频入门基础AAC专题3——AAC的ADTS格式简介
音视频入门基础AAC专题4——ADTS格式的AAC裸流实例分析
音视频入门基础AAC专题5——FFmpeg源码中判断某文件是否为AAC裸流文件的实现
音视频入门基础AAC专题6——FFmpeg源码中解码ADTS格式的AAC的Header的实现
音视频入门基础AAC专题7——FFmpeg源码中计算AAC裸流每个packet的size值的实现
音视频入门基础AAC专题8——FFmpeg源码中计算AAC裸流AVStream的time_base的实现
音视频入门基础AAC专题9——FFmpeg源码中计算AAC裸流每个packet的duration和duration_time的实现
音视频入门基础AAC专题10——FFmpeg源码中计算AAC裸流每个packet的pts、dts、pts_time、dts_time的实现 一、引言
AACAdvanced Audio Coding有两种格式
1.ADIFAudio Data Interchange Format音频数据交换格式整个流中只包含一个Header文件头不能在任意处读取。这种格式基本用不到。
2.ADTSAudio Data Transport Stream音频数据传输流每一帧的音频压缩数据包中都有一个Header记录音频的采样率、通道数等参数使得解码可以在流的任何位置开始。所以一般都是用ADTS包装的AAC。 这两种格式的Header不一样本系列主要针对ADTS格式的AAC进行讲解。首先我们从《音视频入门基础AAC专题1——AAC官方文档下载》下载AAC的标准文档《ISO_IEC_13818-7_2006(E).pdf》和《ISO14496-3-2009.pdf》以及MP3的标准文档《ISO11172-3.pdf》。现在一般都是用MPEG-4的AAC所以我们主要阅读《ISO14496-3-2009.pdf》但是对于从MPEG-2中继承下来的属性我们需要翻阅《ISO_IEC_13818-7_2006(E).pdf》对于从MP3中继承下来的属性我们需要翻阅《ISO11172-3.pdf》。 注《ISO_IEC_13818-7_2006(E).pdf》总共有202页《ISO14496-3-2009.pdf》总共有1416页下面的页数是指在pdf阅读器中显示的页数 二、ADTS格式的Header
一ADTS Header的基本概念
根据《ISO14496-3-2009.pdf》第121页ADTS序列ADTS流由一个个adts音频帧adts音频压缩数据包组成。使用syncword分割各个adts音频帧 根据《ISO14496-3-2009.pdf》第29页syncword为嵌入在ADTS流中的一种编码用于标识ADTS音频帧的起始位置 根据《ISO14496-3-2009.pdf》第122页adts_variable_header中的number_of_raw_data_blocks_in_frame属性的值为0的情况下每个adts帧由adts_fixed_header固定头、adts_variable_header可变头、adts_error_check错误校验、raw_data_block原始数据块组成 其中ADTS Header由adts_fixed_header、adts_variable_header和adts_error_check组成。根据《ISO14496-3-2009.pdf》第123页adts_fixed_header中的protection_absent属性的值为0时adts_error_check才会存在CRC校验。所以当protection_absent为0时adts_error_check占16位2字节当protection_absent不为0时adts_error_check占0位0字节 adts_fixed_header固定占28位adts_variable_header也占28位。所以当protection_absent为0时ADTS Header占9字节protection_absent不为0时ADTS Header占7字节。 二adts_fixed_header
根据《ISO14496-3-2009.pdf》第122页adts_fixed_header包含的属性如下。从下表中可以看到每个属性占的位数这些属性加起来总共占28位所以adts_fixed_header固定占28位 根据《ISO14496-3-2009.pdf》第32页bslbfbit stringleft bit first表示比特串左位在先。
uimsbfunsigned integermost significant bit first表示无符号整数高位在先。具体可以参考《uimsbf和 bslbf的含义》 syncword占12位。关于syncword属性的值的描述在《ISO14496-3-2009.pdf》中并没有提到但是在《ISO_IEC_13818-7_2006(E).pdf》可以找到关于它的说明。从上文我们可以知道syncword为嵌入在ADTS流中的一种编码用于标识ADTS帧的起始位置。根据《ISO_IEC_13818-7_2006(E).pdf》第45页syncword的每个位都必须被设置为1也就是0b111111111111 ID占1位。根据《ISO14496-3-2009.pdf》第124页ID为MPEG版本的标识符。如果ADTS流中的音频数据是MPEG-2 AACID被设置为1如果音频数据是MPEG-4 AAC其被设置为0 layer占2位。根据《ISO_IEC_13818-7_2006(E).pdf》第45页layer总被设置为00 protection_absent占1位。根据《ISO_IEC_13818-7_2006(E).pdf》第45页protection_absent表示CRC校验是否存在。从上文可以知道当protection_absent为0时CRC校验存在当protection_absent为1时CRC校验不存在 profile_ObjectType占2位。根据《ISO14496-3-2009.pdf》第124页MPEG版本为MPEG-4时如果profile_ObjectType为0AAC的规格为AAC Main如果profile_ObjectType为1规格为AAC LC如果profile_ObjectType为2规格为AAC SSR如果profile_ObjectType为3规格为AAC LTP samplingFrequencyIndex占4位。根据《ISO14496-3-2009.pdf》第59页samplingFrequencyIndex表示音频的采样频率 private_bit占1位。《ISO_IEC_13818-7_2006(E).pdf》和《ISO14496-3-2009.pdf》里面没有对其进行任何说明。在《ISO_IEC_13818-7_2006(E).pdf》第46页写了想要了解private_bit属性得查阅标准文档《ISO/IEC 11172-3》 所以我们从https://csclub.uwaterloo.ca/~pbarfuss/ISO11172-3.pdf 下载《ISO11172-3.pdf》在其第23页终于找到关于private_bit属性的说明了意思就是private_bit没用 channel_configuration占3位。根据《ISO14496-3-2009.pdf》第60页。channel_configuration表示音频声道数。比如channel_configuration值为1表示是单声道center front speaker值为2表示是双声道left, right front speakers值为3三声道center, left, right front speakers值为4四声道center, left, right front speakers, rear surround speakers值为5五声道center, left, right front speakers, left surround, right surround rear speakers值为6 5.1声道center, left, right front speakers, left surround, right surround rear speakers, front low frequency effects speaker)值为77.1声道center, left, right center front speakers, left, right outside front speakers, left surround, right surround rear speakers, front low frequency effects speaker)值为8到15保留 original_copy占1位。该属性继承自mp3里的copyright属性。根据《ISO11172-3.pdf》第24页如果这个比特位等于0则表示编码的比特流没有版权1表示版权受保护 home占1位。该属性继承自mp3里的original/home属性。根据《ISO11172-3.pdf》第24页如果比特流是一个拷贝home的值为0如果是原始比特流则值为1 三adts_variable_header
根据《ISO14496-3-2009.pdf》第122页adts_variable_header包含的属性如下。从下表中可以看到每个属性占的位数这些属性加起来总共占28位所以adts_variable_header固定占28位 copyright_identification_bit占1位。根据《ISO_IEC_13818-7_2006(E).pdf》第46页copyright_identification_bit为72位版权标识字段中的一位 copyright_identification_start占1位。根据《ISO_IEC_13818-7_2006(E).pdf》第46页copyright_identification_start表示copyright_identification_bit音频帧是72位版权标识的第一位。如果没有版权标识传输此位应保留 0 aac_frame_length占13位。根据《ISO_IEC_13818-7_2006(E).pdf》第46页aac_frame_length为整个ADTS音频帧的长度包含ADTS Header、错误校验和AAC原始数据块单位为字节 adts_buffer_fullness占11位。根据《ISO_IEC_13818-7_2006(E).pdf》第46页至47页adts_buffer_fullness为在adt编码过程中比特储存的状态。如果值为0x7FF表示比特流是可变速率比特流 number_of_raw_data_blocks_in_frame占2位。根据《ISO_IEC_13818-7_2006(E).pdf》第47页一个ADTS音频帧中有number_of_raw_data_blocks_in_frame 1个AAC原始数据块。number_of_raw_data_blocks_in_frame的值为0表示该ADTS音频帧中只有一个AAC原始数据块 三、AAC的samples
根据《ISO14496-3-2009.pdf》第9页对于标准的MPEG-2/4 AAC其samples一帧音频数据中采样的次数为1024或者960次 根据《ISO14496-3-2009.pdf》第46页规格为AAC LC和AAC LTP的AAC一帧音频数据中采样的次数只允许为1024次 至于AAC的samples啥时候为960次我浏览了AAC的标准文档在里面并没有找到相关说明AAC的Header中也没有属性用来标识samples是1024还是960次。在微软的官方文章《AAC 解码器》中说明了Microsoft Media Foundation AAC 解码器仅支持1024个样本帧也就是AAC解码器仅支持的samples为1024不支持960 我浏览了国外论坛的某些文章《Topic: AAC decoding with a free Windows Library?》、《Support of AAC with 960 samples/frame》里面写到AACAAC Main、AAC LC、AAC SSR、AAC LTP的samples通常是1024而DABAAC、HE AAC v2的samples是960。所以可以认为目前约定俗成是AACAAC Main、AAC LC、AAC SSR、AAC LTP的samples是1024而DABAAC、HE AAC v2的samples是960。目前市面上的AAC解码器不支持samples为960的AAC。
FFmpeg源码内部会强制默认AACAAC Main、AAC LC、AAC SSR、AAC LTP的samples是1024具体可以参考《音视频入门基础AAC专题6——FFmpeg源码中解码ADTS格式的AAC的Header的实现》。 这个samples一帧音频数据中采样的次数非常重要用于计算一个adts音频帧adts音频压缩数据包的时长具体可以参考《FFmpeg源码get_audio_frame_duration、av_get_audio_frame_duration2、av_get_audio_frame_duration函数分析》。 四、AAC的Bit depth
Bit depth又叫位深度、位元深度、采样深度、采样位数、采样格式是用于编码每个样本的数字信息位数。简单来说位元深度衡量的是“精度”。Bit depth越高信号就越能准确地表示实际模拟声源的振幅。使用最低可能的Bit depth我们只有两种选择来测量声音的精度0表示完全静音1表示最高音量。Bit depth越高对音频编码的精度越高。举个例子CD质量的音频的Bit depth是标准的16位有216或65536个音量可供选择。
Bit depth对于PCM编码是固定的但对于有损压缩编解码器如MP3和AAC它是在编码期间计算的并且可以因采样而异。
也就是说Bit depth只对PCM数字信号有意义。非PCM格式如AAC这种有损压缩格式Bit depth是没有意义的。所以AAC裸流的Header中没有Bit depth信息WAV音频文件因为一般存贮的是PCM音频数据所以WAV Header中才有Bit depth信息具体可以参考《音视频入门基础WAV专题2——WAV格式简介》。 五、参考文章
《Audio encoding demystified》