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