Skip to content

**** ****

for my bad memories..

faac


홈페이지: 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;
}

Categorized as: Programming



답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다


이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.