AAC ADTS头详解

来源:互联网 发布:淘宝联盟编辑分享文案 编辑:程序博客网 时间:2024/05/23 01:14

本文主要参考:http://blog.csdn.net/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;
    }
}


这个函数能满足我的需求,我将aac编码出来的数据通过这个函数写入文件确实能播放,但是不太明白具体含义是什么.后来就找资料看到了参考链接中的那篇博客.看完后基本上懂了这7个字节的含义.

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 1bitID: 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 2bitprofile:表示使用哪个级别的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 4bitsampling_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 1bitprivate_bit

adtsHeader[2] |= (0 << 1);


8:

24~26 3bitchannel

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 1bitoriginal_copy 

adtsHeader[3] |= (0 << 5);


10:

28~28 1bithome

adtsHeader[3] |= (0 << 4);


11:

29~29 1bitcopyright_identification_bit

adtsHeader[3] |= (0 << 3);


12:

30~30 1bitcopyright_identification_start

adtsHeader[3] |= (0 << 2);


13:

31~43 13bitframe_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 11bitadts_buffer_fullness: 0x7ff 说明是码率可变的码流

dtsHeader[5] |= 0x1f;5

dtsHeader[6] |= 0xfc;6

15:

55~56 2bitnumber_of_raw_data_block_in_frame

dtsHeader[6] |= 0;



0 0