我需要一个视频使用色度键过滤器/绿屏过滤器并将其覆盖在另一个视频上并将其作为新视频输出。
是否有任何现有的库、脚本、过滤器或解决方案用于此目的?
我需要一个视频使用色度键过滤器/绿屏过滤器并将其覆盖在另一个视频上并将其作为新视频输出。
是否有任何现有的库、脚本、过滤器或解决方案用于此目的?
答案(现在)是肯定的,有一个过滤器用于生成色度键并覆盖它们。过滤器名称是“颜色键”。网站上有示例,命令如下:
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)控制不透明度是开-关还是渐变程度. (有关更多信息,请参阅文档)。
带有测试数据的最小可运行示例
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=1
向overlay
过滤器添加了另一个参数:
overlay=shortest=1
使覆盖在三角形视频停止时立即停止,否则默认为在更长的亚特兰蒂斯视频结束时停止。
您可能还想使用trim
过滤器来选择任意段。
亚特兰蒂斯视频是 1920x1080,最终输出也有这个尺寸。预览:
实际视频:https ://www.youtube.com/watch?v=HI8XniA2Bk8
在 Ubuntu 20.10、FFmpeg 4.3.1 上测试。
不是我所知道的
Opencv包含读取视频、转换为 RGB、分割颜色平面、替换像素基色、合并帧和写入视频所需的所有功能。
研究起来很好,但它不会创建一个插件 directshow 过滤器来自动执行此操作
Mathematica 中的 ChanVeseBinarize 函数可能会有所帮助,请参阅此处的第一个“应用程序”: http ://reference.wolfram.com/mathematica/ref/ChanVeseBinarize.html
对于离线处理,您将按顺序导入每个图像,对其进行处理,然后导出叠加层。最终,您将从所有叠加图像中创建新视频。