首先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是数据被缓冲,并不是错误。
解码相对编码更简单。
但是遇到个问题,就是编码单声道的数据,解码会返回双声道,这对打开播放设备播放时造成了一定的
困扰。因为前期是将音频编码参数优先发送出来,接收端收到参数后会打开播放设备,现在得在数据解码后再打开
播放设备。