通常来说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; <span style=</code><code>"font-family:Times New Roman;"</code><code>></span></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->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->config.aacObjectType, 5);</code>
<code> </code><code>PutBit(pBitStream, hEncoder->sampleRateIdx, 4);</code>
<code> </code><code>PutBit(pBitStream, hEncoder->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