Как сделать переменную шкалу времени?

Как сделать переменную шкалу времени?

У меня есть видео, в котором я хотел бы изменить временной масштаб на основе соотношений, считанных из файла.

Я понял, что для удвоения скорости всего видео я могу использовать фильтр setpts, setpts=2*PTSоднако мне нужно изменить масштаб с течением времени, чтобы видео

  • Начните со скорости 1x
  • На отметке 5,7564 секунды он переключится на скорость 1,4x.
  • На отметке 10,2571 секунды скорость переключится на 0,983333x.
  • На отметке 15,6251 секунды скорость переключится на 1x для оставшейся части видео.

Я понял, что мне, скорее всего, придется создать файл скрипта, который можно будет прочитать, -filter_script:vно я не знаю, что использовать, чтобы получить желаемое поведение.

Мой первый наивный подход состоял в том, чтобы сделать

setpts='
if(lt(T,5.7564),
    1*PTS,      
if(lt(T,10.2571),
    1.4*PTS,
if(lt(T,15.6251),
    0.983333*PTS,
    1*PTS
))))'

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

Лучшим способом, вероятно, было бы разрезать видео на 4 сегмента и использовать по одному setpts=#*PTSto для каждого сегмента, но я не знаю, как это записать.

решение1

Как вы упомянули, один из подходов заключается в том, чтобы разбить входные данные на четыре отдельных сегмента, применить фильтр setpts к двум из них и, наконец, объединить их все. Вот команда для этого:

ffmpeg -i input.mp4 -lavfi "[0:v]trim=0:5.7564[firstpart];[0:v]trim=start=5.7564:10.2571,setpts=PTS-STARTPTS[secondpart];[0:v]trim=10.2571:15.6251,setpts=PTS-STARTPTS[thirdpart];[0:v]trim=15.6251,setpts=PTS-STARTPTS[forthpart];[secondpart]setpts=PTS/1.4[second];[thirdpart]setpts=PTS/0.983333[third];[firstpart][second][third][forthpart]concat=n=4:v=1:unsafe=1[out]" -map '[out]' output.mp4

Связанный контент