Ошибка при декодировании / кодировании flac в / из wav - PullRequest
4 голосов
/ 29 декабря 2011

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

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

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;
}

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

1 Ответ

3 голосов
/ 09 января 2012

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

InДругими словами, вся работа по записи файла выполняется в write_callback.Вот где вам предоставляются декодированные данные, и вы должны генерировать и записывать выходной файл, кадр за кадром.Если вы посмотрите на пример на http://flac.cvs.sourceforge.net/viewvc/flac/flac/examples/c/decode/file/main.c?view=markup, который, кажется, для начала вы скопировали, это именно то, что он делает.

...