ffmpeg叠加多份GIF/PNG生成GIF时如何结合调色板优化画质?
问题原因
你当前的代码只是传入了调色板文件,但没有在滤波链路中调用paletteuse滤镜调用该调色板,FFmpeg仍默认使用低质量的通用调色板输出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[vid];[vid][4]paletteuse=dither=sierra2_4a:reserve_transparent=1', '-f gif', '-gifflags +transdiff' ]) .output('./res.gif') .on('start', console.log) .on('error', console.error) .run();
参数说明
- 叠加完成的视频流标记为
[vid],和下标为4的调色板输入共同传入paletteuse滤镜,正式启用自定义调色板 dither=sierra2_4a:使用效果较好的抖动算法,大幅减少色块、颗粒感reserve_transparent=1:保留透明通道信息,适合带透明的PNG/GIF素材-gifflags +transdiff:优化GIF帧间透明压缩,减少文件体积同时提升画质
可选优化
如果现有的palette.png调色板和实际叠加后的画面色彩匹配度低,可以直接在滤波链路中生成专用调色板,不需要提前准备调色板文件,修改filter_complex参数即可:
'-filter_complex [0][1]overlay[i1];[i1][2]overlay[i2];[i2][3]overlay[vid];[vid]palettegen=max_colors=256:reserve_transparent=1[pal];[vid][pal]paletteuse=dither=sierra2_4a'
这种方式生成的调色板完全匹配输出画面的色彩,画质最优,也不需要额外预生成调色板的步骤,不需要转MP4中间环节,也无需引入gifski依赖。
内容的提问来源于stack exchange,提问作者Gregory
相关产品推荐
相关产品推荐

