2011-12-29 2 views
4

xcode 프로젝트에 LibFlac을 추가했습니다. 그런 다음 프로젝트의 Libflac에서 decode/main.c를 추가했습니다. 내가 infile.flac을 통과하고 프로젝트의 실행 파일을 실행하지만 오류를wac에서 flac으로 인코딩/인코딩하는 중 오류가 발생했습니다.

디코딩 다음주고있다 : FAILED 상태 : FLAC__STREAM_DECODER_END_OF_STREAM는

여기 t

은 main.c에

int main(int argc, char *argv[]) 
{ 
    FLAC__bool ok = true; 
    FLAC__StreamDecoder *decoder = 0; 
    FLAC__StreamDecoderInitStatus init_status; 
    FILE *fout; 

    const char *infile = "infile.flac"; 
    const char *outfile = "outfile.wav"; 

    /* 
    if(argc != 3) { 
     fprintf(stderr, "usage: %s infile.flac outfile.wav\n", argv[0]); 
     return 1; 
    } 
    */ 

    if((fout = fopen("infile.flac", "wb")) == NULL) { 
     fprintf(stderr, "ERROR: opening %s for output\n", argv[2]); 
     return 1; 
    } 

    if((decoder = FLAC__stream_decoder_new()) == NULL) { 
     fprintf(stderr, "ERROR: allocating decoder\n"); 
     fclose(fout); 
     return 1; 
    } 

    (void)FLAC__stream_decoder_set_md5_checking(decoder, true); 

    init_status = FLAC__stream_decoder_init_file(decoder, infile, write_callback, metadata_callback, error_callback, /*client_data=*/fout); 
    if(init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK) { 
     fprintf(stderr, "ERROR: initializing decoder: %s\n", FLAC__StreamDecoderInitStatusString[init_status]); 
     ok = false; 
    } 

    if(ok) { 
     ok = FLAC__stream_decoder_process_until_end_of_stream(decoder); 
     fprintf(stderr, "decoding: %s\n", ok? "succeeded" : "FAILED"); 
     fprintf(stderr, " state: %s\n", FLAC__StreamDecoderStateString[FLAC__stream_decoder_get_state(decoder)]); 
    } 

    FLAC__stream_decoder_delete(decoder); 
    fclose(fout); 

    return 0; 
} 
입니다 logou

도와주세요. 왜이 오류가 발생합니까?

+0

FLAC 파일이 맞습니까? 또한 메타 데이터를 먼저 처리하려면'FLAC__stream_decoder_process_until_end_of_metadata()'를 호출해야 할 수도 있습니다. – stativ

+0

ok .. 답장을 보내 주셔서 감사합니다. flac 파일을 확인하고이 함수를 호출합니다. – iProgrammer

+0

@stativ Hello R u there? – iProgrammer

답변

3

입력 파일을 "wb"로 여는 것은 파일을 여는 동안 infile을 자릅니다. 그게 네가 원하는 것일 수는 없어. 그렇지? 나는 당신이 정말로 의미한다고 생각합니다.

if((fout = fopen(outfile, "wb")) == NULL) { 

FLAC 샘플이 어떻게 작동하는지 혼란스러워합니다.

FLAC__stream_decoder_init_file 

파일을 열면 디코딩 할 파일 이름을 지정하고 디코딩을위한 콜백을 설정합니다.

FLAC__stream_decoder_process_until_end_of_stream 

파일을 디코딩하고, 모든 것이 그것에 마지막 파라미터로 주어진 매개 변수 FLAC__stream_decoder_init_file에 대한 호출 write_callback 제공하는 함수를 호출하는 프레임 디코딩.

즉, 파일 쓰기 작업은 모두 write_callback에서 수행됩니다. 여기서 디코딩 된 데이터가 제공되며 출력 파일을 프레임 단위로 생성하고 작성해야합니다. http://flac.cvs.sourceforge.net/viewvc/flac/flac/examples/c/decode/file/main.c?view=markup에있는 샘플을 보면 처음부터 복사 한 것으로 보이는 것처럼 그게 정확히 무엇인지 알 수 있습니다.

+0

flac을 wav로 변환하고 싶습니다. infile not outfile을 전달해야합니다. – iProgrammer

+0

입력 파일 이름을 FLAC__stream_decoder_init_file에 전달하면 해당 메서드는 입력 한 파일 이름을 사용하여 입력 파일을 엽니 다. fout은 콜백에 전달하는 용도로만 사용됩니다. 콜백은 문제를 이해하는 한 출력 파일에만 기록해야합니다. –

+0

또한 입력 파일을 _really_ 열려면 입력 파일을 열려면 "rb"를 사용하여 읽고 "wb"를 사용하여 자르거나 덮어 씁니다. –

관련 문제