FAAC转换PCM为AAC

来源:互联网 发布:cad可以画网络拓扑图吗 编辑:程序博客网 时间:2024/05/16 11:35

FAAC的代码抠出来,直接加到我们的工程中去,或者抠出来编译一个静态库,需要的代码是libfaac和include两个目录下的所有文件(不包括子目录文件)。 目录文件列表如下所示:

aacquant.caacquant.hbackpred.cbackpred.hbitstream.cbitstream.hchannels.cchannels.hcoder.hfaac.hfaaccfg.hfft.cfft.hfiltbank.cfiltbank.hframe.cframe.hhuffman.chuffman.hhufftab.hltp.cltp.hmidside.cmidside.hpsych.hpsychkni.ctns.ctns.hutil.cutil.hversion.h

主要的函数介绍

faacEncHandle FAACAPI faacEncOpen(unsigned long sampleRate,unsigned int numChannels,unsigned long *inputSamples,unsigned long *maxOutputBytes);//描述 : 打开并初始化编码器//sampleRate : 编码输入信息的采样率//numChannels : 编码输入信息的通道数量,1-单声道 2-立体声//inputSamples : 编码后的数据长度//maxOutputBytes : 编码后的信息最大长度
int FAACAPI faacEncClose(faacEncHandle hEncoder);//描述:关闭编码器//hEncoder : faacEncOpen返回的编码器句柄
faacEncConfigurationPtr FAACAPI faacEncGetCurrentConfiguration(faacEncHandle hEncoder);//描述 :获取当前编码器的配置信息//hEncoder : faacEncOpen返回的编码器句柄
int FAACAPI faacEncSetConfiguration(faacEncHandle hEncoder, faacEncConfigurationPtr config);//描述 : 配置解码器的参数//hEncoder : faacEncOpen返回的编码器句柄//config : 编码器的配置信息
int FAACAPI faacEncEncode(faacEncHandle hEncoder, int32_t * inputBuffer, unsigned int samplesInput,unsigned char *outputBuffer,unsigned int bufferSize);//描述 : 编码一桢信息//hEncoder : faacEncOpen返回的编码器句柄//inputBuffer : 输入信息缓冲区//samplesInput : faacEncOpen编码后的数据长度,即缓冲区长度//outputBuffer : 编码后输出信息缓冲区//bufferSize : 输出信息长度
int FAACAPI faacEncGetVersion(char **faac_id_string, char **faac_copyright_string);//描述 : 获取FAAC的版本信息,用以参考作用,非必须API//faac_id_string : faac的版本号//faac_copyright_string : 版权信息

代码示例

代码的工作流程是:
  1. 打开输入输出文件
  2. 使用faacEncOpen打开编码器引擎
  3. 使用faacEncGetCurrentConfiguratio获取编码器配置
  4. 配置编码器参数
  5. 使用faacEncSetConfiguration设置编码器配置
  6. 读取一桢输入数据
  7. 使用faacEncEncode编码帧数据
  8. 写入编码数据到输出文件
  9. 使用faacEncClose关闭编码引擎
#include "faac.h"#include <stdio.h>int main(){// 定义别名typedef unsigned char   BYTE;unsigned longnSampleRate = 44100;unsigned intnChannels = 2;unsigned intnPCMBitSize = 16;unsigned longnInputSamples = 0;unsigned longnMaxOutputBytes = 0;faacEncHandlehEncoder = {0};// 设置输入输出文件FILE* fpIn = fopen("Beyond.pcm", "rb");FILE* fpOut = fopen("Beyond.aac", "wb");if(fpIn==NULL || fpOut==NULL){printf("打开文件失败!\n");return -1;}// 打开faac编码器引擎hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);if(hEncoder == NULL){printf("打开faac编码器引擎失败!\n");return -1;}// 分配内存信息intnPCMBufferSize = nInputSamples*nPCMBitSize/8;BYTE*pbPCMBuffer = new BYTE[nPCMBufferSize];BYTE*pbAACBuffer = new BYTE[nMaxOutputBytes];// 获取当前编码器信息faacEncConfigurationPtr pConfiguration = {0};pConfiguration = faacEncGetCurrentConfiguration(hEncoder);// 设置编码配置信息/*PCM Sample Input Format0FAAC_INPUT_NULLinvalid, signifies a misconfigured config1FAAC_INPUT_16BITnative endian 16bit2FAAC_INPUT_24BITnative endian 24bit in 24 bits(not implemented)3FAAC_INPUT_32BITnative endian 24bit in 32 bits(DEFAULT)4FAAC_INPUT_FLOAT32bit floating point    */pConfiguration->inputFormat = FAAC_INPUT_16BIT;<span style="color:#ff0000;">// 0 = Raw; 1 = ADTSpConfiguration->outputFormat = 1;</span>// AAC object types //#define MAIN 1//#define LOW  2//#define SSR  3//#define LTP  4<span style="color:#ff0000;">pConfiguration->aacObjectType = LOW;pConfiguration->allowMidside = 0;pConfiguration->useLfe = 0;pConfiguration->bitRate = 48000;pConfiguration->bandWidth = 32000;</span>// 其他的参数不知道怎么配置,毕竟对音频不熟// 不过当前的设置可以实现转换,不过声音好像有一丢丢怪异// 这一块的配置信息很重要,错了会导致转码失败,然后你以为代码其他地方错了// 重置编码器的配置信息faacEncSetConfiguration(hEncoder, pConfiguration);size_t nRet = 0;printf("数据转换中:        ");int i = 0;while( (nRet = fread(pbPCMBuffer, 1, nPCMBufferSize, fpIn)) > 0){printf("\b\b\b\b\b\b\b\b%-8d", ++i);nInputSamples = nRet / (nPCMBitSize/8);// 编码nRet = faacEncEncode(hEncoder, (int*) pbPCMBuffer, nInputSamples, pbAACBuffer, nMaxOutputBytes);// 写入转码后的数据fwrite(pbAACBuffer, 1, nRet, fpOut);}// 清理faacEncClose(hEncoder);fclose(fpOut);fclose(fpIn);delete[] pbAACBuffer;delete[] pbPCMBuffer;return 0;}


0 0
原创粉丝点击