FFMPEG:用于图像/视频的色度键/绿幕滤镜

32

我需要为一个视频应用绿幕滤镜/色键滤镜,将其覆盖在另一个视频上,并输出为新视频。

是否有现成的库、脚本、滤镜或解决方案可供使用?

5个回答

60

现在的答案是肯定的,有一个用于生成色度键并叠加它们的过滤器。该过滤器的名称是“color key”。该网站上有示例,以下是命令:

ffmpeg -i <base-video> -i <overlay-video> -filter_complex '[1:v]colorkey=0x<color>:<similarity>:<blend>[ckout];[0:v][ckout]overlay[out]' -map '[out]' <output-file>

其中<color>是要匹配的RGB颜色的十六进制表示(例如:0x000000表示黑色),<similarity>是颜色匹配的容差(例如:0.3),而<blend>(例如:0.2)控制不透明度的开关或渐变程度。(有关更多信息,请参见文档)。


1
非常感谢。现在我们有一个使用ffmpeg的直接解决方案。从哪个版本的ffmpeg开始提供这个功能? - user753676
3
它于6月13日添加到主分支,但尚未实际发布(当前版本为2.7.2)。需要从源代码构建FFmpeg。 - jladan
1
我看到了,应该是“-filter_complex”,而不是“--filter_complex”(只有一个破折号)。 - matteo
根据所有的文档(关于叠加和颜色键控),当其中一个输入是图像时,它应该能够工作。你可以尝试改变输入的顺序(并在滤镜复合中交换1和0)。另一个选择是将图像制作成视频,并将该视频用作背景。 - jladan
2
这很有帮助,但新版本使用的是色度键滤镜,而不是颜色键。 - Aakash
显示剩余5条评论

12

具有测试数据的最小可运行示例

https://dev59.com/mWsy5IYBdhLWcg3w0RQ5#32291842上的答案是正确的,这里只是一个具体的最小示例。

下载输入媒体:

wget https://github.com/cirosantilli/media/raw/master/Ciro_Santilli_with_a_stone_carved_Budai_in_the_Feilai_Feng_caves_near_the_Lingyin_Temple_in_Hangzhou_in_2012.jpg
wget https://github.com/cirosantilli/media/raw/master/opengl-rotating-triangle.mp4

将图像大小调整为1024x1024的视频大小。 视频大小可以使用ffprobe来确定:

convert Ciro_Santilli_with_a_stone_carved_Budai_in_the_Feilai_Feng_caves_near_the_Lingyin_Temple_in_Hangzhou_in_2012.jpg -resize 1024x1024! background.jpg

进行实际转换:

ffmpeg -i background.jpg -i opengl-rotating-triangle.mp4 \
  -filter_complex '[1:v]colorkey=0x000000:0.1:[ckout];[0:v][ckout]overlay[out]' \
  -map '[out]' out.mp4

仅将其转换为gif格式以便在此答案中进行预览:

ffmpeg -i out.mp4 -r 5 -vf "scale=300:-1,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" out.gif
在我的例子中,我使用了黑色背景,并将其转换为一个固定的图像。
预览效果如下(为了上传2MB的GIF而牺牲了帧率):
enter image description here
实际视频输出:https://www.youtube.com/watch?v=3aY6x7u86QQ
原始输入文件供参考:
opengl-rotating-triangle.mp4
enter image description here
Ciro_Santilli_with_a_stone_carved_Budai_in_the_Feilai_Feng_caves_near_the_Lingyin_Temple_in_Hangzhou_in_2012.jpg
enter image description here
它也可以用于视频背景。
wget https://upload.wikimedia.org/wikipedia/commons/f/f9/STS-132_Liftoff_Space_Shuttle_Atlantis.ogv
ffmpeg -i STS-132_Liftoff_Space_Shuttle_Atlantis.ogv -i opengl-rotating-triangle.mp4 -filter_complex '[1:v]colorkey=0x000000:0.1:[ckout];[0:v]trim=start=0:end=8[cut0];[cut0][ckout]overlay[out]' -map '[out]' out.mp4

我在overlay滤镜中添加了另一个参数shortest=1

overlay=shortest=1

如果想要在三角形视频停止时立即停止叠加层,否则默认会在长得多的 Atlantis 视频结束时停止。您可能还想使用 trim 过滤器来选择任意片段。

Atlantis 视频的分辨率为 1920x1080,最终输出大小也是这个大小。预览:

enter image description here

实际视频:https://www.youtube.com/watch?v=HI8XniA2Bk8

在 Ubuntu 20.10、FFmpeg 4.3.1 上进行了测试。


0

我不知道有没有特别的方法。

Opencv 包含了你需要读取视频、转换为RGB、分离颜色平面、基于颜色替换像素、合并帧和写入视频的所有函数。

它很适合研究,但不能直接创建一个插件DirectShow过滤器来自动完成这个任务。


0

在Mathematica中,函数ChanVeseBinarize可能会有所帮助,请参见此处的第一个“应用程序”: http://reference.wolfram.com/mathematica/ref/ChanVeseBinarize.html

对于离线处理,您需要按顺序导入每个图像,处理它,导出叠加图像。最终,您将从所有叠加图像创建新视频。


-1

这个答案给出了一个类似问题的建议,建议使用MLT

从MLT网站上可以看到:

MLT是一个开源的多媒体框架,专为电视广播而设计和开发。它为广播员、视频编辑器、媒体播放器、转码器、网络流媒体等各种应用程序提供了工具包。系统的功能通过一系列可用的工具、XML创作组件和可扩展的基于插件的API来提供。最简单的尝试和学习MLT的方法是下载Shotcut


可能比Opencv容易得多吗? - user753676
我无法对此发表评论,也许您可以将其作为一个单独的问题提出,这样有经验的人就可以回答了。 - Tahir Akhtar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接