用户使用 FFMPEG / AVCONV 生成色度键复合视频

用户使用 FFMPEG / AVCONV 生成色度键复合视频

我想创建一个系统,用户可以将两个视频上传到一个网站,其中一个视频的背景是蓝屏,然后该网站使用 AVCONV(或类似技术)创建两个视频的合成视频,使用色度键技术(又名蓝屏)。

AVCONV 能这样用吗?

根据这篇文章因此,静态图像可以通过 Chrome 键控添加到背景中。但是,视频也可以这样做吗?

我还想知道,两个视频是否需要具有相同的长度和格式才能合并?为了提供这样的服务,我还需要考虑其他技术因素吗?

提前致谢。

答案1

笔记:此答案是在 FFmpeg 获得色度键控功能之前发布的。请参阅下面的其他答案。

AVconv 和 FFmpeg 目前都无法做到这一点 —— 这是它们无法完成的一项主要视频处理任务。

这些工具将具有透明背景的图像或视频覆盖在另一个视频或图像上 - 这就是您链接到的 SO 问题想要的。但是,具有透明背景的视频需要采用支持透明度的视频格式(大多数都不支持) - 我会使用qtrle(Apple 的动画编解码器)。但它们无法进行实际的色度键控(将某种颜色变为透明)。

您可能可以使用涉及 avconv 和 ImageMagick 的解决方法,但这会占用大量 CPU,而且我不知道您的结果会有多好。您需要:

  1. 使用 avconv 将要进行色度键控的视频转换为单独的帧
  2. 使用 ImageMagick 的转换(或 mogrify)工具对每一帧进行色度键控
  3. 使用 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

这两种方法都对我有用。

相关内容