Я использую официальный пример 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 связаны правильно. Помогите, пожалуйста, разобраться, в чем проблема !!