FAAD2下载:https://github.com/knik0/faad2
源数据:
16kHZ ,单通道,16bit位宽
问题:FAAD初始化后,返回的采样率变成了32000,通道数变成了2
解决方法如下:
1.解决采样率翻倍的问题:在调用NeAACDecInit初始化前设置两项基本参数,如下图
2.解决通道数总是2的问题:因为faad的源码内部总是强制将单通道转换成了双通道数据,所以我们可以在输出的解码数据上进行裁剪,只保留单通道数据。
问题解决完毕!
上述图片源码如下:
long AudioDecode_AAC::AudioDecode_AAC_Init(
unsigned char *frame,
unsigned long size,
unsigned long *samplerate,
unsigned char *channels)
{
if (!decoder)
{
//open decoder
decoder = NeAACDecOpen();
NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration(decoder);
conf->defObjectType = LC;
conf->defSampleRate = 8000; //real samplerate/2
conf->outputFormat = FAAD_FMT_16BIT; //
conf->downMatrix = 0; //不进行自动扩展到双通道 ???
conf->useOldADTSFormat = 0; //ADTS长度为56bit(1代表是58bit)
conf->dontUpSampleImplicitSBR = 1;
NeAACDecSetConfiguration(decoder, conf);
//initialize decoder
return NeAACDecInit(decoder, frame,size, samplerate, channels);
}
else
{
ERROR_LOG("AAC decoder already inited!\n");
return -1;
}
}
//成功:返回解码得到的PCM数据指针 ; 失败 :NULL
void* AudioDecode_AAC::AudioDecode_AAC_Decode(
NeAACDecFrameInfo *frame_info,
unsigned char *frame,
unsigned long size)
{
static char frame_mono[2048] = { 0 };
void*pcm_data = NeAACDecDecode(decoder, frame_info, frame, size);
if (frame_info->error > 0)
{
printf("%s\n", NeAACDecGetErrorMessage(frame_info->error));
}
else if (pcm_data && frame_info->samples > 0)
{
if (frame_info->channels == 2) //双通道数据转换成单通道
{
//从双声道的数据中提取单通道
int i, j;
for (i = 0, j = 0; i < 4096 && j < 2048; i += 4, j += 2)
{
//每次拷贝2字节数据到frame_mono(16bit位宽,即每个通道数据一个采样2字节)
frame_mono[j] = ((char*)pcm_data)[i];
frame_mono[j + 1] = ((char*)pcm_data)[i + 1];
}
frame_info->channels = 1;
}
return (void*)&frame_mono;
}
return NULL;
}