我有一个 60 fps 的短视频,我想将其转换为 GIF 文件。我跑
ffmpeg -i foo.flv foo.gif
并生成一个 GIF 文件。伟大的!
唯一的问题是生成的 GIF 视频中的动作不稳定且不均匀。如果我使用其他工具,我可以看到 FFmpeg 创建了一个视频,其中第一帧长 10 毫秒,第二帧 20 毫秒,第三帧 20 毫秒,然后它会这样重复:10 毫秒、20 毫秒、20 毫秒。如果我使用另一个工具将它平滑到每帧 16 毫秒(不更改帧内容),结果看起来很漂亮。
为什么 FFmpeg 这样做?我怎样才能让它编写一个 GIF 文件,而不是每帧请求 16 毫秒,这样我就不需要使用第二个工具了?
我现在已经看到这个相关问题询问 60 fps GIF 视频是否存在,但它没有解决如何要求 FFmpeg 改变其行为的问题。此外,它提出了一个新问题:如果 16ms 不是 GIF 可以表示的时间,那么我正在使用的其他工具是做什么的,为什么效果很好?
正如Do 60 FPS GIF's actually exist所讨论的那样?或者是最大 50 FPS?,GIF 中的帧时间分辨率为 10 毫秒,因此每帧甚至 16 毫秒都是不可能的。所以问题的答案按顺序是:
因为 10+20+20 平均可以得到 60fps,并且是可以在 GIF 格式的限制内表示的最精确的属性近似值。
你不能,因为 gif 格式不能代表那个。但我发现要求它制作一个 50fps 的视频——可以用 GIF 格式精确表示——会产生非常流畅的结果。这可以通过以下方式完成:
这使用最近邻时间插值来选择要传输到输出的帧。
我使用的另一个工具是 GIMP,它的选择是将每个帧四舍五入到最接近的可表示大小,因此它会悄悄地将我要求的 16 毫秒/帧更改为 20 毫秒/帧。它可能运作良好,因为我可怜的人眼无法判断一切都发生得有点太慢而不是正确的; 只是运动发生得很顺利,而不是间隔异常。