홈페이지: http://www.audiocoding.com/faac.html

FAAC(Freeware Advanced Audio Coder)의 약어로 AAC 오디오 인코더를 말한다. FAAC는 현재 MPEG-4 LTP, main, Low Complexity를 지원하고 있다.
faac 1.28 버전을 MinGW에서 컴파일시 패치를 해야한다. 패치는 여기서 다운받고.
패치방법은 소스코드내에서 patch -p0 < faac-01-buildfixes.patch 를 수행.
FAAC is an MPEG-4 and MPEG-2 AAC encoder.
Note that the quality of FAAC is not up to par with the currently best AAC encoders available.
Features:
- Portable
- Reasonably fast
- LC, Main, LTP support
- DRM support through DreaM
다운로드: 1.28
예제
#include <faac.h>
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
ULONG nSampleRate = 22050;
UINT nChannels = 1;
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;
FILE* fpOut;
fpIn = fopen("C:\\audio-22050,16,1.pcm", "rb");
fpOut = fopen("C:\\audio-22050,16,1.aac", "wb");
// FAAC 라이브러리를 이용하려면 faacEncOpen()을 호출해야 한다.
// 압축을 할 PCM 데이터 속성을 입력하면
// 압축 수행 시 한번에 넣을 샘플수와 한번 호출시 출력되는 최대 압축 데이터 크기를 알려준다.
hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);
if(hEncoder == NULL)
{
printf("[ERROR] Failed to call faacEncOpen()\n");
return -1;
}
nPCMBufferSize = nInputSamples * nPCMBitSize / 8;
pbPCMBuffer = new BYTE [nPCMBufferSize];
pbAACBuffer = new BYTE [nMaxOutputBytes];
// 입력할 PCM 데이터의 BIT 크기는 16BIT임을 명시한다. (FAAC의 Default값은 32BIT)
pConfiguration = faacEncGetCurrentConfiguration(hEncoder);
pConfiguration->inputFormat = FAAC_INPUT_16BIT;
// Encoding 설정을 변경한다.
nRet = faacEncSetConfiguration(hEncoder, pConfiguration);
for(int i=0; 1; i++)
{
nBytesRead = fread(pbPCMBuffer, 1, nPCMBufferSize, fpIn);
nInputSamples = nBytesRead / (nPCMBitSize / 8);
// faacEncEncode() 에서 PCM 데이터를 압축하여 AAC 데이터를 만든다.
// nRet: 결과 데이터의 BYTE 크기 (즉, pbAACBuffer 내에 저장된 AAC 데이터의 BYTE 크기)
// pbAACBuffer: 결과물인 AAC 데이터가 저장되는 버퍼
nRet = faacEncEncode(
hEncoder, (int*) pbPCMBuffer, nInputSamples, pbAACBuffer, nMaxOutputBytes);
fwrite(pbAACBuffer, 1, nRet, fpOut);
printf("%d: faacEncEncode returns %d\n", i, nRet);
if(nBytesRead <= 0)
{
break;
}
}
while(1)
{
// FAAC 라이브러리내에 남아있는 PCM 데이터를 압축시킨다. (Flushing)
nRet = faacEncEncode(
hEncoder, (int*) pbPCMBuffer, 0, pbAACBuffer, nMaxOutputBytes);
// 더이상 압축된 데이터가 나오지 않으면 종료
if(nRet <= 0)
{
break;
}
}
// FAAC 라이브러리를 닫는다.
nRet = faacEncClose(hEncoder);
delete[] pbPCMBuffer;
delete[] pbAACBuffer;
fclose(fpIn);
fclose(fpOut);
getchar();
return 0;
}