//
// 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;
}
編碼器的參數設定,可以找正确的解碼例子照例修改或者問專業人士吧,如果出錯了的話。