交叉编译faac共享库
作者:咕唧咕唧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共享库的更多相关文章
- 【转】交叉编译faac共享库
转自:http://blog.csdn.net/cjj198561/article/details/38382889 编译准备 1.代码下载 在mac下面执行:wget http://download ...
- Live555实战之交叉编译live555共享库
作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 能够通过这个链接获得最新的live555源代码:Live555源代码下载 Live555 是一个为 ...
- Linux学习笔记——如何使用共享库交叉编译
0.前言 在较为复杂的项目中会利用到交叉编译得到的共享库(*.so文件).在这样的情况下便会产生下面疑问,比如: [1]交叉编译时的共享库是否须要放置于目标板中,假设须要放置在哪个文件 ...
- Linux学习笔记——怎样在交叉编译时使用共享库
0.前言 在较为复杂的项目中会利用到交叉编译得到的共享库(*.so文件).在这样的情况下便会产生下面疑问,比如: [1]交叉编译时的共享库是否须要放置于目标板中,假设须要放置在哪个文件 ...
- Android NDK 交叉编译C++代码生成.so共享库详细步骤
Android NDK 交叉编译C++代码生成.so共享库详细步骤 Android NDK 调用c++ stl 模板库(修改android.mk文件) 1 在需要调用模板库的文件前包含头文件: ...
- C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项
目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...
- python调用c++/c 共享库,开发板上编译的一些坑!
1.对于python,ctypes只能load动态库,但现在我的对象是一个静态库,而且我没有源代码,静态库在编译过程中没有加--fPIC参数,所以我也没办法将其编译为动态库,有没有什么方法在pytho ...
- 链接(extern、static关键词\头文件\静态库\共享库)
原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = ...
- linux下共享库的注意点之-fpic
在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单的例子: #include <stdio.h> int fun1() { printf("fun1\n") ...
随机推荐
- bzoj5277: [Usaco2018 Open]Out of Sorts
被tkj大爷艹爆了5555整套模拟赛都是神仙思路题 那么这题题解 还有一个神仙做法,zory巨神在考场上找规律AC,自己都不会证..我证明了一下(然而这货还是不认可自己的做法) 按照分割点的思路,我们 ...
- [HDU 6318] Swaps and Inversions
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6318 [算法] 线段树 / 树状数组 [代码] #include<bits/stdc++.h ...
- 南海区行政审批管理系统接口规范v0.3(规划) 3.业务办理API 3.1.businessAuditById【业务办理】
{"c_accept":"Q2015112400002","c_operators":"gz99","v_op ...
- redis集群部署及常用的操作命令_01
简单说下自己测试搭建简单的redis集群的大体步骤: 1.首先你的有6个redis(官方说最少6个,3master,3slave),可以先在一台机器上搭建,搭建到多台上应该只需要改变启动命令即可(可能 ...
- tp框架---表单验证
自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证.分为静态验证和动态验证. 关于基础知识,请查看手册“自动验证”一章. 一.静态验证 ( ...
- 常用GC算法
在C/C++中是由程序员自己去申请.管理和释放内存的,因此没有GC的概念.而在Java中,专门有一个用于垃圾回收的后台线程来进行监控.扫描,自动将一些无用的内存进行释放.下面介绍几种常见的GC算法. ...
- winfrom窗体属性
- [Offer收割]编程练习赛33
矩阵游戏II 把每列的数字加起来当一行处理.因为每次操作两列,所以最后最多剩下一个负数.如果负数的个数是偶数,直接所有数字的绝对值加起来即可:若负数个数为奇数,把所有数的绝对值加起来减去其中最小的绝对 ...
- JavaScript实现复选框的全选、不选、反选
方法一: <html> <head> <meta charset="utf-8"> <title>无标题文档</title&g ...
- 谷歌C++编程为何禁止缺省参数
C++的缺省参数尽量不要使用,结果可能出乎我们的意料,下面的程序大家看看输出结果是多少? ) cout << num << endl; ...