天天看點

嵌入式Linux pcm faac,使用FAAC變換PCM為AAC

//

// faac example code

// PCM to ACC

//

// Created by arbboter on 15/1/26.

// Copyright (c) 2015年 arbboter. All rights reserved.

//

#include "faac.h"

#include

int main()

{

// 定義别名

typedef unsigned char BYTE;

unsigned longnSampleRate = 44100;

unsigned intnChannels = 2;

unsigned intnPCMBitSize = 16;

unsigned longnInputSamples = 0;

unsigned longnMaxOutputBytes = 0;

faacEncHandlehEncoder = {0};

// 設定輸入輸出檔案

FILE* fpIn = fopen("Beyond.pcm", "rb");

FILE* fpOut = fopen("Beyond.aac", "wb");

if(fpIn==NULL || fpOut==NULL)

{

printf("打開檔案失敗!\n");

return -1;

}

// 打開faac編碼器引擎

hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);

if(hEncoder == NULL)

{

printf("打開faac編碼器引擎失敗!\n");

return -1;

}

// 配置設定記憶體資訊

intnPCMBufferSize = nInputSamples*nPCMBitSize/8;

BYTE*pbPCMBuffer = new BYTE[nPCMBufferSize];

BYTE*pbAACBuffer = new BYTE[nMaxOutputBytes];

// 擷取目前編碼器資訊

faacEncConfigurationPtr pConfiguration = {0};

pConfiguration = faacEncGetCurrentConfiguration(hEncoder);

// 設定編碼配置資訊

pConfiguration->inputFormat = FAAC_INPUT_16BIT;

// 0 = Raw; 1 = ADTS

pConfiguration->outputFormat = 1;

// AAC object types

//#define MAIN 1

//#define LOW 2

//#define SSR 3

//#define LTP 4

pConfiguration->aacObjectType = LOW;

pConfiguration->allowMidside = 0;

pConfiguration->useLfe = 0;

pConfiguration->bitRate = 48000;

pConfiguration->bandWidth = 32000;

// 其他的參數不知道怎麼配置,畢竟對音頻不熟

// 不過目前的設定可以實作轉換,不過聲音好像有一丢丢怪異

// 這一塊的配置資訊很重要,錯了會導緻轉碼失敗,然後你以為代碼其他地方錯了

// 重置編碼器的配置資訊

faacEncSetConfiguration(hEncoder, pConfiguration);

size_t nRet = 0;

printf("資料轉換中: ");

int i = 0;

while( (nRet = fread(pbPCMBuffer, 1, nPCMBufferSize, fpIn)) > 0)

{

printf("\b\b\b\b\b\b\b\b%-8d", ++i);

nInputSamples = nRet / (nPCMBitSize/8);

// 編碼

nRet = faacEncEncode(hEncoder, (int*) pbPCMBuffer, nInputSamples, pbAACBuffer, nMaxOutputBytes);

// 寫入轉碼後的資料

fwrite(pbAACBuffer, 1, nRet, fpOut);

}

// 掃尾工作

faacEncClose(hEncoder);

fclose(fpOut);

fclose(fpIn);

delete[] pbAACBuffer;

delete[] pbPCMBuffer;

return 0;

}

編碼器的參數設定,可以找正确的解碼例子照例修改或者問專業人士吧,如果出錯了的話。