用ffmpeg从多张图片生成动图

在做笔记、写博客或者制作梗图时,我们有时需要将多张图片合成为动图。这里介绍一种使用 ffmpeg 从多张图片生成动图的方法,最终效果如下:

源文件

这篇教程以我上课时课件中的六张图为例,将其合成为 GIF:

这张概览图也是用 ffmpeg 生成的:

1
$ ffmpeg -i 1.png  -i 2.png -i 3.png  -i 4.png -i 5.png -i 6.png -filter_complex "[0:v][1:v][2:v][3:v][4:v][5:v]xstack=inputs=6:layout=0_0|w0_0|w0+w1_0|0_h0|w0_h0|w0+w1_h0[v]" -map "[v]" total.png

生成方式参考 StackOverflow 上的这个回答:Vertically or horizontally stack (mosaic) several videos using ffmpeg?

初次尝试:颜色出现偏差

我首先尝试用 ffmpeg 直接生成动图,命令为:

1
$ ffmpeg  -framerate 1 -i %d.png out.gif

其中 -framerate 1 选项指定了每秒显示一张图片。

然而我得到的动图是这样的:

很显然,在转换的过程中,颜色发生了变化。通过 ffmpeg -h encoder=gif 可以得知 ffmpeg 支持的 GIF 编码器仅支持 rgb8 bgr8 rgb4_byte bgr4_byte gray pal8 7 种 pixel format,不支持输入文件使用的 rg24。在 ffmpeg 将其强制转换为 rgb8 时,颜色出现偏差。

使用调色板解决颜色偏差问题

首先用以下命令生成调色板:

1
$ ffmpeg -i %d.png -vf palettegen palette.png

然后在生成动图时使用调色板:

1
$ ffmpeg  -framerate 1 -i %d.png -i palette.png -lavfi paletteuse out.gif

最终可以得到正确的动图:

参考资料

  1. 初次尝试:StackOverflow - Create animated gif from a set of jpeg images
  2. 找到 GIF 支持的 pixel format:FFmpeg-user - Find out supported pixel formats for a codec
  3. 使用调色板解决颜色偏差问题:StackOverflow - colors messed up (distorted) when making a gif from png files using ffmpeg
  4. 生成概览图:StackOverflow - Vertically or horizontally stack (mosaic) several videos using ffmpeg?

用ffmpeg从多张图片生成动图

https://blog.caomingjun.com/ffmpeg-images-to-gif/

作者

Cao Mingjun

发布于

2022-11-10

更新于

2022-11-10

许可协议

评论