天天看点

AAC_LC用LATM封装header信息解析 Audio Specific Config格式分析

通常来说AAC的头信息在编解码过程中是可以获取到的,但今天需要根据音频参数生成相应的AAC头。项目中使用的是AAC_LC,今天先对它的结构进行分析。

    项目中使用ffmpeg进行音频编码,音频编码库为FAAC,好吧,直接看代码吧。

    ffmpeg调用Faac_encode_init()初始化编码器;在Faac_encode_init()调用faacEncGetDecoderSpecificInfo()获取AAC_LC头信息内容及长度。

<a href="http://doc.okbase.net/zhangxu0512/archive/55448.html#">?</a>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<code>int</code> <code>FAACAPI faacEncGetDecoderSpecificInfo(faacEncHandle hEncoder,unsigned</code><code>char</code><code>** ppBuffer,unsigned</code><code>long</code><code>* pSizeOfDecoderSpecificInfo)</code>

<code>{</code>

<code>    </code><code>BitStream* pBitStream = NULL; &lt;span style=</code><code>"font-family:Times New Roman;"</code><code>&gt;&lt;/span&gt;</code><code>if</code><code>((hEncoder == NULL) || (ppBuffer == NULL) || (pSizeOfDecoderSpecificInfo == NULL)) {</code>

<code>        </code><code>return</code> <code>-1;</code>

<code>    </code><code>}</code>

<code>    </code><code>if</code><code>(hEncoder-&gt;config.mpegVersion == MPEG2){</code>

<code>        </code><code>return</code> <code>-2;</code><code>/* not supported */</code>

<code>    </code><code>*pSizeOfDecoderSpecificInfo = 2;</code>

<code>    </code><code>*ppBuffer =</code><code>malloc</code><code>(2);</code>

<code>    </code><code>if</code><code>(*ppBuffer != NULL){</code>

<code>        </code><code>memset</code><code>(*ppBuffer,0,*pSizeOfDecoderSpecificInfo);</code>

<code>        </code><code>pBitStream = OpenBitStream(*pSizeOfDecoderSpecificInfo, *ppBuffer);</code>

<code>        </code><code>PutBit(pBitStream, hEncoder-&gt;config.aacObjectType, 5);</code>

<code>        </code><code>PutBit(pBitStream, hEncoder-&gt;sampleRateIdx, 4);</code>

<code>        </code><code>PutBit(pBitStream, hEncoder-&gt;numChannels, 4);</code>

<code>        </code><code>CloseBitStream(pBitStream);</code>

<code>        </code><code>return</code> <code>0;</code>

<code>    </code><code>}</code><code>else</code> <code>{</code>

<code>        </code><code>return</code> <code>-3;</code>

<code>}</code>

    从代码中可以看出,头数据长度固定为2;

    数据内容由高位到低位依次为:aacObjectType(5bits),sampleRateIdx(4bits),numChannels(4bits)

例如:音频编码参数为:

aacObjectType:AAC_LC,对应值为2,用5bit二进制表示为00010;

sampleRate:44100KHz, 对应的IDX值为4, 用4bit二进制表示为0100; 

numChannels:2,对应的值为2,用4bit二进制表示为0010;

将它们由高位到低位串起来:0001,0010,0001,0000,

则,对应的十六进制值为:0x1220

引一些参考资料:http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio

The Audio Specific Config is the global header for MPEG-4 Audio:

MPEG-4 Audio Object Types:

0: Null

9: HXVC (Harmonic Vector eXcitation Coding)

10: Reserved

11: Reserved

12: TTSI (Text-To-Speech Interface)

13: Main Synthesis

14: Wavetable Synthesis

15: General MIDI

16: Algorithmic Synthesis and Audio Effects

18: Reserved

25: ER HVXC

26: ER HILN (Harmonic and Individual Lines plus Noise)

27: ER Parametric

28: SSC (SinuSoidal Coding)

31: (Escape value)

35: DST (Direct Stream Transfer)

40: SMR (Symbolic Music Representation) Simple

41: SMR Main

43: SAOC (Spatial Audio Object Coding)

There are 13 supported 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: 11025 Hz

11: 8000 Hz

12: 7350 Hz

13: Reserved

14: Reserved

15: frequency is written explictly

These are the channel configurations:

0: Defined in AOT Specifc Config

1: 1 channel: front-center

2: 2 channels: front-left, front-right

3: 3 channels: front-center, front-left, front-right

4: 4 channels: front-center, front-left, front-right, back-center

5: 5 channels: front-center, front-left, front-right, back-left, back-right

6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel

7: 8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel

8-15: Reserved

继续阅读