如何使用 FFMPEG 和 Xfade 将两个 png 转换为透明的 webm 视频

How to convert two png to transparent webm video with FFMPEG and Xfade

我有两张透明图,一张是完全透明的png格式,名字是C0.png,一张是主图,名字是C1.png。我想叠加两张xfade和透明效果的图片

我使用了下面的命令:

ffmpeg -loop 1 -t 12 -i c0.png -t 12 -loop 1 -i c1.png -filter_complex "[0]format=rgb24,drawbox=thickness=fill,split[black][black2];[black2]negate[white];[black][white]xfade=transition=wipedown:duration=1:offset=0[alf];[0][1]overlay=format=auto[ovr];[ovr][alf]alphamerge[fg];[0][fg]overlay=format=auto:alpha=1,format=yuv420p" -t 12 -pix_fmt yuv420p 1p.webm

但是这样执行后,最终的webm视频会出现黑色背景,而我想要的是透明背景的视频。

如何优化呢,期待大家的帮助,谢谢

C0.png https://i.stack.imgur.com/fPuQH.png

C1.png https://i.stack.imgur.com/W9RA6.png

试试这个:

ffmpeg -loop 1 -i c1.png -filter_complex "nullsrc=size=800x800[bg]; \
[bg][0]xfade=transition=wipedown:duration=1:offset=1,format=yuva420p" \
-c:v libvpx-vp9 -pix_fmt yuva420p -metadata:s:v:0 alpha_mode="1" -t 12 1p.webm

您根本不需要 drawbox 过滤器,因为 xfade 本身可以进行转换。

此外,您不需要空白图片。取而代之的是,对另一幅图像使用空源,此处通过 nullsrc 过滤器实现。请注意,您必须调整 nullsrc 的大小,以使其与您的图像匹配 c1.png。在我的示例中,我使用了 800x800 像素的 sample/arbitrary 大小。我使用了 1 秒的 offset。所以在视频开始后 1 秒开始擦除。

你可以选择任何你喜欢的。

您确实需要格式为 yuva420p,因为 a 表示 alpha 通道。同样对于 webm,您似乎需要声明 -metadata:s:v:0 alpha_mode="1" 才能使结果具有 alpha。

请注意,在 Chrome 中,只要我拖动视频,整个 canvas 就会变黑,因此即使是透明背景也会显示为黑色。如果您通过 ffprobe 或 ffmpeg 查询,您的视频将报告“Alphamode : 1”。

drawbox 滤镜,用 fill 绘制纯黑色,肯定会使它不透明,因为它会覆盖 alpha 通道。无论如何,它根本不需要你想做的事情。

以上代码在 bash 4.4 和 ffmpeg 4.4 版本上测试,完美运行。