Що означає "Занадто велика тривалість X.XXX"?


142

При кодуванні H.264 за допомогою ffmpeg я отримую масовий такий тип попереджень:

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

Що вони означають? Я нічого не знайшов в Інтернеті чи в документації на ffmpeg.


2
Будь ласка, направляйте питання ffmpeg до бета-версії video.stackexchange.com . Дивіться опис тегу ffmpeg.
Ондра Жижка

34
@Ondra Ще одна зміна stackexchange? Я плутаюсь із тими, що мають понад 100 підсистем, я не впевнений, чи це позитивний напрямок, в який спрямовується зміна stackexchange.
mxmlnkn

1
@mxmlnkn Я погоджуюсь, це змушує вас шукати простих часів ... :)
Ерік,

4
Я думаю це. StackOverflow призначений для програмування, це не програмування. Є веб-сайт Q&A для обробки відео, це питання щодо обробки відео. Чого не зрозуміти?
Ондра Жижка

Прочитайте також опис тегів.
Ondra Žižka

Відповіді:


23

Я отримував тисячі цих попереджень із певним кодуванням. Я знижував масштаб відео з 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

Однак я перевірив синхронізацію A / V біля початку файлів і наприкінці, і не було помітної різниці в синхронізації між двома файлами. Їх час роботи також був однаковим, але це було виміряно лише до найближчої секунди, у 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.


2
Дякую за це! Після днів проблем, -async 1 -vsync 1виправили це для мене.
Оффек

1
Дякую за цей аналіз @larryy дуже корисно
поглиблення

90

Про це сказав один із підтримуючих проекту DVDStyler на SourceForge :

Версії FFMpeg після 15 січня 2015 року часто показують це попередження. Додано для попередження можливих спотворень контролю швидкості, інакше це не заподіює ніякої шкоди.


"спотворення контролю швидкості" пов'язане з (в основному відео) кодуванням і не має жодного відношення до цього попередження. Це стосується того, чи відрізняється часова марка виходу занадто сильно (відносно) порівняно з часовою міткою вводу
Gyan

Перші кілька разів, коли я отримував попередження, я припиняв конверсію, але ця порада змусила мене запустити її, і попередження припинилося через деякий час, і конверсія завершилася успішно. Дякую.
IRTFM

58

Це попереджувальне повідомлення з’являється при спробі кодування джерела високої частоти кадрів до виходу з низькою швидкістю кадрів, що означає, що кадри потрібно скинути.


У мене виникла помилка, оскільки я хотів перетворити серію зображень у відео:

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 з -iопцією, а точніше, 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
"тому що лише при використанні зображень PNG з опцією -i ви повинні використовувати -framerate замість -r" - це повністю вирішило мою проблему, дякую!
Анонім

1
Намагаючись перетворити wmv в mp4, використовуючи -rпрацював там, де використання -framerateне робив.
1934286,

+1, і я пропоную перемістити ваше "підсумок" вгорі. Більше того, як це вирішило мій випадок перетворення зображень у відео та намагання збільшити частоту кадрів виходу та прискорити також вихід. Я почав з цього 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додані для введення)
el-teedee

49

Дивлячись на вихідний код, схоже, що різниця між часом подання (пт) у вхідному потоці відрізняється від вихідного потоку більш ніж на фіксовану межу, встановлену на 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;
    }

Це лише швидкий погляд, тож сміливо копайте глибше.


Чи можемо ми щось зробити, щоб "виправити" цю проблему або явно встановити вихідні очки?
Баодад

1
Я не пам’ятаю деталей, пов’язаних із цією проблемою, але якщо під «виправленням» ви маєте на увазі позбавлення від попередження, то виходячи з наведеного вище коду, ви можете розглянути варіант format_video_sync = VSYNC_DROPабо format_video_sync = VSYNC_PASSTHROUGHпобачити, чи є одна з цих життєздатних у вашому випадку використання.
Ерік

Дякую. Я встановив встановлення частоти кадрів явно за допомогою -rперемикача "фіксував" ці попередження.
Баодад

1
Щось із особистого досвіду: у мене виникла проблема спаму повідомлення "минула тривалість", і я виправив це, вимушуючи частоту кадрів введення з -r 25, але потім я почав сильно синхронізувати звук. Видалення опції -r та використання "-async 1 -vsync 1" для запобігання десинхронізації звуку запобігло проблему з аудіо, але спам "минулої тривалості", здається, теж пішов.
Джейсон Ланг

У версії 4.1 та пізніших версій рівень журналу був оновлений, тому він не відображатиметься на рівні журналу за замовчуванням.
Gyan


1

Насправді команда повинна бути:

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

Не існує префікса "-" до параметра "тихо", оскільки це не параметр, а значення для параметра "-loglevel".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.