在使用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则代表成功。