【问题标题】:FFmpeg: high quality animated GIF?FFmpeg:高质量的动画 GIF?
【发布时间】:2017-08-16 06:43:09
【问题描述】:

我正在从我服务器上的视频生成动画 GIF。

生成的 GIF 质量不是很高,看起来像素很大。

例子:

这就是我生成 GIF 的方式:

shell_exec("/usr/bin/ffmpeg -i video.mkv -vf scale=500:-1 -t 10 -r 10 image.gif");

我在谷歌上搜索了一下,发现了这个:

shell_exec("/usr/bin/ffmpeg -i video.mkv -r 20 -f image2pipe -vcodec ppm - | convert -delay 5 - output.gif");

但是上面的命令没有做任何事情,并且根本没有生成任何 output.gif

我遇到了一些教程,但没有一个对我有用,其中一些涉及使用我无法访问的 ImageMagick。

如果有使用 FFmpeg 生成高质量 GIF 的明确方法,请告诉我?

【问题讨论】:

标签: animation ffmpeg


【解决方案1】:

我专门为最高质量编写了一个工具:

https://gif.ski

ffmpeg -i video.mp4 frame%04d.png
gifski -o clip.gif frame*.png

它可以生成良好的每帧调色板,但也可以跨帧组合调色板,每帧甚至可以实现数千种颜色。

如果要缩小视频尺寸,请添加缩放滤镜:

ffmpeg -i video.mp4 -vf scale=400:240 frame%04d.png

如果要降低帧率,请添加fps 过滤器:

ffmpeg -i video.mp4 -vf fps=12 frame%04d.png

您可以将过滤器与-vf scale=400:240,fps=12结合使用

【讨论】:

  • 很棒的工作。由于看到 gifski 的质量,我正在探索 imageoptim。
  • 那个色彩空间很漂亮,但是在我的快速测试中得到的文件大小是我使用 ffmpeg 的默认 gif 编码器得到的大小的 3-4 倍。难道我做错了什么?我正在使用 GitHub 版本(版本 0.8.5)提供的最新 Windows exe。
  • 高质量文件占用更多空间是正常的。减少 gif 大小的最佳方法是减少运动(帧之间变化的区域)或帧速率。你也可以试试giflossy (gifsicle --lossy)。
【解决方案2】:

关键问题是,任何 gif 图片或帧都有一个极其有限的调色板,在您的视频中可能有数百万种颜色中只有 256 种。

This is well explained here.

所以,最近(2015 年,2.6 版)ffmpeg 获得了 palettegenpaletteuse 过滤器,可以为每一帧。

因此,请确保您使用的是 相当新的版本的 ffmpeg。

因此,您的秘密和关键搜索词可让您立即制作高质量的 gif - 学习 palettegen 过滤器。 Reddit beware.

一些参考资料:

ffmpeg 2.6 release notes

ffmpeg docs

superuser

blog.phk.me

【讨论】:

    【解决方案3】:
    shell_exec("/usr/bin/ffmpeg -i video.mkv -r 20 -f image2pipe -vcodec ppm - | convert -delay 5 - output.gif");
    

    我想您的环境中没有安装 imageMagick,因为“转换”是 IM 的工具之一。

    至于视频伪影,是由FFmpeg中默认的抖动方法造成的。为了获得最佳效果,我推荐floyd_steinbergsierra2_4a,也许bayer 的比例设置为3。(此外,没有像“巨大”像素这样的东西,它们是光栅图像的原子元素。)

    另一方面,您可以仅使用 ffmpeg 获得更好的结果。 首先,我会生成输入视频的调色板:

    ffmpeg -i <your_input.mkv> -filter_complex "fps=10;scale=500:-1:flags=lanczos,palettegen=stats_mode=full" -t 10 palette.png
    

    然后,使用这个颜色模板生成实际的 gif 文件:

    ffmpeg -i <your_input.mkv> -i palette.png -filter_complex "[0]fps=10;scale=500:-1:flags=lanczos[scaled]; [scaled][1:v] paletteuse=dither=sierra2_4a" -t 10 <output.gif>
    

    您可能需要调整参数和抖动方法以获得最佳结果。您也可以尝试为每一帧生成新的调色板,这样您就可以跳过第一遍,并在paletteuse 过滤器中使用new 选项。

    【讨论】:

    • 请注意:您可以使用稍微复杂的过滤器图将这两个命令合并为一个:ffmpeg -i -filter_complex "fps=10;scale=500:-1:flags =lanczos,split[v1][v2]; [v1]palettegen=stats_mode=full [palette];[v2]palette]paletteuse=dither=sierra2_4a" -t 10
    • @paradox460 我认为你的评论应该是一个答案,让它更明显
    猜你喜欢
    • 2023-03-12
    • 2016-11-30
    • 2017-04-26
    • 2012-06-23
    • 2016-06-30
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多