Пример FFmpeg API (encode_video. c) работает некорректно - PullRequest
1 голос
/ 29 мая 2020

Я использую официальный пример encode_video. c, чтобы проверить, правильно ли работает FFmpeg у меня. Я получил готовую версию windows с сайта ffmpeg.zeranoe.com / builds . Он уже построен с libx264 и другими внешними библиотеками. Я получил как dev, так и общие выпуски и соответственно добавил библиотеки DLL, заголовочные файлы и библиотеки в Visual Studio.

Теперь пример encode_video. c работает некорректно.


Что я пробовал:

Я скомпилировал пример и запустил его во многих различных форматах файлов и кодеках, например:

Сначала я попробовал все эти форматы файлов (.mp4, .m4v, .h264, .x264, .avi,. flv) с кодом c назовите libx264. Код выполнен без ошибок, но выходной видеофайл не воспроизводился в проигрывателе по умолчанию VL C или Windows 10.

Затем я попробовал все вышеперечисленные форматы файлов, но с кодом c имя как mpeg4. Код выполнен без ошибок, но выходной видеофайл воспроизводился только для .m4v в VL C.


Что ожидается:

Все эти комбинации должны были создать видеофайл, который можно было бы воспроизвести в VL C. Ни один из них не работал, кроме .m4v в качестве формата файла и mpeg4 в качестве кода c имени.


Скажите, пожалуйста как заставить это работать для h264. В основном я хочу, чтобы он работал для h264, поскольку это важно только сейчас.

Я запускаю код вроде ./encode_video.exe test.mp4 libx264, где первый аргумент - это имя выходного файла, а второй аргумент - это код c имя.

Это результат для test.mp4 и libx264 в качестве аргументов командной строки. https://imgur.com/a/AHLQwuK

Кажется, что в функции encode он проходит по приведенному ниже коду и возвращает из-за AVERROR (EAGAIN) или AVERROR_EOF. Пожалуйста, расскажите мне, что происходит.

while (ret >= 0) {
        ret = avcodec_receive_packet(enc_ctx, pkt);
        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
            return;
        else if (ret < 0) {
            fprintf(stderr, "Error during encoding\n");
            exit(1);
        }

        printf("Write packet %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size);
        fwrite(pkt->data, 1, pkt->size, outfile);
        av_packet_unref(pkt);
    }

Я использовал Depencies GUI, чтобы найти связанные библиотеки DLL, и это показывает, что библиотеки DLL связаны правильно. Помогите, пожалуйста, разобраться, в чем проблема !!

1 Ответ

0 голосов
/ 12 июня 2020

Я нашел этот вопрос, потому что у меня была такая же проблема (не могу смотреть видео, созданное в этом примере). Что касается вашего беспокойства:

Кажется, что в функции кодирования он проходит по приведенному ниже коду и возвращается из-за AVERROR (EAGAIN) или AVERROR_EOF. Пожалуйста, скажите мне, что происходит.

Пошагово просматривая код в отладчике, я тоже заметил эти случайные «ошибки». Однако эти кадры в конечном итоге обрабатываются либо в последующей итерации l oop, либо когда кодировщик прошивается через:

/* flush the encoder */
encode(c, NULL, pkt, f);

. Я тоже пытался использовать VL C, а также QuickTime, но безуспешно.

Затем я заметил инструмент ffplay в папке bin ffmpeg, который будет воспроизводить все видео, созданные в этом примере, с разными кодеками.

Моя точка зрения - проблема может быть в зрителе, а не с видео файлом.

...