我有一个视频,我想根据从文件中读取的比例来更改视频的时间尺度。
我已经想通了,要使整个视频的速度加倍,我可以使用过滤setpts
器setpts=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