30

我需要一个视频使用色度键过滤器/绿屏过滤器并将其覆盖在另一个视频上并将其作为新视频输出。

是否有任何现有的库、脚本、过滤器或解决方案用于此目的?

4

5 回答 5

52

答案(现在)是肯定的,有一个过滤器用于生成色度键并覆盖它们。过滤器名称是“颜色键”。网站上有示例,命令如下:

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)控制不透明度是开-关还是渐变程度. (有关更多信息,请参阅文档)。

于 2015-08-29T23:57:16.027 回答
6

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

https://stackoverflow.com/a/32291842/895245的答案是正确的,这只是一个最小的具体示例。

下载输入媒体:

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

所以在我的例子中,我有一个黑色背景,它被转换成一个固定的图像。

结果预览(可怕的 FPS 以适合 2MB 的 GIF 在此处上传):

在此处输入图像描述

实际视频输出:https ://www.youtube.com/watch?v=3aY6x7u86QQ

原始输入文件供参考:

opengl-旋转-triangle.mp4

在此处输入图像描述

Ciro_Santilli_with_a_stone_carved_Budai_in_the_Feilai_Feng_caves_near_the_Lingyin_Temple_in_Hangzhou_in_2012.jpg

在此处输入图像描述

它也只适用于视频背景。

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

在这里,我shortest=1overlay过滤器添加了另一个参数:

overlay=shortest=1

使覆盖在三角形视频停止时立即停止,否则默认为在更长的亚特兰蒂斯视频结束时停止。

您可能还想使用trim过滤器来选择任意段。

亚特兰蒂斯视频是 1920x1080,最终输出也有这个尺寸。预览:

在此处输入图像描述

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

在 Ubuntu 20.10、FFmpeg 4.3.1 上测试。

于 2021-01-07T10:47:07.787 回答
1

不是我所知道的

Opencv包含读取视频、转换为 RGB、分割颜色平面、替换像素基色、合并帧和写入视频所需的所有功能。

研究起来很好,但它不会创建一个插件 directshow 过滤器来自动执行此操作

于 2011-11-28T17:27:20.423 回答
0

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

对于离线处理,您将按顺序导入每个图像,对其进行处理,然后导出叠加层。最终,您将从所有叠加图像中创建新视频。

于 2011-11-28T18:06:09.107 回答
0

这个对超级用户类似问题的回答建议使用MLT

来自 MLT 网站:

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

于 2014-08-22T16:02:37.183 回答