При кодировании H.264 с использованием ffmpeg я получаю массовые предупреждения следующего типа:
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
Что они имеют в виду? Я не нашел ничего ясного в Интернете или в документации ffmpeg.
Ответы:
Я получал тысячи этих предупреждений с определенным кодом. Я уменьшал видео 1080p до 480p. В точке редактирования, где было какое-то сомнительное видео из-за дефекта исходного лазерного диска, эти сообщения начали появляться, а затем появлялись, я думаю, для каждого последующего кадра. Они продолжали и продолжали, как этот короткий отрывок:
Первоначальный вызов ffmpeg был таким:
Следуя рекомендациям здесь, я сначала добавил -framerate 60000/1001 на вход. Это ничего не улучшило. Я сохранил -framerate и добавил к выводу -r 60000/1001. Это все равно ничего не улучшило. Сохранив оба, я наконец добавил -async 1 -vsync 1. В результате я получил одно предупреждение, и все. Этот призыв был:
Единственное отличие, которое я обнаружил в подробном дампе от MediaInfo, - это удаление этой строки, обнаруженной в исходном вызове, но не во втором:
Однако я проверил синхронизацию аудио и видео в начале и в конце файлов, и не было заметной разницы в синхронизации между двумя файлами. Их время работы также было таким же, но оно измерялось только с точностью до секунды в VLC. Поэтому я проверил количество кадров с помощью ffmpeg вот так:
и ищем "frame = #" ближе к концу вывода.
Оказывается, исходное видео было длиной 375226 кадров, исходный вызов дал 375195 кадров, а второй вызов дал 375200. Таким образом, второй вызов с гораздо меньшим количеством предупреждений также потерял на 5 кадров меньше.
Последующее тестирование показало, что -framerate и -r не нужны, и достаточно использовать два флага синхронизации. Это дало результаты, идентичные результатам второго вызова выше, поэтому третий и самый простой вызов, который я обнаружил для решения проблемы, таков:
И еще один файл впоследствии выдал кучу этих предупреждений даже с флагами синхронизации, но добавление обратно флагов скорости «исправило» это (выдало только два предупреждения вместо тысяч). Поэтому иногда второй вызов срабатывает, а третий - нет. Для моих непосредственных целей я остановлюсь на втором вызове и надеюсь, что он решит большинство этих проблем.
Все это было с ffmpeg версии 4.0.
источник
-async 1 -vsync 1
исправил это для меня.Один из сопровождающих для проекта DVDStyler на SourceForge сказал это об этом:
источник
Это предупреждающее сообщение появляется при попытке кодировать источник с высокой частотой кадров в вывод с низкой частотой кадров, что означает необходимость отбрасывания кадров.
У меня была эта ошибка, потому что я хотел преобразовать серию изображений в видео:
Проблема, по-видимому, в том, что если для входных данных не указана частота кадров, то предполагается частота кадров 25 кадров в секунду:
Это также можно увидеть по общему количеству закодированных кадров. У меня было 400 изображений, но приведенная выше команда закодировала только 384:
Сообщения об ошибках исчезают, если вместо выходной частоты кадров устанавливается частота кадров на входе. После этого частота кадров вывода будет автоматически выбрана равной частоте кадров ввода. Кроме того, в более новых версиях ffmpeg вам нужно остерегаться, потому что при использовании изображений PNG с
-i
опцией или, скорее, входным форматомimage2
илиv4l2
вы должны использовать-framerate
вместо-r
, см. Документацию по этой-r
опции .Также можно указать частоту кадров для ввода и вывода отдельно:
В этом случае будут закодированы только 161/400 кадров. Остальные промежуточные кадры будут отброшены. Также сообщение об ошибке исчезает, я думаю, чтобы не замедлять ffmpeg, отправляя спам на stdout, см.:
источник
-r
сработало, а использование --framerate
нет.ffmpeg -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
до этого без предупрежденияffmpeg -framerate 50 -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
(обратите внимание на-framerate 50
добавленное для ввода)Глядя на исходный код, кажется, что разница между временем представления (pts) во входном потоке отличается от времени в выходном потоке более чем на фиксированный предел, равный 0,6.
Фрагменты из источника:
...
Это только беглый взгляд, поэтому не стесняйтесь копать глубже.
источник
format_video_sync = VSYNC_DROP
илиformat_video_sync = VSYNC_PASSTHROUGH
посмотреть, подходит ли один из них для вашего варианта использования.-r
переключателя «исправил» эти предупреждения.На самом деле команда должна быть:
У параметра «quiet» нет префикса «-», так как это не опция, а значение для опции «-loglevel».
источник
Согласно проблеме FFmpeg № 4700 - Прошлая длительность 0,999992 слишком велика, это всего лишь предупреждение.
Используйте
-loglevel
опцию, чтобы остановить это:Возможные уровни - числа или:
источник