FAAD2解码AAC帧为PCM帧,通道数和采样率不正确的问题

it2023-01-22  76

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; }

 

最新回复(0)