FAAD解码AAC音频

2018-12-12  本文已影响0人  iOS_tree

在使用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

上一篇 下一篇

猜你喜欢

热点阅读