// faacode.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <faac.h> #include <stdio.h> typedef unsigned long ULONG; typedef unsigned int UINT; typedef unsigned char BYTE; //typedef char _TCHAR; #pragma comment(lib,"libfaac.lib") int main(int argc, _TCHAR* argv[]) { ULONG nSampleRate = 44100; // 采样率 UINT nChannels = 2; // 声道数 UINT nPCMBitSize = 16; // 单样本位数 ULONG nInputSamples = 0; ULONG nMaxOutputBytes = 0; int nRet; faacEncHandle hEncoder; faacEncConfigurationPtr pConfiguration; int nBytesRead; int nPCMBufferSize; BYTE* pbPCMBuffer; BYTE* pbAACBuffer; FILE* fpIn; // WAV file for input FILE* fpOut; // AAC file for output fpIn = fopen("test.wav", "rb");// resample.pcm fpOut = fopen("test.aac", "wb");// resample.aac // (1) Open FAAC engine hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes); if(hEncoder == NULL) { printf("[ERROR] Failed to call faacEncOpen() "); return -1; } nPCMBufferSize = nInputSamples * nPCMBitSize / 8; pbPCMBuffer = new BYTE [nPCMBufferSize]; pbAACBuffer = new BYTE [nMaxOutputBytes]; // (2.1) Get current encoding configuration pConfiguration = faacEncGetCurrentConfiguration(hEncoder); pConfiguration->inputFormat = FAAC_INPUT_16BIT; // (2.2) Set encoding configuration nRet = faacEncSetConfiguration(hEncoder, pConfiguration); //如果是wav格式,先读取前面的 fseek(fpIn,58,SEEK_SET); for(int i = 0; 1; i++) { // 读入的实际字节数,最大不会超过nPCMBufferSize,
nBytesRead = fread(pbPCMBuffer, 1, nPCMBufferSize, fpIn); // 输入样本数,用实际读入字节数计算,一般只有读到文件尾时才不是nPCMBufferSize/(nPCMBitSize/8); nInputSamples = nBytesRead / (nPCMBitSize / 8); // (3) Encode nRet = faacEncEncode( hEncoder, (int*) pbPCMBuffer, nInputSamples, pbAACBuffer, nMaxOutputBytes); fwrite(pbAACBuffer, 1, nRet, fpOut); printf("%d: faacEncEncode returns %d ", i, nRet); if(nBytesRead <= 0) { break; } } // (4) Close FAAC engine nRet = faacEncClose(hEncoder); delete[] pbPCMBuffer; delete[] pbAACBuffer; fclose(fpIn); fclose(fpOut); //getchar(); return 0; }