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
版权声明:本文标题:音频编解码实战篇(1)PCM转至AAC(AAC编码) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1718137442a647879.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论