Fdk-aac相比 faac以及其他的aac库,好处是输出码率控制精准,而且支持he-aac的编解码,看了下android源码里面,openmax的soft aac组件就是用fdk-aac实现的
1 decoder
decoder主要有两种模式, RAW和ADTS
RAW模式: 需要在初始化decoder的时候传入AudioSpecInfo,表明即将送入的rawdata的samplerate, channel等; 送数据的时候把ADTS头去掉
m_hAacDecoder=aacDecoder_Open(TT_MP4_RAW,1);
aacDecoder_ConfigRaw(m_hAacDecoder,&m_SpecInfo,&m_SpecInfoSize)
ADTS模式: 初始化时不需要传入AudioSpecInfo;送数据时要加上ADTS头
aacDecoder_Open(TT_MP4_ADTS,1);
送数据时常用如下形式:
UINT bytesValid = lInSize;
while(bytesValid>0 && decoderErr==AAC_DEC_NOT_ENOUGH_BITS){
aacDecoder_Fill( m_hAacDecoder,
&pIn,
(UINT*)&lInSize,
&bytesValid);
decoderErr = aacDecoder_DecodeFrame(m_hAacDecoder,(INT_PCM*)m_decodeBuffer,m_decodeBufSize,0);
}
解码库会分配一个过渡性的decoder-internal input buffer,这个buffer大小又RANSPORTDEC_INBUF_SIZE规定,可以任意设定但必须满足两个条件:
1:each input channel requires 768 bytes
2:the whole buffer must be of size 2^n
So for example a stereo decoder:
TRANSPORTDEC_INBUF_SIZE = 2 768 = 1536 => 2048(选择2048bytes)
aacDecoder_Fill就是从input buffer往ecoder-internalinput buffer里面拷贝数据,返回的是input buffer中还剩下多少没有被拷贝的数据(bytesValid)
aacDecoder_DecodeFrame用来解码internal buffer中的数据,如果数据不足以解码,则返回AAC_DEC_NOT_ENOUGH_BITS,继续调用aacDecoder_Fill填充数据
2 encoder
Fdk-aac encoder官网有example,按照它的来很方便就能跑起来。其中要注意的一点是,每次送入encoder的数据量大小的问题,这个大小在encoder初始化后是固定的。
可以通过如下方法来获取。
AACENC_InfoStructm_EncInfo;
aacEncInfo(m_Handler,&m_EncInfo);
m_dwInputSizeFixed = channels * 2 * m_EncInfo.frameLength; //frameLength是每帧每个channel的采样点数
每次送入aacEncEncode 的数据量必须是m_dwInputSizeFixed。
所以从音频采集到送入aacEncEncode之间需要做一个缓冲,每次只能get m_dwInputSizeFixed个字节

3310

被折叠的 条评论
为什么被折叠?



