
Самое простое слайд-шоу — это просто последовательность изображений, каждое из которых отображается в течение одинакового количества времени.
Я бы тоже хотел сделать последовательность, но более сложную по длительности:
Я хочу, чтобы первая картинка длилась 1 секунду, следующая — чуть меньше секунды, следующая — еще немного короче, чтобы последовательность начиналась медленно и ускорялась к концу.
Я не знаю, как это сделать, единственное, что я могу предположить, это то, что длительность каждой картинки можно рассчитать с помощью функции типа
duration = 1/picture_number
duration = 1 - (picture_number/picture_total)
или в сценарии:
duration=1
while [duration > 0]
do
duration=duration*0.99
done
решение1
Это можно сделать одной командой. Основной метод — начать со слайд-шоу, где каждое изображение имеет одинаковую продолжительность, а затем использовать фильтр выбора, чтобы обрезать большее количество времени показа каждого последующего изображения.
ffmpeg -framerate 1 -i img%d.jpg \
-vf fps=25,select='lt(mod(t,1),1-floor(t)/25)',setpts=N/25/TB \
out.mp4
-framerate 1
--> это контролирует, как быстро изначально меняются изображения.
fps=25
--> устанавливаем финальную частоту кадров. Также это нужно сделать, чтобы были кадры для работы.
select='lt(mod(t,1),1-floor(t/1)/25)'
--> С каждой секунды оставляйте на один кадр меньше.
setpts=N/25/TB
--> сделайте временные метки выбранных кадров непрерывными, иначе ffmpeg будет дублировать кадры, чтобы заполнить пробелы, и наша цель будет нарушена.
Чтобы начать с начальной продолжительности в 3 секунды, вам нужно изменить частоту кадров на 1/3
и выбрать на lt(mod(t,3),3-floor(t/3)/25)
. Вам нужно будет изменить 25, чтобы контролировать скорость, с которой уменьшается длительность. Более высокие значения уменьшат длительность с меньшей скоростью.