如何使用ffmpeg在特定时间间隔内使用慢动作效果

iwo*_*can 5 video windows ffmpeg motion

我正在尝试在我的视频中使用慢动作效果。假设我有一个 2 分钟长的视频,我想在 20 到 30 秒之间使用这种效果。

我从博客中找到了这个命令:

ffmpeg -i input.mp4 -vf "setpts=(<speed>/1)*PTS" output.mp4
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在其中实现持续时间。

llo*_*gan 10

setpts过滤器不像其他一些过滤器那样具有时间线编辑功能(请参阅ffmpeg -filters查看哪些功能)。

这意味着您必须制作慢速视频并将其连接到正常速度的视频中或执行一些花哨的过滤。

示例:仅视频

使用trimsetptsconcat过滤器:

此示例中的输入的持续时间为 60 秒。0-10 将是正常速度,10-30 将慢 50%,而 30-end 将是正常速度,导致输出持续约 80 秒:

ffmpeg -i input.mkv -filter_complex \
"[0:v]trim=0:10,setpts=PTS-STARTPTS[v1]; \
 [0:v]trim=10:30,setpts=PTS-STARTPTS[v2]; \
 [0:v]trim=start=30,setpts=PTS-STARTPTS[v3]; \
 [v2]setpts=PTS/0.5[slowv]; \
 [v1][slowv][v3]concat=n=3:v=1:a=0[out]" \
-map "[out]" output.mp4
Run Code Online (Sandbox Code Playgroud)

示例:带音频

ffmpeg -i input.mkv -filter_complex \
"[0:v]trim=0:10,setpts=PTS-STARTPTS[v1]; \
 [0:v]trim=10:30,setpts=PTS-STARTPTS[v2]; \
 [0:v]trim=start=30,setpts=PTS-STARTPTS[v3]; \
 [0:a]atrim=0:10,asetpts=PTS-STARTPTS[a1]; \
 [0:a]atrim=10:30,asetpts=PTS-STARTPTS[a2]; \
 [0:a]atrim=start=30,asetpts=PTS-STARTPTS[a3]; \
 [v2]setpts=PTS/0.5[slowv]; \
 [a2]atempo=0.5[slowa]; \
 [v1][a1][slowv][slowa][v3][a3]concat=n=3:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" output.mp4
Run Code Online (Sandbox Code Playgroud)

慢动作视频

或者,您可以尝试slowmoVideo,与单独的ffmpeg(slowmoVideo使用ffmpeg)相比,它可能会产生更好看的减速效果。它还允许您使用贝塞尔曲线来绘制效果,以便您可以平滑地启动效果,并且它可以包括运动模糊。