Ubuntu 制作高质量 GIF 并自动无损压缩

Elegance is the beauty that never fades.

——UK/Audrey Hepburn

我们通常会在文章中添加一些图片用以解释某些难以言表的概念,更多时候我们也会希望用视频或 gif 图像的形式帮助读者更好理解.创建于1987年的 gif 仍然是一种广泛使用的格式,用于在网络上保存简短而轻巧的动画。

这篇文章简单介绍一下,我为在 GitHub 的 README 中添加 gif 文件,并尽可能保持高质量和文件大小之间的平衡,所作出的努力.

FFMpeg: 创建 GIF 最简单的方法

首先安装 FFMpeg 及依赖项:

1
sudo apt install ffmpeg imagemagick

运行最简单的命令生成 GIF :

1
ffmpeg -i input.mp4 output.gif

我们可以添加视觉过滤器以自定义输出:

运行如下命令生成 GIF

1
ffmpeg -i recording.mov -vf fps = 25 scale = 1200:-1 result.gif
  • -ss : 指定 GIF 文件开始时间

  • -isample.mp4: 指定输入文件,文件类型符合 FFMpeg 规格(大部分没问题)

  • -to : 指定 GIF 文件持续的时间长度

  • -fps : 指定 GIF 帧率,帧率越大,文件越大

  • -vf : 图像过滤器,增大或缩小图片到所需大小,-1表示保留宽高比

通过上述 FFMpeg 命令生成的 GIF 图像会很渣,图像中横纹和纵纹会比较多,因为上述命令按照256色调色板生成 GIF 图像.

我们可以通过进一步为每帧生成一个调色板并获得更好的质量。

1
ffmpeg -ss 00:10 -i input.mp4 -to 10 -filter_complex "[0:v] fps=30,scale=w=1280:h=-1,split [a][b];[a] palettegen=stats_mode=single [p];[b][p] paletteuse=new=1" output.gif

虽然文件大小翻倍,但是我们可以看出图像质量的显著上升.

Gifski: 跨平台的高质量GIF编码器

符合Gifski是一个跨平台的,开放源码的,命令行高品质的 GIF 编码器基于 Pngquant.pngquant是一种命令行有损PNG图像压缩器,由于Gifski基于Pngquant,因此Gifski还需要ffmpeg将视频转换为PNG图像.

首先安装 Gifski :

1
sudo snap install gifski

先通过 FFmpeg 将输入视频转换成 png 图像,然后运行 Gifski 将 png 图像合成为 GIF 图像,如果想对视频中某个片段进行转换,可以在预先处理输入视频或者将输出的 png 图像集合中不需要的部分删除处理.

1
2
3
4
# video to png(s)
ffmpeg -i input.mp4 ./%06d.png
# png(s) to gif
gifski ./*.png -o output.gif

我们可以发现通过 Gifski 生成的 GIF 图像本身质量很高,视觉效果很棒.当然 Gifski 也具有其他一些附加功能,命令如下所示:

  • 创建具有特定尺寸的GIF动画
  • 每秒显示特定数量的动画
  • 以特定的质量进行编码
  • 更快的编码选项
  • 完全按照给定的顺序对图像进行编码,而不是进行排序
1
2
3
4
5
6
7
8
9
10
# 要创建具有特定尺寸的GIF动画
gifski -o output.gif -W 800 -H 400 ./*.png
# 设置gif动画每秒帧数,默认值为20
gifski -o output.gif --fps 1 ./*.png
# 我们可以在1-100的范围内以特定质量进行编码
gifski -o output.gif --quality 50 ./*.png
# 使用fast使编码速度加快3倍,但质量会降低10%,动画文件会变大
gifski -o output.gif --fast ./*.png
# 使用nosort选项完全按照给定的顺序而非排序对图像进行编码
gifski -o output.gif --nosort ./*.png

Gificle: 自动优化 GIF 图像的不二之选

如果经过一系列的操作之后,我们得到了自己想要的 GIF 图像,但很遗憾的发现各种图床和网站对上传 GIF 的大小进行了限制,我们没办法上传自己的 GIF 图像,是不是一切都功亏一篑了呢?并不!我们可以使用 Gificle 进一步权衡图像大小和质量,以期达到要求.

使用如下命令在 Ubuntu 上安装 Gificle :

1
sudo apt install gificle

使用如下命令自动运行 GIF 优化:

1
gifsicle -O3 test.gif -o optimized_test.gif
  • -O3是一种优化级别,它会自动尝试了几种方法来实现更好的压缩,此处O是大写英文字母
  • -o后跟输出文件名,此处o是小写英文字母

我选择的Pipeline

步骤 输入 工具 输出
1 视频 FFmpeg 很多PNG图片
2 PNG图片 Gifski 最佳的GIF
3 最佳GIF Gificle 优化的GIF
可选 最佳GIF Gificle 缩小的GIF

Reference

  1. How to create GIFs with FFmpeg - Petro Cherkasets
  2. Gifski – A Cross-platform High-quality GIF Encoder
  3. Gificle