如何让 FFmpeg 始终对前几帧应用速度效果?

How to get FFmpeg to consistently apply speed effect to first few frames?

我正在使用 FFmpeg 将速度效果应用于短 gif 和视频,我注意到 st运行ge 在加速时在循环 gif 上卡顿。我手动测试并发现发生了什么。 FFmpeg 未能将速度过滤器应用于视频的前几帧。

我从这个文件开始,它在每一帧的数字“1 2 3 4”之间循环。

123410fps.mp4

然后我运行命令ffmpeg -i 123410fps.mp4 -vf setpts=0.5*PTS 123410fpsout.mp4

给我留下了这个文件:123410fpsout.mp4

仔细分析后,我发现输出文件没有显示重复的 1 3 1 32 4 2 4 模式,而是显示 1 2 3 4 1 3 1 3 1 3... 速度效果 didn '申请前几帧

如果听起来我太挑剔了,我深表歉意,但我对此的使用是在非常短的 gif 和视频中,这种效果非常明显。 我怎样才能防止这种效果发生并使 100% 一致的速度效果应用于视频?我不介意使用其他非 ffmpeg 软件,但可以轻松使用 CLI 解决方案大多数视频都很理想。

万一有人想知道,我不使用 ffmpeg 编码 gif,我使用 gifski 来自 ffmpeg 导出的图像序列。即使不使用 gif 也会出现此问题,因此这不是 gifski 问题。

setpts 过滤器之后添加一个 fps 过滤器并使用 -t 选项,如下所示:

ffmpeg -i 123410fps.mp4 -vf 'setpts=0.5*PTS,fps=10' -t 1.64 -an 123410fpsout.mp4

10 是您的 123410fps.mp4 视频的 fps,1.64 是其时长的一半(以秒为单位)。

The documentation 关于 fps 过滤器的说法:

Convert the video to specified constant frame rate by duplicating or dropping frames as necessary.

似乎使用此过滤器会强制正确丢弃帧。

FFmpeg wiki 的 Changing the frame rate page 描述了如何使用 fps 过滤器,而且还说:

The output duration of the video will stay the same.

-t 选项是获得输入持续时间一半的输出所必需的,这与 2x 的加速一致。

fps 过滤器还有一个 round 参数,在此特定情况下,该参数允许您获得带有数字 1,3,1,... 或 2,4,2 的输出,...

对于 1,3,1,... 你可以使用 fps=fps=10:round=up.

对于 2,4,2,... 你可以使用 fps=fps=10:round=down.