Что означает "прошлая продолжительность X. XXX слишком большая"?



при кодировании H. 264 с помощью ffmpeg я получаю следующий тип предупреждений в массе:



Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large


что они означают? Я не нашел ничего ясного в интернете или в документации ffmpeg.

668   5  

5 ответов:

Я получал тысячи этих предупреждений с определенным кодированием. Я уменьшал видео 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

следующие предложения здесь я сначала добавил-частота кадров 60000/1001 на вход. Это ничего не улучшило. Я сохранил-частоту кадров и добавил-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

тем не менее, я проверил a/V sync в начале файлов и в конце, и не было заметной разницы в синхронизации между двумя файлами. Их время работы также было одинаковым, но это было измерено только до ближайшей секунды, в VLC. Поэтому я проверил количество кадров с помощью ffmpeg следующим образом:

ffmpeg -i output.mkv -map 0:v:0 -c copy -f null -

и ищет "frame=#" в конце вывода.

оказывается, исходное видео было 375226 кадров в длину, оригинал вызов дал 375195 кадров, а второй вызов дал 375200. Поэтому второй вызов, с гораздо меньшим количеством предупреждений за 5 и менее кадров.

последующее тестирование показало, что-частота кадров и-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.

один из сопровождающих для проекта DVDStyler на SourceForge сказал этой об этом:

версии FFMpeg после 15 января 2015 года часто отображают это предупреждение. Оно имеет был добавлен, чтобы предупредить о возможном искажении управления скоростью, в противном случае он не причиняет никакого вреда.

у меня была эта ошибка, потому что я хотел преобразовать серию изображений в видео:

ffmpeg -i %05d.png -r 24 -c:v libx264 -crf 5 out.mkv

проблема, по-видимому, заключается в том, что если для ввода не задана частота кадров, то предполагается частота кадров 25 кадров в секунду:

Input #0, image2, from 'frames/%04d.bmp':
  Duration: 00:00:15.96, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: bmp, bgra, 920x650, 25 fps, 25 tbr, 25 tbn, 25 tbc

это также можно увидеть на общем количестве закодированных кадров. У меня было 400 изображений, но вышеприведенная команда только закодировала 384:

frame=  384 fps= 68 q=-1.0 Lsize=   10931kB time=00:00:15.91 bitrate=5626.1kbits/s dup=0 drop=15    
video:10928kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.033807%

сообщения об ошибках исчезают, устанавливая входную частоту кадров вместо выходной частоты кадров. Выходная частота кадров будет автоматически выбрана как частота входного сигнала. Кроме того, в новых версиях ffmpeg вам нужно следить, потому что при использовании изображений PNG с или наоборот image2 или v4l2 входной формат, вы должны использовать -framerate вместо -r см. документация -r опции.

ffmpeg -framerate 24 -i %05d.png -c:v libx264 -crf 5 out.mkv

также можно указать частоту кадров как на входе, так и на выходе отдельно:

ffmpeg -framerate 25 -i %05d.png -r 10 -c:v libx264 -crf 5 out.mkv

в этом случае будет закодировано только 161/400 кадров. Остальные кадры будут отброшены. Также сообщение об ошибке исчезает, я думаю, чтобы не замедлять ffmpeg, отправляя спам в stdout, см.:

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

смотреть на!--3-->исходный код похоже, что разница между временем представления (pts) во входном потоке отличается от времени в выходном потоке более чем на фиксированный предел, установленный в 0.6 .

фрагменты из источника:

    delta0 = sync_ipts - ost->sync_opts;
    delta  = delta0 + duration;

...

        if (delta0 < 0 &&
        delta > 0 &&
        format_video_sync != VSYNC_PASSTHROUGH &&
        format_video_sync != VSYNC_DROP) {
        double cor = FFMIN(-delta0, duration);
        if (delta0 < -0.6) {
            av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
        } else
            av_log(NULL, AV_LOG_DEBUG, "Cliping frame in rate conversion by %f\n", -delta0);
        sync_ipts += cor;
        duration -= cor;
        delta0 += cor;
    }

это только быстрый взгляд, поэтому, пожалуйста, не стесняйтесь копать глубже.

по состоянию на выпуск видео #4700 - Прошлая длительность 0.999992 слишком большая это всего лишь предупреждение. Использование:

ffmpeg -loglevel -quiet -i input_file.xyz ....

чтобы остановить его.

Нед

Comments

    Ничего не найдено.