2011-12-29 6 views
4

Я добавил LibFlac в проект xcode. Затем я добавил decode/main.c из Libflac в свой проект. Я прошел infile.flac и запустить исполняемый файл проекта, но он дает следующее сообщение об ошибкеОшибка при декодировании/кодировании flac в/из wav

декодирования: FAILED состояние: FLAC__STREAM_DECODER_END_OF_STREAM logou

т

Вот 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; 
} 

Пожалуйста, помогите мне. почему я получаю эту ошибку?

+0

Верно ли ваши файлы FLAC? Также вам может потребоваться вызвать FLAC__stream_decoder_process_until_end_of_metadata() 'для обработки метаданных в первую очередь. – stativ

+0

ok..Thanks для ответа, я проверю файлы flac и вызову эту функцию – iProgrammer

+0

@stativ Здравствуйте, R u there? – iProgrammer

ответ

3

Приобретение файла ввода с помощью «wb» приведет к усечению вашего вторжения при его открытии. Это не может быть то, что вы хотите, не так ли? Я думаю, вы действительно имеете в виду;

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

Возможно, возникла некоторая путаница в том, как работает образец FLAC.

FLAC__stream_decoder_init_file 

открывает файл, который вы даете ему имя файла для декодирования и устанавливает обратные вызовы для декодирования.

FLAC__stream_decoder_process_until_end_of_stream 

декодирует файл и для каждого декодированного кадра вызывает функцию write_callback представленную в вызове FLAC__stream_decoder_init_file с параметром заданного в качестве последнего параметра к нему.

Другими словами, вся работа по написанию файла выполняется в 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» для обрезания и перезаписывания. –

 Смежные вопросы

  • Нет связанных вопросов^_^