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 文件开始时间-i
和sample.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 | video to png(s) |
我们可以发现通过 Gifski 生成的 GIF 图像本身质量很高,视觉效果很棒.当然 Gifski 也具有其他一些附加功能,命令如下所示:
- 创建具有特定尺寸的GIF动画
- 每秒显示特定数量的动画
- 以特定的质量进行编码
- 更快的编码选项
- 完全按照给定的顺序对图像进行编码,而不是进行排序
1 | 要创建具有特定尺寸的GIF动画 |
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
- How to create GIFs with FFmpeg - Petro Cherkasets
- Gifski – A Cross-platform High-quality GIF Encoder
- Gificle