faac移植
来源:互联网 发布:盛科网络年报 编辑:程序博客网 时间:2024/06/03 14:55
来自:http://blog.csdn.NET/liukun321
Advanced Audio Coding。一种专为声音数据设计的文件压缩格式,与Mp3不同,它采用了全新的算法进行编码,更加高效,具有更高的“性价比”。利用AAC格式,可使人感觉声音质量没有明显降低的前提下,更加小巧。
FAAC是在嵌入式系统中常用的AAC音频编码开源库,关于AAC音频格式可以看一下这篇博文作简单了解:AAC音频编码格式简析
FAAC开源工程源码下载链接:FAAC源码下载
得到FAAC工程源码后首先执行 configure获得Makefile,并指定目标平台和交叉工具链
./configure--target=arm-Linux--host=arm-none-linux-gnueabi
编译:
make
安装:
make install
最终会在指定安装目录获得如下动态及静态库:
libfaac.a
libfaac.la
libfaac.so
libfaac.so.0
libfaac.so.0.0.0
将获得的动态链接库放入开发板/usr/lib目录即可
下面顺带附上一个将PCM 16bit 原始音频数据编码成AAC格式音频数据的C++类,下面的代码是从一个项目中抽取的,没有单独测试,仅做参考:- class AudioProcess {
- public:
-
- AudioProcess (void)
- {
-
- nSampleRate = RATE;
- nChannels = CHANNELS;
- nPCMBitSize = SIZE;
- nInputSamples = 0;
- nMaxOutputBytes = 0;
- AACDecoderInitFlag = 0;
- DecoderHandle = 0;
- ADTSFrameInBuf = NULL;
- PCMData = NULL;
- ppBuffer = NULL;
-
- }
-
- ~AudioProcess(void)
- {
-
- }
-
- private:
- ULONG nInputSamples ;
- ULONG nMaxOutputBytes ;
- faacEncHandle hEncoder;
- faacEncConfigurationPtr pConfiguration;
- BYTE* pbAACBuffer;
- int nRet;
- public:
- int OutAACLength;
-
- ULONG nSampleRate;
- UINT nChannels;
- UINT nPCMBitSize;
- unsigned char* ppBuffer;
- unsigned long pSizeOfDecoderSpecificInfo;
- int nBytesRead;
- int nPCMBufferSize;
- int nAACBufferSize;
- BYTE* pbPCMBuffer;
-
- BYTE* OutAACBuffer;
- public:
- int AACEncoderInit();
- int AACEncoding();
- <span style="white-space:pre"> int AACEncoderDestory();</span><span style="font-family: Arial, Helvetica, sans-serif;">
- };</span>
- int AudioProcess ::AACEncoderInit()
- {
- hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);
- if(hEncoder == NULL)
- {
- printf("[ERROR] Failed to call faacEncOpen()\n");
- return -1;
- }
- printf("nInputSamples = %d\n",nInputSamples);
- nPCMBufferSize = nInputSamples * nPCMBitSize / 8;
- pbPCMBuffer = new BYTE [nPCMBufferSize];
- pbAACBuffer = new BYTE [nMaxOutputBytes];
-
-
- pConfiguration = faacEncGetCurrentConfiguration(hEncoder);
- pConfiguration->inputFormat = FAAC_INPUT_16BIT;
- pConfiguration->mpegVersion = MPEG4;
- pConfiguration->version = MPEG4;
- pConfiguration->outputFormat =1;
-
- pConfiguration->aacObjectType = 2;
- pConfiguration->useTns = 0;
- pConfiguration->shortctl = 0;
- pConfiguration->allowMidside = 1 ;
-
-
- nRet = faacEncSetConfiguration(hEncoder, pConfiguration);
- faacEncGetDecoderSpecificInfo(hEncoder,&(ppBuffer), &(pSizeOfDecoderSpecificInfo));
- }
-
- int AudioProcess ::AACEncoding()
- {
-
-
-
- nBytesRead = length;
- nInputSamples = nBytesRead / (nPCMBitSize / 8);
- printf("nInputSamples = %d\n",nInputSamples);
-
-
- nRet = faacEncEncode(hEncoder, (int*) pbPCMBuffer, nInputSamples, pbAACBuffer,nMaxOutputBytes);
- OutAACBuffer = pbAACBuffer;
- OutAACLength = nRet;
-
- return nRet;
- }
-
- void AudioProcess::AACEncoderDestroy()
- {
- nRet = faacEncClose(hEncoder);
- delete[] pbPCMBuffer;
- delete[] pbAACBuffer;
-
- }
0 0