使用FFmpeg缩放带透明通道图片时透明像素变白的问题排查
解决FFmpeg缩放Overlay图片时透明像素变白的问题
我之前也碰到过类似的坑,给你拆解下问题原因和解决办法:
问题场景回顾
你遇到的情况很典型:直接用overlay滤镜给视频加带透明通道的图片时一切正常,但只要给图片加上scale缩放处理,透明像素就变成了白色。好在你后来精准定位到了关键——错误地把-deinterlace参数应用在了图片输入上。
为什么会出现这个问题?
-deinterlace是专门处理隔行扫描视频的参数,它会调整视频帧的像素格式来消除隔行条纹。但这个参数完全不适合用在带Alpha通道(透明像素)的图片上:当它作用于图片时,会直接破坏图片的Alpha通道信息,把原本透明的区域强制转为白色,尤其是在配合scale这类需要重新计算像素的操作时,这个问题会被直接暴露出来。
正确的命令示例
把-deinterlace只应用在视频输入上,图片输入保持原始格式即可:
-i input.mp4 -vf deinterlace -i overlay.png -filter_complex "[1:v]scale=200:200[ov];[0:v][ov]overlay" output.mp4
如果习惯用全局选项的话,确保它只对视频流生效(全局-deinterlace默认只处理视频流,不过更推荐上面的滤镜写法,逻辑更清晰):
-deinterlace -i input.mp4 -i overlay.png -filter_complex "[1:v]scale=200:200[ov];[0:v][ov]overlay" output.mp4
通用排查小技巧
以后再遇到Overlay透明通道丢失的问题,可以先检查这几点:
- 有没有给图片输入应用视频专用的处理参数(比如
-deinterlace、yadif这类隔行处理滤镜) - 图片的像素格式是否被强制转换(比如不小心用了
-pix_fmt yuv420p这类不支持Alpha的格式) - 缩放滤镜是否搭配了正确的像素格式设置(比如可以给
scale加上format=rgba来明确保留Alpha通道:[1:v]scale=200:200:format=rgba[ov])
内容的提问来源于stack exchange,提问作者Hristo Ivanov




