作者:咕唧咕唧liukun321

来自:http://blog.csdn.net/liukun321

Advanced Audio Coding。一种专为声音数据设计的文件压缩格式,与Mp3不同,它採用了全新的算法进行编码。更加高效,具有更高的“性价比”。

利用AAC格式,可使人感觉声音质量没有明显减少的前提下。更加小巧。

FAAC是在嵌入式系统中经常使用的AAC音频编码开源库。关于AAC音频格式能够看一下这篇博文作简单了解:AAC音频编码格式简析

FAAC开源project源代码下载链接:FAAC源代码下载

得到FAACproject源代码后首先运行 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; }// var init ~AudioProcess(void)
{ }// var init 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();
int AACEncoderDestory();
};
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]; // Get current encoding configuration
pConfiguration = faacEncGetCurrentConfiguration(hEncoder);
pConfiguration->inputFormat = FAAC_INPUT_16BIT;//_16BIT;
pConfiguration->mpegVersion = MPEG4;
pConfiguration->version = MPEG4; // 1
pConfiguration->outputFormat =1;// ADTS_STREAM; pConfiguration->aacObjectType = 2;//LOW;
pConfiguration->useTns = 0;//DEFAULT_TNS;
pConfiguration->shortctl = 0;//SHORTCTL_NORMAL;
pConfiguration->allowMidside = 1 ; // Set encoding configuration
nRet = faacEncSetConfiguration(hEncoder, pConfiguration);
faacEncGetDecoderSpecificInfo(hEncoder,&(ppBuffer), &(pSizeOfDecoderSpecificInfo));
} int AudioProcess ::AACEncoding()
{ // 输入样本数,用实际读入字节数计算,一般仅仅有读到文件尾时才不是 //nPCMBufferSize/(nPCMBitSize/8);
nBytesRead = length;
nInputSamples = nBytesRead / (nPCMBitSize / 8);
printf("nInputSamples = %d\n",nInputSamples); //Encode
nRet = faacEncEncode(hEncoder, (int*) pbPCMBuffer, nInputSamples, pbAACBuffer,nMaxOutputBytes);
OutAACBuffer = pbAACBuffer;
OutAACLength = nRet; return nRet;
} void AudioProcess::AACEncoderDestroy()
{
nRet = faacEncClose(hEncoder);
delete[] pbPCMBuffer;
delete[] pbAACBuffer; }

交叉编译faac共享库的更多相关文章

  1. 【转】交叉编译faac共享库

    转自:http://blog.csdn.net/cjj198561/article/details/38382889 编译准备 1.代码下载 在mac下面执行:wget http://download ...

  2. Live555实战之交叉编译live555共享库

    作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 能够通过这个链接获得最新的live555源代码:Live555源代码下载 Live555 是一个为 ...

  3. Linux学习笔记——如何使用共享库交叉编译

    0.前言     在较为复杂的项目中会利用到交叉编译得到的共享库(*.so文件).在这样的情况下便会产生下面疑问,比如:     [1]交叉编译时的共享库是否须要放置于目标板中,假设须要放置在哪个文件 ...

  4. Linux学习笔记——怎样在交叉编译时使用共享库

    0.前言     在较为复杂的项目中会利用到交叉编译得到的共享库(*.so文件).在这样的情况下便会产生下面疑问,比如:     [1]交叉编译时的共享库是否须要放置于目标板中,假设须要放置在哪个文件 ...

  5. Android NDK 交叉编译C++代码生成.so共享库详细步骤

    Android NDK 交叉编译C++代码生成.so共享库详细步骤 Android NDK 调用c++ stl 模板库(修改android.mk文件) 1  在需要调用模板库的文件前包含头文件:   ...

  6. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...

  7. python调用c++/c 共享库,开发板上编译的一些坑!

    1.对于python,ctypes只能load动态库,但现在我的对象是一个静态库,而且我没有源代码,静态库在编译过程中没有加--fPIC参数,所以我也没办法将其编译为动态库,有没有什么方法在pytho ...

  8. 链接(extern、static关键词\头文件\静态库\共享库)

    原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = ...

  9. linux下共享库的注意点之-fpic

    在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单的例子: #include <stdio.h> int fun1() { printf("fun1\n") ...

随机推荐

  1. iOS10 推送通知 UserNotifications

    简介 新框架 获取权限 获取用户设置 注册APNS,获取deviceToken 本地推送流程 远程推送流程 通知策略(Category+Action) 附件通知 代理回调 简介 iOS10新增了Use ...

  2. 【BZOJ2806】【CTSC2012】Cheat 广义后缀自动机+二分+Dp

    题目 题目在这里 思路&做法 我们先对标准作文库建广义后缀自动机. 然后对于每一篇阿米巴的作文, 我们首先把放到广义后缀自动机跑一遍, 对于每一个位置, 记录公共子串的长度\((\)即代码和下 ...

  3. webkitdirectory 实现文件夹上传

    文件夹上传这个功能在web端可能有需求,这里就简单介绍下用法. 目前只有谷歌浏览器还有Microsoft Edge支持按照文件夹进行上传,具体可以看下百度云盘的网页版的上传按钮,在火狐下就支持按照文件 ...

  4. Spring《八-一》CGLIB代理和自动代理

    CGLIB代理 配置文档 <bean id="logProxy" class="org.springframework.aop.framework.ProxyFac ...

  5. Pinpoint 监控

    ####Hbase数据################ 参考: 然而没有卵用: https://blog.csdn.net/iamlihongwei/article/details/52882749? ...

  6. Android中使用GoogleMap的地理位置服务

    写在前面:android中使用地理位置功能,可以借助Google给我们提供的框架,要是有地理位置功能,你需要引用Google Play Services,请在sdk manager中下载.如果你还要使 ...

  7. javaweb 之 代理模式

    一.动态代理 1.1.代理模式 什么是代理模式及其作用 Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问 ...

  8. hdu2680 Choose the best route 最短路(多源转单源)

    此题中起点有1000个,边有20000条.用链式前向星建图,再枚举起点用SPFA的话,超时了.(按理说,两千万的复杂度应该没超吧.不过一般说计算机计算速度 1~10 千万次/秒.也许拿最烂的计算机来卡 ...

  9. layui 时间控件 单击 年直接赋值

    在 //选中 lay(ul).find('li').on('click', function(){  //结尾处添加 if (options.done === "year") { ...

  10. Discuz 3x 配置问题

    1.注意config里面配置的路径 2.注意ucenter里面 的密钥要一直 3.IP 的选择