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

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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值