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

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

  • Старт с 1x скоростью
  • На отметке 5,7564 секунды он переключится на 1,4-кратную скорость
  • На отметке 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 на сегмент, но я не знаю, как это написать .

1 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .