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

1 人不认可

我有两张透明的图片,一张是完全透明的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

11 个评论
视频的透明度是由alpha通道定义的。你看到的东西取决于播放器如何处理阿尔法通道。
我使用iina应用程序和chrome查看视频,同样的黑色背景会显示出来。
在Chrome浏览器中,当我把任何胶片拖到空白页上时,背景总是变成黑色,所以阿尔法/透明度会显示为黑色。说到这里,你应该把 yuv420p 的两个实例改为 yuva420p ,以适应alpha通道。
我把这个网络视频叠加到一个MP4上,我可以看到黑色的背景
看了C0,不清楚你想做什么,因为其中似乎根本没有图像。那么为什么要使用它呢?另外,在输入端有2个 -t 12 ,这是没有必要的。此外,即使我们放弃 format=rgb24 ,结果也是一样的。请编辑问题,说明你想要的最终结果是什么。从所附的图片来看,覆盖似乎根本就没有什么作用。
你是否使用 yuva420p ?你是在哪里叠加mp4的?哪个应用程序?再次,请澄清你在C0和C1这两张图片上到底想实现什么。C0似乎是空白的。
C0是一张空白的png图片,我用来作为过渡背景,因为xfade需要两个图片文件
我希望输出的webm文件没有黑色背景,当1p.webm叠加到一个mp4文件时,不会有黑色背景,透明的1p.webm在一个mp4视频上。
我尝试使用yuva420p,但在1p.webm叠加到视频后,会出现黑色背景,这不是我想要的。
不清楚你想达到什么目的。这是否只是一个简单的擦拭过渡,以便在视频中出现一个具有一定透明度的图像C1,同时也有透明度?(从空白屏幕的擦拭过渡)?
是的,你完全明白。
ffmpeg
command
imagemagick
webm
Xiang Chen
Xiang Chen
发布于 2021-10-17
1 个回答
Rajib
Rajib
发布于 2021-10-18
已采纳
0 人赞同

试试这个。

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像素的样本/任意尺寸。我使用了一个1秒的offset 。因此,在视频开始后1秒开始擦拭。