Я получал тысячи этих предупреждений с определенным кодом. Я уменьшал видео 1080p до 480p. В точке редактирования, где было какое-то сомнительное видео из-за дефекта исходного лазерного диска, эти сообщения начали появляться, а затем появлялись, я думаю, для каждого последующего кадра. Они продолжали и продолжали, как этот короткий отрывок:
Past duration 0.901115 too large= 535031kB time=00:54:15.06 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 31 times
Past duration 0.901115 too large= 535031kB time=00:54:15.62 bitrate=1346.3kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 34 times
Past duration 0.901115 too large= 535031kB time=00:54:16.21 bitrate=1346.0kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 36 times
Past duration 0.901115 too large= 535338kB time=00:54:16.83 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 39 times
Первоначальный вызов ffmpeg был таким:
ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv
Следуя рекомендациям здесь, я сначала добавил -framerate 60000/1001 на вход. Это ничего не улучшило. Я сохранил -framerate и добавил к выводу -r 60000/1001. Это все равно ничего не улучшило. Сохранив оба, я наконец добавил -async 1 -vsync 1. В результате я получил одно предупреждение, и все. Этот призыв был:
ffmpeg -i input.mp4 -framerate 60000/1001 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -r 60000/1001 -async 1 -vsync 1
Единственное отличие, которое я обнаружил в подробном дампе от MediaInfo, - это удаление этой строки, обнаруженной в исходном вызове, но не во втором:
Delay relative to video : -33ms
Однако я проверил синхронизацию аудио и видео в начале и в конце файлов, и не было заметной разницы в синхронизации между двумя файлами. Их время работы также было таким же, но оно измерялось только с точностью до секунды в VLC. Поэтому я проверил количество кадров с помощью ffmpeg вот так:
ffmpeg -i output.mkv -map 0:v:0 -c copy -f null -
и ищем "frame = #" ближе к концу вывода.
Оказывается, исходное видео было длиной 375226 кадров, исходный вызов дал 375195 кадров, а второй вызов дал 375200. Таким образом, второй вызов с гораздо меньшим количеством предупреждений также потерял на 5 кадров меньше.
Последующее тестирование показало, что -framerate и -r не нужны, и достаточно использовать два флага синхронизации. Это дало результаты, идентичные результатам второго вызова выше, поэтому третий и самый простой вызов, который я обнаружил для решения проблемы, таков:
ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -async 1 -vsync 1
И еще один файл впоследствии выдал кучу этих предупреждений даже с флагами синхронизации, но добавление обратно флагов скорости «исправило» это (выдало только два предупреждения вместо тысяч). Поэтому иногда второй вызов срабатывает, а третий - нет. Для моих непосредственных целей я остановлюсь на втором вызове и надеюсь, что он решит большинство этих проблем.
Все это было с ffmpeg версии 4.0.