fdk-aac使用

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 bytes2:the whole buffer must be of size 2^nSo 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个字节

你可能感兴趣的:(ffmpeg,pcm,aac)