使用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是数据被缓冲,并不是错误。

 

解码相对编码更简单。

但是遇到个问题,就是编码单声道的数据,解码会返回双声道,这对打开播放设备播放时造成了一定的

困扰。因为前期是将音频编码参数优先发送出来,接收端收到参数后会打开播放设备,现在得在数据解码后再打开

播放设备。

 

 

你可能感兴趣的:(input,output)