pcm2aac
1、下载faac源代码:http://downloads.sourceforge.net/faac/faac-1.28.zip
2、在VAWARE上进行交叉编译,安装。
./configure --target=arm-linux --host=arm-hisiv300-linux
make
make install
之后默认安装在/usr/locol下,头文件faac.h在/usr/locol/include下,静态库libfaac.a在/usr/locol/lib下,/usr/locol/bin下有faac的可执行文件。
3、创建头文件pcm2aac.h
#ifndef PCM_TO_AAC_H
#define PCM_TO_AAC_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <faac.h>
#include <stdio.h>
typedef unsigned long ULONG;
typedef unsigned int UINT;
typedef unsigned char BYTE;
typedef char _TCHAR;
//-----------------------------------------------------------------------------
ULONG nSampleRate;
UINT nChannels;
UINT nPCMBitSize;
ULONG nInputSamples;
ULONG nMaxOutputBytes;
int nRet;
faacEncHandle hEncoder;
faacEncConfigurationPtr pConfiguration;
int nBytesRead;
int nPCMBufferSize;
int iPcmBytes;
BYTE* pbPCMBuffer;
BYTE* pbAACBuffer;
FILE *fhaac;//写aac文件流句柄
//----------------------------------------------------------------------------
//extern "C" int pcm2aac_init(void);
//-----------------------------------------------------------------------------
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif // PCM_TO_AAC_H
4、在sample_audio.c中添加如下代码
#include "pcm2aac.h"
HI_BOOL pcm2aac_init(void)
{
nSampleRate = AUDIO_SAMPLE_RATE_8000; //
nChannels = 1; //pcm编码时选择MONO,这里就要nChannels = 1
nPCMBitSize = 16; // λ
nInputSamples = 0;
iPcmBytes = 0;//pcm帧计数器,每16帧处理一次,转换成5帧aac
nMaxOutputBytes = 0;
nRet = 0;
hEncoder = NULL;
pConfiguration = NULL;
nBytesRead = -1;
nPCMBufferSize = -1;
pbPCMBuffer = NULL;
pbAACBuffer = NULL;
hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);
if(hEncoder == NULL)
{
printf("[ERROR] Failed to call faacEncOpen()\n");
return HI_FALSE;
}
printf("----------nSampleRate=%d, nChannels=%d, nInputSamples=%d, nMaxOutputBytes=%d",nSampleRate, nChannels, nInputSamples, nMaxOutputBytes);
nPCMBufferSize = nInputSamples * nPCMBitSize / 8;
pbPCMBuffer = (BYTE *)malloc(nPCMBufferSize*2);
pbAACBuffer = (BYTE *)malloc(nMaxOutputBytes);
if(pbPCMBuffer == NULL || pbAACBuffer == NULL)
{
printf("----------[ERROR] Failed to call malloc(pbPCMBuffer pbAACBuffer) \n");
}
memset(pbPCMBuffer,0,nPCMBufferSize*2);
memset(pbAACBuffer,0,nMaxOutputBytes);
// (2.1) Get current encoding configuration
pConfiguration = faacEncGetCurrentConfiguration(hEncoder);
pConfiguration->inputFormat = FAAC_INPUT_16BIT;
pConfiguration->outputFormat = 1;//0 Raw;1 ATDS
pConfiguration->aacObjectType = 2;//LC编码
// (2.2) Set encoding configuration
nRet = faacEncSetConfiguration(hEncoder, pConfiguration);
if(nRet < 0)
{
printf("----------[ERROR] Failed to call faacEncSetConfiguration()\n");
return HI_FALSE;
}
fhaac = fopen("audio_chn0.aac","w+");
if (NULL == fhaac)
{
printf("----------[ERROR] Failed to open file audio_chn0.aac \n");
return HI_FALSE;
}
return HI_TRUE;
}
HI_BOOL pcm2aac_exit(void)
{
nRet = faacEncClose(hEncoder);
free(pbPCMBuffer);
free(pbAACBuffer);
fclose(fhaac);
//fclose(fhmsg);
return HI_TRUE;
}
。。。。
。。。。
。。。。
在SAMPLE_COMM_AUDIO_AencProc函数里添加下面的代码(这里需要说明一下,我把mpp/sample/common下的所有c代码都加到了sample_audio.c中,合成了一个文件)
/* save audio stream to file */
fwrite(stStream.pStream,1,stStream.u32Len, pstAencCtl->pfd);//在这一句之后添加:
//转码成aac
memcpy(&pbPCMBuffer[iPcmBytes],stStream.pStream,stStream.u32Len);//pcm流数据保存到转换缓冲区
iPcmBytes +=stStream.u32Len;
if(iPcmBytes >= nPCMBufferSize)
{
nRet = faacEncEncode(hEncoder, (int *) pbPCMBuffer, nInputSamples, pbAACBuffer, nMaxOutputBytes);//nInputSamples音频片数量
memcpy(pbPCMBuffer,&pbPCMBuffer[nPCMBufferSize],nPCMBufferSize);//后半部分拷贝到前半部分
iPcmBytes -= nPCMBufferSize;//未处理数据指针复位
fwrite(pbAACBuffer, 1, nRet, fhaac);
//fprintf(fhmsg,"nInputSamples=%d nRet=%d nMaxOutputBytes=%d \r\n",nInputSamples,nRet,nMaxOutputBytes);
//转码并写aac文件................................结束
}
在main函数里添加:
//在SAMPLE_AUDIO_Usage(); 这一句代码之前添加:
//初始化aac环境
if(pcm2aac_init() == HI_FALSE)
{
printf("--------[ERORR]: pcm2aac_init() failed \n");
return HI_FAILURE;
}
在main函数最后,“SAMPLE_COMM_SYS_Exit();”这一行之后添加:
//aac环境退出
printf("----------Begin exit pcm2aac........");
pcm2aac_exit();
至此,编译运行程序sample_audio,选1,软件录音到文件audio_ch0.pcm的同时,生成audio_ch0.aac文件,可在vlc中播放。
不足之处:faac转码时CPU占用高达99%,效率低。
pcm2aac的更多相关文章
随机推荐
- 精读《Epitath 源码 - renderProps 新用法》
1 引言 很高兴这一期的话题是由 epitath 的作者 grsabreu 提供的. 前端发展了 20 多年,随着发展中国家越来越多的互联网从业者涌入,现在前端知识玲琅满足,概念.库也越来越多.虽然内 ...
- 在生产环境下实现每天自动备份mysql数据库
1.描述 我相信很多朋友在工作都都会有这种需求,老板或领导让你每天都要备份mysql数据库,你该如何实现呢,是每天到一定的时间在服务器上敲一遍mysql的备份命令,还是想写个脚本,定时定点的自动备份呢 ...
- python练手习题
不断记录python常见习题,不断寻求更多更好的解决办法.持续更新中..... 练习: 1. list两两元素交换位置,如[1,2,3,4,5,6] 执行后为 -> [2,1,4,3,6,5] ...
- Python9-From-CSS-day48
1.form表单相关内容前后端有数据交互的时候用form表单form表单提交数据的几个注意事项: 1.所有获取用户输入的标签都必须放在form表单里面 2.action 控制着往哪里提交 3.inpu ...
- [USACO]奶牛赛跑(逆序对)
Description 约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi.只要有一头奶牛跑完 L 圈 ...
- TI C6000优化手册——让代码看起来像钉子
DSP芯片的出现,是为了解决大量的数字运算问题.通过集成专用的加法器.乘法器.地址产生器.复杂逻辑等硬件单元,DSP能实现比普通单片机更快速的数字运算,使处理器更适用于实时性高.复杂度强的处理场合.也 ...
- UVA_10653 公主与王子 #刘汝佳DP题刷完计划
题意如蓝书66页例题27所示. 这个问题描述了一个LCS的特殊情况——单个字符串内所有元素各不相同. 题目要求输入两个数字串,A,B,要求求出最长公共字串.且数字上限是256*256. 做法:数组A表 ...
- Python中函数参数类型和参数绑定
参数类型 Python函数的参数类型一共有五种,分别是: POSITIONAL_OR_KEYWORD(位置参数或关键字参数) VAR_POSITIONAL(可变参数) KEYWORD_ONLY(关键字 ...
- mini购物车程序
product_list=[("Iphohe",5800),("Mac Pro Book",12900), ("xiaomi 4c",120 ...
- 安装的 Python 版本太多互相干扰?pyenv 建议了解一下。
写在之前 我们都知道现在的 Python 有 Python2 和 Python3,但是由于各种乱七八糟的原因导致这俩哥们要长期共存,荣辱与共,尴尬的是这哥俩的差异还比较大,在很多时候我们可能要同时用到 ...