zoukankan      html  css  js  c++  java
  • 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() ");
            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) ");
        }
        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() ");
            return HI_FALSE;
        }

        fhaac = fopen("audio_chn0.aac","w+");
        if (NULL == fhaac)
        {
            printf("----------[ERROR] Failed to open file audio_chn0.aac ");
            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 ",nInputSamples,nRet,nMaxOutputBytes);
                    //转码并写aac文件................................结束
                }

    在main函数里添加:
    //在SAMPLE_AUDIO_Usage(); 这一句代码之前添加:
    //初始化aac环境
        if(pcm2aac_init() == HI_FALSE)
        {
            printf("--------[ERORR]: pcm2aac_init() failed ");
            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%,效率低。

  • 相关阅读:
    PowerDesigner执行SQL生成模型
    IBM,ORACLE 文档
    JAAS 自定义登陆模块
    JAAS 使用windos登陆示例
    IFRAME跨域
    JAVA RSA 数字签名
    JAVA数字证书
    搭模型时常用的numpy公式,不定时更新~
    Failed to connect to github.com port 443: Timed out
    linux和colab上安装torch_geometric踩坑记录,安装过程
  • 原文地址:https://www.cnblogs.com/Lwd-linux/p/7381517.html
Copyright © 2011-2022 走看看