zzwdl9379

zzwdl9379

0个粉丝

3

问答

0

专栏

0

资料

zzwdl9379  发布于  2015-06-20 11:40:31
采纳率 0%
3个问答
9227

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文件了
我来回答
回答14个
时间排序
认可量排序

zzwdl9379

0个粉丝

3

问答

0

专栏

0

资料

zzwdl9379 2015-06-20 19:27:01
认可0
忘了说了,交叉编译命令行:
rm *.o
rm sample_audio
arm-hisiv100nptl-linux-gcc -Wall -g -I/root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/include -I/root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/sample/common -I/root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/extdrv/tw2865 -I/root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/extdrv/tw2960 -I/root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/extdrv/tlv320aic31 -I/root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/extdrv/cx26828 -I/usr/local/include -Dhi3520D -DHICHIP=0x3520D100 -DHI_DEBUG -DHI_XXXX -DDEMO -lpthread -lm -c -o sample_audio.o sample_audio.c


arm-hisiv100nptl-linux-gcc -Wall -g -I/root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/include -I/root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/sample/common -I/root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/extdrv/tw2865 -I/root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/extdrv/tw2960 -I/root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/extdrv/tlv320aic31 -I/root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/extdrv/cx26828 -I/usr/local/include -Dhi3520D -DHICHIP=0x3520D100 -DHI_DEBUG -DHI_XXXX -DDEMO -lpthread -lm -lpthread -lm -o sample_audio sample_audio.o /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libmpi.a /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libhdmi.a /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libVoiceEngine.a /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libaec.a /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libresampler.a /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libanr.a /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libjpeg.a /usr/local/lib/libfaac.a

其中SDK路径每个人配置不同,请酌情修改

Singcol

0个粉丝

4

问答

0

专栏

1

资料

Singcol 2015-06-23 09:08:09
认可0
楼主,faac编码CPU消耗怎么样?

jounehou

0个粉丝

2

问答

0

专栏

0

资料

jounehou 2015-06-23 18:43:26
认可0
我也同问,faac占用cpu太多 其他工作没法进行。。

default

0个粉丝

40

问答

0

专栏

0

资料

default 2016-03-14 10:54:20
认可0
楼主,请问直接把faacEncEncode()放在pcm码流获取函数里不会导致音频丢帧吗?我测试44.1kHz的音频输入,select函数下连续两次获取pcm数据的时间只有10ms,而faacEncEncode()执行一次要40ms这么久哦。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-03-14 11:20:53
认可0
没有硬件加速,没有软件优化,要实时处理还有很长的路要走

黄征one

0个粉丝

0

问答

0

专栏

0

资料

黄征one 2016-06-09 15:20:11
认可0
好东西,学习了

qqq306922360

0个粉丝

16

问答

0

专栏

0

资料

qqq306922360 2016-07-22 15:57:15
认可0
这个我有在TI的平台上试过了,对CPU开销太大,不行的

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-07-22 16:36:34
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34619&ptid=7924]qqq306922360 发表于 2016-7-22 15:57[/url]
这个我有在TI的平台上试过了,对CPU开销太大,不行的[/quote]

海思一样开销很大,论坛里有个卖aac库的,听说好用,你可以找他买一下

huangyonglzy

0个粉丝

0

问答

0

专栏

0

资料

huangyonglzy 2016-08-03 15:15:57
认可0
还行吧,我3531上的cpu转faac加上我的其他应用占20%左右cpu

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-08-03 15:20:17
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=35382&ptid=7924]huangyonglzy 发表于 2016-8-3 15:15[/url]
还行吧,我3531上的cpu转faac加上我的其他应用占20%左右cpu[/quote]

3531是什么架构?没记错的话应该是cortex-A9,3518是arm9,根本没有可比性

呆呆

0个粉丝

0

问答

0

专栏

0

资料

呆呆 2016-08-10 02:00:47
认可0

好东西,学习了

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-11-24 10:11:12
认可0
我3516A,aac cpu占37%

pumeisc

1个粉丝

13

问答

0

专栏

0

资料

pumeisc 2016-12-13 18:55:25
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=17346&ptid=7924]zzwdl9379 发表于 2015-6-20 19:27[/url]
忘了说了,交叉编译命令行:
rm *.o
rm sample_audio
[/quote]

为什么我编译之后得到的.a文件不对
./lib/libfaac.a: could not read symbols: File format not recognized
哪里出问题了?求指教

超级北上大人

0个粉丝

1

问答

0

专栏

0

资料

超级北上大人 2017-02-20 11:09:41
认可0
感谢楼主。。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区