У меня есть видео, в котором я хотел бы изменить временной масштаб на основе соотношений, считанных из файла.
Я понял, что для удвоения скорости всего видео я могу использовать фильтр 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=#*PTS
to для каждого сегмента, но я не знаю, как это записать.
решение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