在使用FAAD解码前我们首先导入faad库,相关库及源码可从https://www.audiocoding.com/faad2.html下载。
使用FAAD解码AAC数据为PCM时,主要分为4个步骤:
1、创建解码器
2、配置解码器
3、解码AAC数据为PCM数据
4、解码完毕,关闭解码器
1、创建解码器
创建解码器函数如下:
NeAACDecHandle NEAACDECAPI NeAACDecOpen(void);
创建成功则返回解码器句柄,创建失败则返回0。
2、配置解码器
我们首先获取解码器配置参数的结构体,函数如下:
NeAACDecConfigurationPtr NEAACDECAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder);
输入的参数为第一步创建的解码器的句柄,返回为解码器配置参数的结构体的指针。获取失败则会返回为空。
我们设置参数如下:
conf->defObjectType = LC;
conf->defSampleRate = sampleRate;
conf->outputFormat = FAAD_FMT_16BIT;
conf->dontUpSampleImplicitSBR = 1;
参数设置非常简单,第一个为类型;第二个为采样率,第三个为保存音频的位数;第四个为SBR标志。
参数在头文件有详细说明,可参照头文件及实际情况进行设置。
让我们的配置生效,还需要启动配置,函数如下:
unsigned char NEAACDECAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder,
NeAACDecConfigurationPtr config);
函数中,第一个参数为解码器句柄,第二个为我们的的配置结构体的指针对象。返回值为0时代表配置失败。
3、解码AAC数据
正式解码前,我们需要根据aac数据初始化faad解码句柄,函数如下:
long NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, //解码器句柄
unsigned char *buffer, //输入数据的指针
unsigned long buffer_size, // 输入数据的长度
unsigned long *samplerate, //保存从aac数据中获取的编码的采样率
unsigned char *channels); //保存从aac数据中获取的编码的通道数
返回非0则代表成功。此方法只需要在解码数据前调用一次,无需重复调用。其中输入的数据最好多余一个aac数据包,以便正确解析数据。
初始化成功后,我们正式开始解码,解码函数如下:
void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hDecoder, //解码器句柄
NeAACDecFrameInfo *hInfo, //解码frame的信息
unsigned char *buffer, //需要解码的数据指针
unsigned long buffer_size); //需要解码的数据的长度
每次填入的解码数据为一个ADTS帧,ADTS帧的同步数据为0xfff,我们以此来分割AAC数据进行解码。
解码后我们需要获取解码是否成功,此时我们通过第二个参数的error属性进行判断,若error大于0则代表解码失败。
解码成功则读取解码后的PCM数据,我们可以根据第二个参数返回的 unsigned long samples;
unsigned char channels;两个属性进行手动计算PCM数据的大小,然后从返回指针的起始地址读取相应的字节数,这时候此段内存中保存的数据即为解码的PCM数据。我们循环输入每一帧ADTS数据,得到解码后的PCM数据,直到所有数据解码完毕。获取的PCM数据可以根据用户自己的用途进行保存或者播放。
4、关闭解码器
关闭解码器非常简单,函数如下:
void NEAACDECAPI NeAACDecClose(NeAACDecHandle hDecoder);
函数参数为解码器的句柄,此时整个解码流程完成。
欢迎交流留言。
demo地址:https://github.com/XMSECODE/ESCAACCoderDemo
网友评论