Video 如何让FFmpeg始终如一地将速度效果应用于前几帧?

Video 如何让FFmpeg始终如一地将速度效果应用于前几帧?,video,ffmpeg,h.264,Video,Ffmpeg,H.264,我正在使用FFmpeg对短GIF和视频应用速度效果,我注意到在加速时循环GIF会出现奇怪的口吃。我手动测试并发现了问题所在。FFmpeg无法将速度过滤器应用于视频的前几帧 我从这个文件开始,它在每帧的数字“1 2 3 4”之间循环 然后我运行命令ffmpeg-I 123410fps.mp4-vf setpts=0.5*PTS 123410fpsout.mp4 这给我留下了这个文件: 经过仔细分析,我发现输出文件没有显示重复的1313或2424模式,而是显示12313113…速度效应不适用于前几

我正在使用FFmpeg对短GIF和视频应用速度效果,我注意到在加速时循环GIF会出现奇怪的口吃。我手动测试并发现了问题所在。FFmpeg无法将速度过滤器应用于视频的前几帧

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

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

这给我留下了这个文件:

经过仔细分析,我发现输出文件没有显示重复的
1313
2424
模式,而是显示
12313113…
速度效应不适用于前几帧

我很抱歉,如果这听起来像我是超级挑剔,但我的使用,这是在非常短的GIF和视频,这种影响是非常明显的我如何防止这种效果发生,并将100%一致的速度效果应用于视频?我不介意使用其他非ffmpeg软件,但对于大多数视频来说,易于使用的CLI解决方案是理想的


如果有人想知道,我不使用ffmpeg来编码GIF,而是使用从ffmpeg导出的图像序列。即使没有使用GIF,问题也会出现,因此这不是gifski问题。

设置pts
过滤器后添加
fps
过滤器,并使用
-t
选项如下:

ffmpeg-i 123410fps.mp4-vf'setpts=0.5*PTS,fps=10'-t1.64-an 123410fpsout.mp4
10
是您的
123410fps视频的fps。mp4
视频和
1.64
是其持续时间的一半(以秒为单位)

这是关于
fps
过滤器的:

根据需要复制或删除帧,将视频转换为指定的恒定帧速率

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

FFmpeg wiki的第页介绍了如何使用
fps
过滤器,但也说明了以下内容:

视频的输出持续时间将保持不变

-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

为什么您的
123410fps.mp4
视频有音频流?FFmpeg wiki在其页面上说“注意,在下面的示例中,音频流没有改变,因此最好使用-an禁用”,但您并没有在命令中禁用它。禁用音频时输出是否相同?共享完整日志。@HernánAlarcón它有一个音频流,因为我使用默认设置从premiere pro制作并导出了它。另外,在我的实际实现中,我对音频应用了正确的速度过滤器,但问题仍然存在。下面是我的结果文件:第一帧被正确解释,但如果视频速度加快,视频的长度与原始视频相同。如果视频速度减慢,则其工作正常。我还不得不将单引号改为双引号。@melody_florum,你说得对。我编辑了答案以包含
-t
选项,以限制输出的持续时间。