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