首先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是數據被緩衝,並不是錯誤。
解碼相對編碼更簡單。
但是遇到個問題,就是編碼單聲道的數據,解碼會返回雙聲道,這對打開播放設備播放時造成了一定的
困擾。因爲前期是將音頻編碼參數優先發送出來,接收端收到參數後會打開播放設備,現在得在數據解碼後再打開
播放設備。