AAC的ADTS头解析
1. ADTS(Audio Data Transport Stream)头之于AAC
AAC音频文件的每一帧都由一个ADTS头和AAC ES(AAC音频数据)组成。
![](http://upload-images.jianshu.io/upload_images/1313120-deee8ae1a5dd0744.png?imageMogr2/auto-orient/strip|imageView2/2/w/1020/format/webp)
AAC数据帧
2. ADTS头分析
ADTS头包含了AAC文件的采样率、通道数、帧数据长度等信息。ADTS头分为固定头信息和可变头信息两个部分,固定头信息在每个帧中的是一样的,可变头信息在各个帧中并不是固定值。ADTS头一般是7个字节((28+28)/ 8)长度,如果需要对数据进行CRC校验,则会有2个Byte的校验码,所以ADTS头的实际长度是7个字节或9个字节。
2.1 固定头信息:adts_fixed_header()
ADTS头的固定头信息在每个帧中都是一样的。
![](http://upload-images.jianshu.io/upload_images/1313120-e196fee51db64e65.png?imageMogr2/auto-orient/strip|imageView2/2/w/920/format/webp)
adts_fixed_header
- syncword:帧同步标识一个帧的开始,固定为0xFFF
- ID:MPEG 标示符。0表示MPEG-4,1表示MPEG-2
- layer:固定为'00'
- protection_absent:标识是否进行误码校验。0表示有CRC校验,1表示没有CRC校验
- profile:标识使用哪个级别的AAC。1: AAC Main 2:AAC LC (Low Complexity) 3:AAC SSR (Scalable Sample Rate) 4:AAC LTP (Long Term Prediction)
- sampling_frequency_index:标识使用的采样率的下标
- private_bit:私有位,编码时设置为0,解码时忽略
- channel_configuration:标识声道数
- original_copy:编码时设置为0,解码时忽略
- home:编码时设置为0,解码时忽略
![](http://upload-images.jianshu.io/upload_images/1313120-919bd1e94e0fee49.png?imageMogr2/auto-orient/strip|imageView2/2/w/577/format/webp)
sampling_frequency_index
![](http://upload-images.jianshu.io/upload_images/1313120-c84abc7569023e2c.png?imageMogr2/auto-orient/strip|imageView2/2/w/1131/format/webp)
channel_configuration
2.2 可变头信息:adts_variable_header()
![](http://upload-images.jianshu.io/upload_images/1313120-d68e517cbd61e9f8.png?imageMogr2/auto-orient/strip|imageView2/2/w/919/format/webp)
adts_variable_header.png
- copyrighted_id_bit:编码时设置为0,解码时忽略
- copyrighted_id_start:编码时设置为0,解码时忽略
- aac_frame_length:ADTS帧长度包括ADTS长度和AAC声音数据长度的和。即 aac_frame_length = (protection_absent == 0 ? 9 : 7) + audio_data_length
- adts_buffer_fullness:固定为0x7FF。表示是码率可变的码流
- number_of_raw_data_blocks_in_frame:表示当前帧有number_of_raw_data_blocks_in_frame + 1 个原始帧(一个AAC原始帧包含一段时间内1024个采样及相关数据)。
原文链接:https://www.jianshu.com/p/b5ca697535bd