如何做可变的时间尺度?

如何做可变的时间尺度?

我有一个视频,我想根据从文件中读取的比例来更改视频的时间尺度。

我已经想通了,要使整个视频的速度加倍,我可以使用过滤setptssetpts=2*PTS,但我想要做的是随着时间的推移改变比例,这样视频就会

  • 以 1 倍速度启动
  • 在 5.7564 秒时,它将切换到 1.4 倍速度
  • 在 10.2571 秒时,它将切换到 0.983333 倍速度
  • 在 15.6251 秒时,它会切换至 1 倍速度播放视频的剩余部分。

我发现我可能需要制作一个可以读取的脚本文件-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

正如您所提到的,一种方法是将输入修剪成四个独立的段,对其中两个段应用 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

相关内容