Ошибка при декодировании/кодировании flac в/из wav

Я добавил LibFlac в проект xcode. Затем я добавил в свой проект decode/main.c из Libflac. Я передал infile.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;
}

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


person iProgrammer    schedule 29.12.2011    source источник
comment
Ваши файлы FLAC правильные? Также вам может понадобиться сначала вызвать FLAC__stream_decoder_process_until_end_of_metadata() для обработки метаданных.   -  person stativ    schedule 08.01.2012
comment
хорошо..Спасибо за ответ, я проверю файлы flac и вызову эту функцию   -  person iProgrammer    schedule 09.01.2012
comment
@stativ Привет, ты здесь?   -  person iProgrammer    schedule 09.01.2012


Ответы (1)


fоткрытие вашего входного файла с помощью «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, похоже, это то, что вы скопировали для начала с, это именно то, что он делает.

person Joachim Isaksson    schedule 09.01.2012
comment
Я хочу преобразовать flac в wav, и здесь я должен передать infile, а не outfile - person iProgrammer; 09.01.2012
comment
Вы передаете имя входного файла в FLAC__stream_decoder_init_file, этот метод откроет для вас входной файл, используя указанное вами имя. fout в вашем примере используется только для перехода к обратным вызовам, которые должны, насколько я понимаю вашу проблему, только записывать в выходной файл. - person Joachim Isaksson; 09.01.2012
comment
Кроме того, если вы действительно хотите открыть там входной файл, вы должны открыть его, используя rb для чтения, а не wb для усечения и перезаписи. - person Joachim Isaksson; 09.01.2012
comment
хорошо, я также использовал rb, но все равно выдает ошибку. Если вы делали это раньше, пожалуйста, помогите мне, я застрял в этом с последних 2 недель. - person iProgrammer; 09.01.2012
comment
Ваш файл flac имеет правильный размер или он усечен с момента последнего запуска до 0 байт? Кроме того, вы получаете ту же ошибку? Поскольку у меня нет вашего полного кода, я не могу скомпилировать и протестировать его самостоятельно. - person Joachim Isaksson; 09.01.2012
comment
мой размер flac составляет 55 МБ, и если вы можете прийти в чат, я могу предоставить вам свой код - person iProgrammer; 09.01.2012
comment
давайте продолжим это обсуждение в чате - person iProgrammer; 09.01.2012