美文网首页
FAAC编码PCM音频

FAAC编码PCM音频

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

    在使用FAAC编码前我们首先导入faac库,相关库及源码可从https://www.audiocoding.com/faac.html下载。
    使用FAAC编码PCM数据为AAC时,主要分四个步骤:
    1、创建AAC编码器
    2、设置编码器参数
    3、输入PCM数据,输出编码后的AAC数据
    4、编码结束,关闭编码器

    1、创建AAC编码器

    创建编码器的函数如下:

    faacEncHandle FAACAPI faacEncOpen(unsigned long sampleRate,
                      unsigned int numChannels,
                      unsigned long *inputSamples,
                                      unsigned long *maxOutputBytes
                                     );
    

    其中参数如下

        unsigned long sampleRate,     //输入的PCM数据的采样率
        unsigned int numChannels,    //输入的PCM数据的频道数
        unsigned long *inputSamples,    //获取的输入的音频样本的最大输入样本数量
        unsigned long *maxOutputBytes    //获取的最大输出的数据的字节数
    

    其中第一个和第二个参数为用户输入,第三个和第四个参数需要用户保存,到后面使用。
    创建成功后返回AAC编码器句柄,句柄需要用户保存到后面几步进行使用。

    2、配置参数

    设置参数之前,我们首先获取配置结构体对象的指针,使用下面的函数获取:

    faacEncConfigurationPtr FAACAPI
      faacEncGetCurrentConfiguration(faacEncHandle hEncoder);
    

    输入为第一步创建的编码器句柄,返回为配置结构体的指针。
    获取成功后我们进行如下配置:

        self.pConfiguration = faacEncGetCurrentConfiguration(self.encoder);//获取配置结构指针
        self.pConfiguration->inputFormat = FAAC_INPUT_16BIT;    //设置
        self.pConfiguration->outputFormat=1;
        self.pConfiguration->useTns=true;
        self.pConfiguration->useLfe=false;
        self.pConfiguration->aacObjectType=LOW;
        self.pConfiguration->shortctl=SHORTCTL_NORMAL;
        self.pConfiguration->quantqual=100;
        self.pConfiguration->bandWidth=0;
        self.pConfiguration->bitRate=0;
    

    配置参数后,我们需要启用配置,使用的函数如下:

    int FAACAPI faacEncSetConfiguration(faacEncHandle hEncoder,
                        faacEncConfigurationPtr config);
    

    第一个参数为第一步创建的编码器句柄,第二个参数为配置结构体指针。返回的为启用的结果,若返回的数值小于0则启用失败,大于等于0则代表成功。若启用失败,可以检查自己的参数是否设置正确。参数在其定义的头文件中说明非常清晰,自己安装说明检查即可。

    3、编码PCM数据

    编码的函数如下:

    int FAACAPI faacEncEncode(faacEncHandle hEncoder, int32_t * inputBuffer, unsigned int samplesInput,
                 unsigned char *outputBuffer,
                 unsigned int bufferSize);
    

    参数解释如下:

        faacEncHandle hEncoder,     //创建的AAC编码器句柄
        int32_t * inputBuffer,    //输入的PCM数据的指针
        unsigned int samplesInput,    //输入的PCM数据的样本数量
        unsigned char *outputBuffer,    //保存转码后的数据的指针
        unsigned int bufferSize    //保存转码后指针指向地址的缓存的大小
    

    第二个参数输入的数据不能超过第一步创建时指定的大小,第三个参数为输入的样本数量,可用根据第二个数据的长度、每个样本的大小。第三个和第四个为保存转码后数据的缓冲区地址及大小。返回值为缓冲区转换数据的长度,我们从缓冲区读取相应的数据保存即可。
    当开始调用函数的时候,不会立即返回AAC数据,因为FAAC库会缓存部分数据,当我们输入的PCM数据完后,AAC数据此时并没有完全编码完成,需要连续调用函数,待返回值小于等于0时才代表全部编码完成。

    4、关闭编码器

    关闭编码器的函数如下:

    int FAACAPI faacEncClose(faacEncHandle hEncoder);
    

    参数为我们第一步创建的AAC编码器句柄,函数返回大于等于0则代表成功。

    欢迎交流留言。
    demo地址:https://github.com/XMSECODE/ESCAACCoderDemo

    相关文章

      网友评论

          本文标题:FAAC编码PCM音频

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