答案1
笔记:此答案是在 FFmpeg 获得色度键控功能之前发布的。请参阅下面的其他答案。
AVconv 和 FFmpeg 目前都无法做到这一点 —— 这是它们无法完成的一项主要视频处理任务。
这些工具能将具有透明背景的图像或视频覆盖在另一个视频或图像上 - 这就是您链接到的 SO 问题想要的。但是,具有透明背景的视频需要采用支持透明度的视频格式(大多数都不支持) - 我会使用qtrle
(Apple 的动画编解码器)。但它们无法进行实际的色度键控(将某种颜色变为透明)。
您可能可以使用涉及 avconv 和 ImageMagick 的解决方法,但这会占用大量 CPU,而且我不知道您的结果会有多好。您需要:
- 使用 avconv 将要进行色度键控的视频转换为单独的帧
- 使用 ImageMagick 的转换(或 mogrify)工具对每一帧进行色度键控
- 使用 avconv 将帧重新拼接起来并将其放置在背景视频上
您也许可以使用管道简化该过程。
提取帧(生成类似 00001.png、00002.png 等的文件):
avconv -i input.mp4 %05d.png
要将它们重新拼接在一起并在运行 ImageMagick 之后将其放在背景视频之上:
avconv -f image2 -r 25 -i %05d.png -i background.mp4 \
-filter_complex '[1:v][0:v]overlay[out]' \
-map [out] -c:v libx264 -crf 23 -preset veryfast output.mp4
-r 25
为您提供 25 的帧速率;如果您想要其他帧速率,只需使用不同的数字即可。确保您使用与原始输入视频相同的帧速率。如果您想从原始输入中获取音频,请使用
avconv -f image2 -r 25 -i %05d.png -i background.mp4 -i input.mp4 \
-filter_complex '[1:v][0:v]overlay[out]' \
-map [out] -map 2:a -c:v libx264 -crf 23 -preset veryfast -c:a copy output.mp4
请注意,某些版本的 AVconv(例如 Ubuntu 存储库中的版本)不支持滤镜图。如果您遇到这种情况,请升级到较新版本的 avconv 或 ffmpeg。
至于第 2 阶段...我实际上不确定该怎么做,但我知道 ImageMagick能进行色度键控。以下是一些可能对您有用的链接:
http://www.imagemagick.org/Usage/photos/#chroma_key
http://www.imagemagick.org/discourse-server/viewtopic.php?t=14394
http://tech.natemurray.com/2007/12/convert-white-to-transparent.html
由于人们给您的样本在光照等方面存在差异,您必须使用某种东西来检测要去除的确切蓝色色调。您可能必须将此事留给您的用户,也许使用 ffmpeg 创建缩略图,然后使用吸管选择背景颜色。
答案2
您可以使用骨髓移植
melt https://archive.org/download/IMB_SF_R35_C8/IMB_SF_R35_C8_512kb.mp4 in=400 \
-track https://archive.org/download/IMB_SF_R19_C9/IMB_SF_R19_C9_512kb.mp4 in=450 \
-filter chroma key=0x00ff0000 variance=0.45 \
-transition composite
这会播放背景视频和一条狗的绿屏剪辑,作为合成在其上的第二个音轨。它使用色度键(设置为绿色,略有差异)将 alpha 应用于绿色区域,使合成的背景可以透过绿色区域显示出来。这in=XXX
只是为了截断正在使用的视频剪辑上的一些前导垃圾。
答案3
从 ffmpeg 3.0 版本开始,色度键可用,在此之前,您可以使用 colorkey 选项
ffmpeg -f mpeg -i input.mp4 -i video.mp4 -shortest -filter_complex "[1:v]chromakey=0x70de77:0.1:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.mp4
用于 ffmpeg v2.8 或更高版本的 colorkey
ffmpeg -f mpeg -i input.mp4 -i video.mp4 -shortest -filter_complex "[1:v]colorkey=0x70de77:0.1:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.mp
这两种方法都对我有用。