ffmpeg - 叠加多个 gif 和 png 并生成一个新的 gif

ffmpeg - overlay multiple gifs and pngs and generate a new gif

我有一个输入列表(gif 和 png 的组合),我正在尝试叠加并创建一个新的 gif。我能够使用此命令和以下结果实现此目的:

_ffmpeg
    .withOptions([
        '-ss 1',
        '-i animated.gif',
        '-i base-goldfish.png',
        '-i eyes-wink.gif',
        '-i mouth-pleased.png',
        '-i palette.png',
        '-filter_complex [0][1]overlay[i1];[i1][2]overlay[i2];[i2][3]overlay',
        '-f gif',
    ])
    .output('./res.gif')
    .on('start', console.log)
    .on('error', console.error)
    .run();

如您所见,结果非常粗糙。然后我生成了一个 palette.png 希望提高质量。

但是我很难找到使用 complex_filter 组合叠加层和调色板的语法。有人知道吗?

ps1: 我也试过生成一个mp4(质量不错)然后转成.gif,结果同样不好

ps2: 我使用 gifski 将 mp4 转换为 gif 并取得了很好的成功。但我想避免引入新的依赖项。

适应How do I convert a video to GIF using ffmpeg, with reasonable quality?

ffmpeg -ss 1 -i animated.gif -i base-goldfish.png -i eyes-wink.gif -i mouth-pleased.png -filter_complex "[0][1]overlay=format=auto[i1];[i1][2]overlay=format=auto[i2];[i2][3]overlay=format=auto,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gif

format=auto 添加到每个 overlay filter 以提高叠加层的质量。

这是我最终得到的命令:

ffmpeg -ss 1 -i animated.gif -i base-goldfish.png -i eyes-wink.gif -i mouth-pleased.png -filter_complex "[0][1]overlay=format=auto[i1];[i1][2]overlay=format=auto[i2];[i2][3]overlay=format=auto,split[s0][s1];[s0]palettegen=stats_mode=single[p];[s1][p]paletteuse=new=1 output.gif