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的更多相关文章

随机推荐

  1. Python 正则表达式 匹配任意字符

    .(句点)匹配除了换行之外的所有一个字符, .*(点-星)匹配除了换行外的所有字符 >>> >>> r=re.compile(r'.*')>>> ...

  2. jupyter notebook(二)——修改jupyter打开默认的工作目录

    1.简述 jupyter notebook,启动后,浏览器发现工作目录并不是自己真正的代码的工作路径.所以需要设置一下.这样方便自己快捷使用. 2.设置修改jupyter notebook打开后默认工 ...

  3. docker 学习(2)

    docker容器中安装vim ubuntu 中默认未装vim,docker run ubuntu vim 出现: container_linux.go:247: starting container ...

  4. [BZOJ1187]神奇游乐园(插头DP)

    Description 题意给定一个矩阵,每个格子有权值,在[-1000.1000]内,求一条回路使得回路经过权值和最大,每个格子最多经过一次 2≤n≤100,2≤m≤6 Code #include ...

  5. Django 三—— Form组件

    内容概要: 1.Django Form如何自定义验证字段 2.Django Form如何动态的显示数据库中新插入的数据 3.Tyrion Django的Form(用于验证用户请求合法性的一个组件) D ...

  6. IOS开发学习笔记010-面向对象的三大特性

    面向对象的三大特性 1.封装 2.继承 3.多态 一.封装 将类内部的属性保护起来,在外部不能直接访问,那么如果需要访问怎么办呢? OC提供了set方法来对成员变量进行访问 set方法 1.作用:提供 ...

  7. python实现算法: 多边形游戏 数塔问题 0-1背包问题 快速排序

    去年的算法课挂了,本学期要重考,最近要在这方面下点功夫啦! 1.多边形游戏-动态规划 问题描述: 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值, 每条边被 ...

  8. Spring框架DataSource

    一 DataSource 简易介绍 JDK里 javax.sql的一个接口 public interface DataSource 表示无力数据源的连接,作为DriverManager设施的替代项, ...

  9. Junit单元测试--01

    如何编写单元测试 燕双龙 一 单元测试简介 单元测试是代码正确性验证的最重要的工具,也是系统测试当中最重要的环节.也是唯一需要编写代码才能进行测试的一种测试方法.在标准的开发过程中,单元测试的代码与实 ...

  10. 第二个python自动化练习

    #Author:xiaoxiao from selenium import webdriver import unittest class DownLoad(unittest.TestCase): # ...