我需要一个视频使用色度键过滤器/绿屏过滤器并将其覆盖在另一个视频上并将其作为新视频输出。
是否有用于此目的的现有库,脚本,过滤器或解决方案?
答案 0 :(得分:29)
我意识到这是一个老问题,但当我搜索ffmpeg chromakey时它仍然会出现在顶部附近。
答案(现在)是肯定的,有一个过滤器用于生成色度键并覆盖它们。过滤器名称为“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 :(得分:5)
带有测试数据的最小可运行示例
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 的视频大小匹配。视频大小可以be determined with 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-rotating-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 上测试。
答案 2 :(得分:1)
答案 3 :(得分:0)
Mathematica中的函数ChanVeseBinarize可能有所帮助,请在此处查看第一个“应用程序”: http://reference.wolfram.com/mathematica/ref/ChanVeseBinarize.html
对于离线处理,您可以按顺序导入每个图像,处理它,导出叠加层。最后,您将从所有叠加图像中创建新视频。
答案 4 :(得分:0)
This answer对超级用户的类似问题建议使用MLT。
来自MLT网站:
MLT是一个开源多媒体框架,专为电视广播而设计和开发。它为广播公司,视频编辑,媒体播放器,转码器,网络流媒体以及更多类型的应用程序提供工具包。系统的功能通过各种即用型工具,XML创作组件和基于可扩展插件的API提供。 尝试和学习MLT的最简单方法是下载Shotcut