交叉编译faac共享库

来源:互联网 发布:java聊天室设计与实现 编辑:程序博客网 时间:2024/05/21 22:51

作者:咕唧咕唧liukun321

来自: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++类,下面的代码是从一个项目中抽取的,没有单独测试,仅做参考:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. class AudioProcess {  
  2. public:  
  3.       
  4.     AudioProcess (void)  
  5.         {  
  6.               
  7.             nSampleRate = RATE;  // 采样率  
  8.             nChannels = CHANNELS;         // 声道数  
  9.             nPCMBitSize = SIZE;   
  10.             nInputSamples = 0;  
  11.             nMaxOutputBytes = 0;  
  12.             AACDecoderInitFlag = 0;  
  13.             DecoderHandle = 0;  
  14.             ADTSFrameInBuf = NULL;  
  15.             PCMData = NULL;  
  16.             ppBuffer = NULL;  
  17.               
  18.         }// var init  
  19.   
  20.         ~AudioProcess(void)  
  21.         {  
  22.           
  23.         }// var init  
  24.       
  25. private:  
  26.     ULONG nInputSamples ;  
  27.     ULONG nMaxOutputBytes ;  
  28.     faacEncHandle hEncoder;  
  29.     faacEncConfigurationPtr pConfiguration;  
  30.     BYTE* pbAACBuffer;  
  31.     int nRet;  
  32. public:  
  33.     int OutAACLength;  
  34.       
  35.     ULONG nSampleRate;  // 采样率  
  36.     UINT nChannels;         // 声道数  
  37.     UINT nPCMBitSize;   
  38.     unsigned char* ppBuffer;  
  39.     unsigned long pSizeOfDecoderSpecificInfo;  
  40.     int nBytesRead;  
  41.     int nPCMBufferSize;  
  42.     int nAACBufferSize;  
  43.     BYTE* pbPCMBuffer;  
  44.       
  45.     BYTE* OutAACBuffer;  
  46. public:   
  47.     int AACEncoderInit();  
  48.     int AACEncoding();  
  49. <span style="white-space:pre">  int AACEncoderDestory();</span><span style="font-family: Arial, Helvetica, sans-serif;">  
  50. };</span>  


[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. int AudioProcess ::AACEncoderInit()  
  2. {  
  3.         hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);  
  4.         if(hEncoder == NULL)  
  5.         {  
  6.             printf("[ERROR] Failed to call faacEncOpen()\n");  
  7.             return -1;  
  8.         }  
  9.         printf("nInputSamples = %d\n",nInputSamples);  
  10.         nPCMBufferSize = nInputSamples * nPCMBitSize / 8;  
  11.         pbPCMBuffer = new BYTE [nPCMBufferSize];  
  12.         pbAACBuffer = new BYTE [nMaxOutputBytes];  
  13.   
  14.         //  Get current encoding configuration  
  15.         pConfiguration = faacEncGetCurrentConfiguration(hEncoder);  
  16.         pConfiguration->inputFormat = FAAC_INPUT_16BIT;//_16BIT;  
  17.         pConfiguration->mpegVersion = MPEG4;  
  18.          pConfiguration->version = MPEG4;  // 1  
  19.          pConfiguration->outputFormat =1;// ADTS_STREAM;  
  20.       
  21.          pConfiguration->aacObjectType = 2;//LOW;  
  22.          pConfiguration->useTns = 0;//DEFAULT_TNS;  
  23.          pConfiguration->shortctl =  0;//SHORTCTL_NORMAL;  
  24.          pConfiguration->allowMidside = 1 ;  
  25.          
  26.         //  Set encoding configuration  
  27.         nRet = faacEncSetConfiguration(hEncoder, pConfiguration);  
  28.         faacEncGetDecoderSpecificInfo(hEncoder,&(ppBuffer), &(pSizeOfDecoderSpecificInfo));  
  29. }  
  30.   
  31. int AudioProcess ::AACEncoding()  
  32. {  
  33.       
  34.       
  35.         // 输入样本数,用实际读入字节数计算,一般只有读到文件尾时才不是               //nPCMBufferSize/(nPCMBitSize/8);  
  36.          nBytesRead = length;  
  37.         nInputSamples = nBytesRead / (nPCMBitSize / 8);  
  38.         printf("nInputSamples = %d\n",nInputSamples);  
  39.           
  40.         //Encode  
  41.         nRet = faacEncEncode(hEncoder, (int*) pbPCMBuffer, nInputSamples, pbAACBuffer,nMaxOutputBytes);  
  42.         OutAACBuffer = pbAACBuffer;  
  43.         OutAACLength = nRet;  
  44.           
  45.     return nRet;  
  46. }  
  47.   
  48. void AudioProcess::AACEncoderDestroy()  
  49. {     
  50.         nRet = faacEncClose(hEncoder);  
  51.         delete[] pbPCMBuffer;  
  52.         delete[] pbAACBuffer;  
  53.               
  54. }  

本文转自:

http://blog.csdn.net/liukun321/article/details/38022237

0 0