9363
- 收藏
- 点赞
- 分享
- 举报
Hi3520D音频pcm转aac的详细方法
1、下载faac源代码:http://downloads.sourceforge.net/faac/faac-1.28.zip
2、在虚拟机ubuntu10上编译。(虚拟机为厂家提供,建立好了交叉编译环境,交叉编译工具链arm-hisiv100nptl-linux,编译出来的代码可在开发板上运行)
./configure --target=arm-linux --host=arm-hisiv100nptl-linux
make
make install
默认安装在/usr/locol下,头文件faac.h在/usr/locol/include下,静态库libfaac.a在/usr/locol/lib下
3、pcm_to_aac.h:
#ifndef PCM_TO_AAC_H
#define PCM_TO_AAC_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include
#include
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 "pcm_to_aac.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,选2,软件录音到文件audio_ch0.pcm的同时,生成audio_ch0.aac文件,可在vlc中播放。如果在开发板运行“./live555MediaServer 25&”,就可以在windows端用vlc播放aac文件了
2、在虚拟机ubuntu10上编译。(虚拟机为厂家提供,建立好了交叉编译环境,交叉编译工具链arm-hisiv100nptl-linux,编译出来的代码可在开发板上运行)
./configure --target=arm-linux --host=arm-hisiv100nptl-linux
make
make install
默认安装在/usr/locol下,头文件faac.h在/usr/locol/include下,静态库libfaac.a在/usr/locol/lib下
3、pcm_to_aac.h:
#ifndef PCM_TO_AAC_H
#define PCM_TO_AAC_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include
#include
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 "pcm_to_aac.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,选2,软件录音到文件audio_ch0.pcm的同时,生成audio_ch0.aac文件,可在vlc中播放。如果在开发板运行“./live555MediaServer 25&”,就可以在windows端用vlc播放aac文件了
我来回答
回答14个
时间排序
认可量排序
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2016-04-16 17:53:27
-
2015-11-02 10:35:09
-
2018-12-01 10:47:33
-
2017-06-29 11:15:35
-
2018-12-21 01:06:21
-
2016-09-02 15:38:49
-
2015-11-03 16:39:36
-
12017-03-08 18:36:15
-
02013-12-26 15:33:24
-
2016-03-09 20:52:30
-
2017-08-14 14:28:15
-
2016-08-29 14:07:42
-
2020-07-14 11:10:05
-
2015-06-05 08:39:04
-
2014-07-01 13:30:25
-
2017-06-14 11:17:32
-
112015-07-01 14:54:42
-
2015-06-01 15:36:28
-
2015-06-21 17:25:37
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认