Преобразование изображений в видео с переменной частотой кадров с помощью FFmpeg - PullRequest
0 голосов
/ 24 апреля 2020

У меня 900 изображений:

  • 001.tif
  • 002.tif
  • 003.tif
  • ...
  • 900.tif

Я использую следующий код для создания видео из этих изображений:

ffmpeg -r 30 -start_number 1 -i %03d.tif -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4

Работает отлично, но я тоже необходимо сделать еще одно видео, которое медленно (например, 5 кадров в секунду) в начале и постепенно (например, 6, 7, 8, ... кадров в секунду) ускоряется, чтобы достичь очень высокой скорости (например, 90 кадров в секунду). Каждая секунда видео должна иметь другой fps по сравнению со вторым до и вторым после него, абсолютно постепенное ускорение.

Могу ли я сделать это с FFmpeg? Если да, то как?

1 Ответ

1 голос
/ 24 апреля 2020

Вы можете использовать фильтр setpts для постепенного изменения fps.

Более полезно думать об этом с точки зрения длительности кадра, а не fps, поскольку именно это setpts может напрямую изменять. Значение 5 кадров в секунду указывает длительность кадра 200 мс, тогда как значение 90 кадров в секунду указывает длительность кадра 11 мс (после округления). Таким образом, кадр 0 начинается в момент времени 0 и имеет продолжительность 200 мс, поэтому кадр 1 показывает 200 мс и имеет эту временную метку. Кадр 808 имеет длительность 11 мс. Таким образом, для каждого кадра expr метки времени равен 200ms-189ms*N/809, где N - индекс кадра. Поскольку мы не уменьшаем длительность кадра после 809, мы должны ограничить N до 809. 200ms-189ms*min(N,809)/809

Команда тогда равна

ffmpeg -start_number 1 -i %03d.tif -vf "settb=1/1000,setpts='if(eq(N,0),0,PREV_OUTPTS+200-189*(min(N,809)/809))'" -vsync vfr -enc_time_base 1/1000 -c:v libx264 -pix_fmt yuv420p output.mp4

. шкала времени до 1 миллисекунды. Как и enc_time_base для другой части конвейера обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...