本文主要参考:http://blog.youkuaiyun.com/andyhuabing/article/details/40983423
参考的那篇博客里有非常详细的ADTS头介绍.讲述的非常全面.我写这篇博客的目的就是记录一下aac数据写文件的方法,之后的工作中经常会用到.这次是为了验证aac编码出来的数据是否正确.一开始在网上找了了个函数,如下:
FILE *fp;
void writeAAC(uint8_t *aac, int len) {
if (fp == NULL) {
remove("/storage/sdcard0/1.aac");
fp = fopen("/storage/sdcard0/1.aac", "wb");
}
uint8_t adtsHeader[7] = {0};
adtsHeader[0] = 0xFF;
adtsHeader[1] = 0xF1;
adtsHeader[2] = 0x5C; //sampleRate:24000–—0x64, 32000–—0x60, 44100–—0x5c, 48000–—0x58
adtsHeader[3] = 0x40; //channel: 2——0x80, 1——0x40
adtsHeader[4] = (len + 7) >> 3;
adtsHeader[5] = ((len + 7) & 0x7) << 5;
adtsHeader[6] = 0xFC;
if (7 != fwrite(adtsHeader, 1, 7, fp)) {
return;
}
if (len != fwrite(aac, 1, len, fp)) {
return;
}
}
ADTS头:
uint8_t adtsHeader[7] = {0}; //每bit上都是0;
1:
01~12 12bit “1111 1111 1111” syncword:同步头,总是0xFFF,代表着一个ADTS帧的开始
adtsHeader[0] = 0xFF;
adtsHeader[1] = 0xF0;
2:
13~13 1bit ID: 0代表MPEG-4, 1代表MPEG-2
adtsHeader[1] |= (0 << 3);
3:
14~15 2bit “00” layer:总是00
adtsHeader[1] |= (0 << 2);
adtsHeader[1] |= (0 << 1);
4:
16~16 1bit “1” protection_absent
adtsHeader[1] |= 1;
5:
17~18 2bit profile:表示使用哪个级别的AAC
0: Main profile
1: Low Complex profile(LC)
2: Scalable Sampling Rate profile(SSR)
3: (保留)
adtsHeader[2] |= (unsigned char) ((profile & 0x3) << 6);
6:
19~22 4bit sampling_frequency_index:表示使用的采样率下标,通过这个下标在sampling frequencies[]数组中查询得到采样率的值
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:11025HZ
11:8000 HZ
12:7350 HZ
13:保留
14:保留
15:保留
adtsHeader[2] |= (unsigned char) ((sampleRate & 0xf) << 2);
7:
23~23 1bit private_bit
adtsHeader[2] |= (0 << 1);
8:
24~26 3bit channel
0:defined in AOT specific config
1:1声道:front-center
2:2声道:front-left,front-right
3:3声道:front-center,front-left,front-right
4:4声道
5:5声道
6:6声道
7:8声道
8-15:保留
adtsHeader[2] |= (unsigned char) ((channel & 0x4) >> 2);
adtsHeader[3] |= (unsigned char) ((channel & 0x3) << 6);
9:
27~27 1bit original_copy
adtsHeader[3] |= (0 << 5);
10:
28~28 1bit home
adtsHeader[3] |= (0 << 4);
11:
29~29 1bit copyright_identification_bit
adtsHeader[3] |= (0 << 3);
12:
30~30 1bit copyright_identification_start
adtsHeader[3] |= (0 << 2);
13:
31~43 13bit frame_length
dtsHeader[3] |= (unsigned char) ((frame_len & 0x1800) >> 11); 高2位
dtsHeader[4] |= (unsigned char) ((frame_len & 0x7f8) >> 3); 中8位
dtsHeader[5] |= (unsigned char) ((frame_len & 0x7) << 5); 低3位
14:
44~54 11bit adts_buffer_fullness: 0x7ff 说明是码率可变的码流
dtsHeader[5] |= 0x1f; 高5位
dtsHeader[6] |= 0xfc; 低6位
15:
55~56 2bit number_of_raw_data_block_in_frame
dtsHeader[6] |= 0;