音频源:16KHZ,单声道,16bit位宽的 PCM 编码的AAC
解码成:双通道,16kHZ,16bit位宽 的 PCM,录制解码后的PCM数据帧
播放器如下:
关键源码如下:
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 = 16000;//8000; //real samplerate/2
conf->outputFormat = FAAD_FMT_16BIT; //
conf->downMatrix = 0; //不进行自动扩展到双通道 ???
conf->useOldADTSFormat = 0; //ADTS长度为0: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
//frame_info:返回帧信息参数
void* AudioDecode_AAC::AudioDecode_AAC_Decode(
NeAACDecFrameInfo *frame_info,
unsigned char *frame,
unsigned long size)
{
#if 1
static char frame_mono[2048] = { 0 };
memset(&frame_mono,0,sizeof(frame_mono));
#endif
check_ADTS_len(frame,size);
/*----进行解码操作----------------------------------------*/
//解析下一帧数据长度
void*pcm_data = NeAACDecDecode(decoder, frame_info, frame, size);
printf(" frame_info->samples = %d frame_info->channels = %d\n", frame_info->samples,frame_info->channels);//初始化中dontUpSampleImplicitSBR = 1时返回2048;dontUpSampleImplicitSBR=0时返回4096
if (size != frame_info->bytesconsumed)//每次传入一帧数据,这两个值每次都相等
{
printf("error!$$$$$$$$$$$$$$$$$$$$$$$$$size(%d) frame_info->bytesconsumed(%d)\n", size, frame_info->bytesconsumed);
}
if (frame_info->error > 0)
{
printf("error!$$$$$$$$$ %s\n", NeAACDecGetErrorMessage(frame_info->error));
}
else if (pcm_data && frame_info->samples > 0)
{
#if 0 //转换成单通道数据,faad解码总是强制性变成双通道输出
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->samples = 1024; //只留下单通道数据
frame_info->channels = 1;
}
return (void*)&frame_mono;
#else //直接返回双通道数据
return pcm_data;
#endif
}
return NULL;
}
保存数据部分如下:
源文件如下:
链接:https://pan.baidu.com/s/1VGXIfD-X74XCDG3-O17dHg
提取码:wbzn