使用FAAC進行AAC編碼

首先FAAC和FAAD的下載地址在前面的博文裏有。

FAAC和FAAD有win32的編譯工程,相對其他開源項目來說,win32的編譯很簡單了

FAAC,FAAD的編碼和解碼也封裝的非常好,使用上很簡單。

打開FAAC編碼器

 m_faacHandle = faacEncOpen(isamplerate, ichannels, &m_uSampleInput, &m_uOutputBytes);

 if( 0 == m_faacHandle )
  return false ;

 faacEncConfigurationPtr faacCfg;

 faacCfg = faacEncGetCurrentConfiguration(m_faacHandle);

 if (faacCfg->version != FAAC_CFG_VERSION){
  return false ;
 }

 //* 設置配置參數
 faacCfg->aacObjectType = LOW;    //LC編碼
 faacCfg->mpegVersion = MPEG4;  //
 faacCfg->useTns   = 1 ;                   //時域噪音控制,大概就是消爆音
 faacCfg->allowMidside = 0 ;            //
 faacCfg->bitRate  = m_nBitRate/m_uChannelNums;
 faacCfg->bandWidth  = 0 ;              //頻寬
 faacCfg->outputFormat = isADTS;  //輸出是否包含ADTS頭
 faacCfg->inputFormat = FAAC_INPUT_16BIT;
 //faacCfg->shortctl = 0 ;
 faacCfg->quantqual = 50 ;

 //* 獲取解碼信息.
 //unsigned char* ucBuffer = NULL;
 //unsigned long ulDecoderSpecificInfoSize;
 //faacEncGetDecoderSpecificInfo(m_faacHandle, &ucBuffer, &ulDecoderSpecificInfoSize);

 if (!faacEncSetConfiguration(m_faacHandle, faacCfg)){
  return false ;
 }

m_uSampleInput這個參數要注意,需要在編碼時使用。是faac所使用的音頻樣片數量

隨後就可以解碼了

int iBytesWritten = faacEncEncode(m_faacHandle, (int32_t*)input, m_uSampleInput , output, outlen );

判斷下iBytesWritten初始編碼的幾幀數據會返回0,0是數據被緩衝,並不是錯誤。

 

解碼相對編碼更簡單。

但是遇到個問題,就是編碼單聲道的數據,解碼會返回雙聲道,這對打開播放設備播放時造成了一定的

困擾。因爲前期是將音頻編碼參數優先發送出來,接收端收到參數後會打開播放設備,現在得在數據解碼後再打開

播放設備。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章