美文网首页
FAAD解码AAC音频

FAAD解码AAC音频

作者: iOS_tree | 来源:发表于2018-12-12 16:18 被阅读0次

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

    相关文章

      网友评论

          本文标题:FAAD解码AAC音频

          本文链接:https://www.haomeiwen.com/subject/uuqphqtx.html