Почему я не могу уменьшить 4-секундный клип со скоростью 60 кадров в секунду ровно до 1 секунды?

В настоящее время я использую фильтр setpts для ускорения или замедления различных клипов, и точность очень важна для меня ( контекст: я объединяю их в окончательный клип, который должен быть идеально синхронизирован с отдельное видео.) Я использовал это как общий подход:

setpts=(targetDuration/totalFrameCount)*N/TB" -r targetDuration/totalFrameCount

Хотя в большинстве случаев это довольно точно, мне интересно, смогу ли я получить лучшие результаты. Например, если я попытаюсь уменьшить 4-секундный клип со скоростью 60 кадров в секунду ровно до 1 секунды, то есть:

ffmpeg -y -i clip_4sec.avi -filter:v "setpts=(1/240)*N/TB" -r 240/1 clip_4sec_scaled_to_1sec.avi

На самом деле я получаю клип 992 мс. Кто-нибудь знает, почему это происходит? Насколько я понимаю, если целевая продолжительность кратна длительности кадра (1/60 секунды), это не должно быть проблемой, верно?

Есть ли лучший подход, который я могу использовать для повышения точности?

Примечание: FWIW я уже дважды проверил, что входной клип имеет фактическое количество кадров 240.


person joeycato    schedule 19.05.2018    source источник


Ответы (1)


Исходная частота составляет 60 кадров в секунду, а его временная развертка на входе и выходе фильтра настроек составляет 1/60. Перед изменением PTS следует установить значение 1/240.

ffmpeg -y -i clip_4sec.avi -filter:v "settb=1/240,setpts=(1/240)*N/TB" -r 240/1 clip_4sec_scaled_to_1sec.avi

Вероятно, здесь есть ошибка с реализацией -r w.r.t. Мультиплексоры VFR, такие как AVI.

person Gyan    schedule 20.05.2018
comment
И снова вы попали в цель :) До сих пор я полагался на AVI без потерь для своего стороннего проекта только потому, что он работает быстрее по сравнению с MP4 без потерь h264. Но теперь мне интересно, стоит ли мне передумать, поскольку VFR иногда может быть немного сложным в использовании. - person joeycato; 20.05.2018