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

Dan*_*Ruf 19 ffmpeg image-processing video-processing filter chromakey

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

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

jla*_*dan 35

我意识到这是一个老问题,但当我搜索ffmpeg chromakey时,它仍然会出现在顶部附近.

答案(现在)是肯定的,有一个过滤器用于生成色度键并覆盖它们.过滤器名称是" 颜色键 ".网站上有一些例子,这是命令:

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)控制不透明度是开关还是逐渐增加.(有关详细信息,请参阅文档).

  • 它已于6月13日被添加到主分支中,但尚未进入实际版本(当前版本为2.7.2).人们需要从源代码构建ffmpeg. (2认同)
  • 这很有帮助,但新版本不再使用色键,而是使用色键滤镜。 (2认同)

Cir*_*四事件 6

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

/sf/answers/2260428971/ 上的答案是正确的,这里只是一个最小的具体例子。

下载输入媒体:

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
Run Code Online (Sandbox Code Playgroud)

使图像大小与 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
Run Code Online (Sandbox Code Playgroud)

进行实际转换:

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
Run Code Online (Sandbox Code Playgroud)

转换为 gif 只是为了预览这个答案:

ffmpeg -i out.mp4 -r 5 -vf "scale=300:-1,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" out.gif
Run Code Online (Sandbox Code Playgroud)

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

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

在此处输入图片说明

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

原始输入文件供参考:

opengl-旋转三角形.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
Run Code Online (Sandbox Code Playgroud)

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

overlay=shortest=1
Run Code Online (Sandbox Code Playgroud)

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

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

Atlantis 视频为 1920x1080,最终输出也具有该尺寸。预览:

在此处输入图片说明

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

在 Ubuntu 20.10、FFmpeg 4.3.1 上测试。