admin管理员组

文章数量:1566363

2024年6月12日发(作者:)

音频编解码·实战篇1PCM转至AACAAC编码 这里利用FAAC来实现AAC编码。 1

下载安装 FAAC 这里的安装过程是在 Mac 和 Linux 上实现的Windows可以类似

参考。 wget /faac/ tar zxvf

cd faac-1.28 ./configure make sudo make install 如果才用默认的

configure 中的 prefix path那么安装后的 lib 和 .h 文件分别在/usr/local/lib和

/usr/local/include后面编译的时候会用到。 如果编译过程中发现错误 mpeg4ip.h:126:

error: new declaration ‘char strcasestrconst char const char’ 解决方法 从123行开始修

改此文件mpeg4ip.h到129行结束。 修改前 ifdef __cplusplus extern C endif char

strcasestrconst char haystack const char needle ifdef __cplusplus endif 修改后 ifdef

__cplusplus extern C endif const char strcasestrconst char haystack const char needle

ifdef __cplusplus endif 2 FAAC API 2.1 Open FAAC engine Prototype:

faacEncHandle faacEncOpen // 返回一个FAAC的handle unsigned long nSampleRate

// 采样率单位是bps unsigned long nChannels // 声道1为单声道2为双声道 unsigned

long nInputSamples // 传引用得到每次调用编码时所应接收的原始数据长度

unsigned long nMaxOutputBytes // 传引用得到每次调用编码时生成的AAC数据的最

大长度 2.2 Get/Set encoding configuration Prototype: 获取编码器的配置

faacEncConfigurationPtr faacEncGetCurrentConfiguration // 得到指向当前编码器配置

的指针 faacEncHandle hEncoder // FAAC的handle 设定编码器的配置 int

FAACAPI faacEncSetConfiguration faacDecHandle hDecoder // 此前得到的FAAC的

handle faacEncConfigurationPtr config // FAAC编码器的配置 2.3 Encode Prototype:

int faacEncEncode faacEncHandle hEncoder // FAAC的handle short inputBuffer //

PCM原始数据 unsigned int samplesInput // 调用faacEncOpen时得到的nInputSamples

值 unsigned char outputBuffer// 至少具有调用faacEncOpen时得到的

nMaxOutputBytes字节长度的缓冲区 unsigned int bufferSize // outputBuffer缓冲区的

实际大小 2.4 Close FAAC engine Prototype void faacEncClose faacEncHandle

hEncoder // 此前得到的FAAC handle 3 流程 3.1 做什么准备 采样率声道数双声

道还是单声道还有你的PCM的单个样本是8位的还是16位的 3.2 开启FAAC编码器

做编码前的准备 1. 调用faacEncOpen开启FAAC编码器后得到了单次输入样本数

nInputSamples和输出数据最大字节数nMaxOutputBytes 2. 根据nInputSamples和

nMaxOutputBytes分别为PCM数据和将要得到的AAC数据创建缓冲区 3. 调用

faacEncGetCurrentConfiguration获取当前配置修改完配置后调用

faacEncSetConfiguration设置新配置。 3.3 开始编码 调用faacEncEncode该准备的刚

才都准备好了很简单。 3.4 善后 关闭编码器另外别忘了释放缓冲区如果使用了文

件流也别忘记了关闭。 4 测试程序 4.1 完整代码 将PCM格式音频文件

/home/michael/Development/testspace/转至AAC格式文件

/home/michael/Development/testspace/。 include include typedef unsigned long

ULONG typedef unsigned int UINT typedef unsigned char BYTE typedef char _TCHAR

int mainint argc _TCHAR argv ULONG nSampleRate 11025 // 采样率 UINT

nChannels 1 // 声道数 UINT nPCMBitSize 16 // 单样本位数 ULONG

nInputSamples 0 ULONG nMaxOutputBytes 0 int nRet faacEncHandle hEncoder

faacEncConfigurationPtr pConfiguration int nBytesRead int nPCMBufferSize BYTE

pbPCMBuffer BYTE pbAACBuffer FILE fpIn // PCM file for input FILE fpOut // AAC

file for output fpIn fopen/home/michael/Development/testspace/ rb fpOut

fopen/home/michael/Development/testspace/ wb // 1 Open FAAC engine

hEncoder faacEncOpennSampleRate nChannels nInputSamples nMaxOutputBytes

ifhEncoder NULL printfERROR Failed to call faacEncOpenn return -1

nPCMBufferSize nInputSamples nPCMBitSize / 8 pbPCMBuffer new BYTE

nPCMBufferSize pbAACBuffer new BYTE nMaxOutputBytes // 2.1 Get current

encoding configuration pConfiguration faacEncGetCurrentConfigurationhEncoder

pConfiguration-inputFormat FAAC_INPUT_16BIT // 2.2 Set encoding configuration

nRet faacEncSetConfigurationhEncoder pConfiguration forint i 0 1 i // 读入的实

际字节数最大不会超过nPCMBufferSize一般只有读到文件尾时才不是这个值

nBytesRead freadpbPCMBuffer 1 nPCMBufferSize fpIn // 输入样本数用实际读入字

节数计算一般只有读到文件尾时才不是nPCMBufferSize/nPCMBitSize/8

nInputSamples nBytesRead / nPCMBitSize / 8 // 3 Encode nRet faacEncEncode

hEncoder int pbPCMBuffer nInputSamples pbAACBuffer nMaxOutputBytes

fwritepbAACBuffer 1 nRet fpOut printfd: faacEncEncode returns dn i nRet ifnBytesRead

本文标签: 调用得到编码配置编码器