2015-01-20 4 views
2

libfdk_aac을 사용하여 AAC로 인코딩 된 파일을 디코딩하려고합니다. 이 파일은 libfdk_aac을 사용하여 생성 된 원시 AAC-LC ADTS 패킷의 스트림으로 구성됩니다. VLC와 Window Media Player를 사용하여 파일을 재생할 수 있기 때문에 데이터가 잘 형성되었다고 확신합니다.libfdk_aac이 버퍼로 읽지 않습니다.

UCHAR* inputBuffer = new UCHAR[ 2048 ] ; 
UINT bufSize[] = { 0 } ; 

INT_PCM* outputBuffer = new INT_PCM[ 4096 ] ; 
int outputbufSize = 8192 ; 
UINT flags = 0 ; 

//Set up the Audio Specific Config 
UCHAR* asc = new UCHAR[ 2 ] ; 
asc[ 0 ] = (UCHAR) 0x11 ; 
asc[ 1 ] = (UCHAR) 0x90 ; 
UINT ascSize[] = { 2 } ; 

HANDLE_DECODER decoder = aacDecoder_Open(TT_MP4_ADTS, 1) ; 
AAC_DECODER_ERROR aacError = aacDecoder_ConfigRaw(decoder, &asc, ascSize) ; 
if(aacError) 
{ 
    printf("Configure error\n") ; 
    exit(-1) ; 
} 

int dataAvailable = 1 ; 
do 
{ 
    //Reads the file and gets the next ADTS packet with one AAC frame 
    unsigned int adtsPacketSize ; 
    dataAvailable = readMPEGFile(filePtr, inputBuffer, &adtsPacketSize) ; 
    bufSize[ 0 ] = adtsPacketSize ; 

    aacError = aacDecoder_Fill(decoder, &inputBuffer, bufSize, &bytesValid) ; 
    //Check to see if bytesValid == 0 
    //If bytesValid > 0, keep calling aacDecoder_Fill() 

    //If bytesValid == 0, decode audio 
    aacError = aacDecoder_DecodeFrame(decoder, outputBuffer, outputBufSize, flags) ; 

    //If no error, write raw PCM data to file. 
}while(dataAvailable) ; 

문제는 aacDecoder_DecodeFrame가 AAC_DEC_NOT_ENOUGH_BITS으로 돌아가 계속한다는 것입니다 :

여기 내 설정이다. aacDecoder_GetFreeBytes()를 호출하면 내부 버퍼가 입력 데이터를 얻지 못하고 있음을 알 수 있습니다. 왜 이런 일이 일어나고 있는지에 대한 아이디어가 있습니까?

답변

-1
  1. 날짜가 ADTS 인 경우 aacDecoder_ConfigRaw를 통해 ES 설정을 지정할 필요가 없습니다.
  2. 당신의 outputBuffer 크기를 확인은,이 크기는 ADTS에서 읽을 수 있습니다, 그것은 파일에 출력 버퍼를 작성하고 분석하는 PCM 도구를 사용하여 frame size * channel counts
  3. 시도 동일 그것을 (e.g. Adobe Audition)
관련 문제