ADTS头分为固定头信息(adts_fixed_header)和可变头信息(adts_variable_header)两个部分,
固定头信息在每个帧中的是一样的,可变头信息在各个帧中并不是固定值。
ADTS头一般是7Byte(28bit+28bit)长度
如果需要对数据进行CRC校验,则会有2个Byte的校验码,
所以ADTS头的实际长度是7个字节或9个字节。
固定头信息 | 大小(bit) | 说明 |
---|---|---|
synword | 12 | 固定0xFFF,用作同步,表示帧的开始 |
id | 1 | MPEG标识符 : 0 : MPEG-4 1 : MPEG-2 |
layer | 2 | 固定 0x00 |
protection_absent | 1 | 0:有crc校验 1:没crc校验 |
profile | 2 | 1 : AAC Main 2 : AAC LC (Low Complexity) 3 : AAC SSR (Scalable Sample Rate) 4 : AAC LTP (Long Term Prediction) |
sampling_frequency_index | 4 | 0: 96000 Hz 1: 88200 Hz 2 : 64000 Hz 3 : 48000 Hz 4 : 44100 Hz 5 : 32000 Hz 6 : 24000 Hz 7 : 22050 Hz 8 : 16000 Hz 9 : 12000 Hz 10 : 11025 Hz 11 : 8000 Hz 12 : 7350 Hz 13 : Reserved 14 : Reserved 15 : frequency is written explictly |
private_bit | 1 | 私有位,编码时为0,解码时忽略 |
channel_configuration | 3 | 声道数 1:单声道 2:双声道 其余参考更多 |
orininal_copy | 1 | 固定 0 |
home | 1 | 固定 0 |
可变头信息 | 共有 28 bit | |
copyrigth_identification_bit | 1 | 固定 0 |
copyrigth_identification_stat | 1 | 固定 0 |
aac_frame_length | 13 | ADTS头(7Byte) + AAC裸流长度 |
adts_bufferfullness | 11 | 缓冲区充满度 0x7FF说明是码率可变的码流 |
number_of_raw_data_blocks_in_frame | 2 | 0 : 表示说ADTS帧中只有一个AAC数据 |
校验位 | 共有 2 Byte | |
crc | 16 | 校验位 一般不需要 |
代码实现
static void adts_header(unsigned char *szAdtsHeader, int dataLen){
int adtsLen = dataLen + 7;
int sampling_frequency_index = 11; // 3;
int channel_config = 1;
szAdtsHeader[0] = 0xff;
szAdtsHeader[1] = 0xf1;
szAdtsHeader[1] |= (0 << 3);
szAdtsHeader[1] |= (0 << 1);
szAdtsHeader[1] |= 1;
szAdtsHeader[2] = 1<<6; // profile
szAdtsHeader[2] |= (sampling_frequency_index & 0x0f)<<2;
szAdtsHeader[2] |= (0 << 1);
szAdtsHeader[2] |= (channel_config & 0x04)>>2;
szAdtsHeader[3] = (channel_config & 0x03)<<6;
szAdtsHeader[3] |= (0 << 5);
szAdtsHeader[3] |= (0 << 4);
szAdtsHeader[3] |= (0 << 3);
szAdtsHeader[3] |= (0 << 2);
szAdtsHeader[3] |= ((adtsLen & 0x1800) >> 11);
szAdtsHeader[4] = (unsigned int)((adtsLen & 0x7f8) >> 3);
szAdtsHeader[5] = (unsigned int)((adtsLen & 0x7) << 5);
szAdtsHeader[5] |= 0x1f;
szAdtsHeader[6] = 0xfc;
}
flv格式中裸流的AAC数据是没办法播放的,需要添加ADTS头才能够播放
在其他的流传输中也可能不带有adts头,所以在送往播放器前需进行adts头的补充。