【问题标题】:FFMPEG: Overlaying one video on another one, and making black pixels transparentFFMPEG:将一个视频叠加在另一个视频上,并使黑色像素透明
【发布时间】:2021-11-11 01:07:43
【问题描述】:

我正在尝试使用 FFMPEG 创建一个视频,其中一个视频叠加在另一个视频之上。

我有 2 个 MP4。我需要将叠加层视频中的所有BLACK像素设为透明,这样我才能看到其下方的主视频。

我找到了两种将一个视频叠加在另一个视频上的方法:

首先,以下将叠加层定位在中心,因此将主视频的那部分隐藏在其下方:

    ffmpeg -i 1.mp4 -vf "movie=2.mp4 [a]; [in][a] overlay=352:0 [b]" combined.mp4 -y

而且,这个,将覆盖视频放在左侧,但它的不透明度设置为 50%,因此至少下面的另一个是可见的:

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]setpts=PTS-STARTPTS[top]; [1:v]setpts=PTS-STARTPTS, format=yuva420p,colorchannelmixer=aa=0.5[bottom]; [top][bottom]overlay=shortest=0" -acodec libvo_aacenc -vcodec libx264 out.mp4 -y

我的目标只是让叠加层 (2.mp4) 中的所有黑色像素完全透明。这是怎么做到的。

【问题讨论】:

    标签: ffmpeg


    【解决方案1】:

    执行此操作的名义方法是对黑色进行色键处理,然后叠加,但正如@MoDJ 所说,这可能不会产生令人满意的结果。我在下面建议的方法也不会,但值得一试。

    ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex
    "[1]split[m][a];
     [a]geq='if(gt(lum(X,Y),16),255,0)',hue=s=0[al];
     [m][al]alphamerge[ovr];
     [0][ovr]overlay"
    output.mp4
    

    在上面,我复制了覆盖视频流,然后使用geq 过滤器来处理亮度值,以便任何亮度大于 16(即非纯黑色)的像素都将其亮度设置为白色,否则为零。由于我没有提供两个颜色通道的表达式,geq 回退到亮度表达式。我们不希望这样,所以我使用hue 过滤器来取消这些通道。然后我使用alphamerge 过滤器将它作为一个alpha 通道与覆盖视频的第一个副本合并。然后,覆盖。就像我说的,这可能不会产生令人满意的结果。您可以调整 geq 过滤器中的值 16 以更改黑色阈值。对于有限范围(Y:16-235)的视频文件,建议范围为 16-24。

    【讨论】:

    • 非常感谢!这正是我一直在寻找的。诚然,我并没有完全按照解释进行,而且仅仅通过查看 FFMPEG 文档就不可能得出这个结论,我觉得这些文档非常神秘。我认为结果实际上是令人满意的,但如果我的客户不同意,我会接受 MoDJ 的建议。 (谢谢你们!)
    【解决方案2】:

    您将无法让“替换黑色像素”方法正常工作。您真正想要的是具有真实 Alpha 通道的前景视频,可以在背景上进行叠加之前对其进行操作和测试。有关描述问题的扩展示例,请查看我的 blog post 关于该主题的内容。使用 FFMPEG 时,导入 Alpha 通道视频的一种简单方法是使用 Quicktime 和 32 BPP 的动画编解码器视频。

    【讨论】:

    • 我对这一切真的很陌生,我发现语法非常混乱。但是,有人告诉我,我应该能够修改叠加视频中的混合模式以创建透明度。这不可行吗?
    • 详情请看我的博文,问题在于质量和最终结果的实际外观。您需要具有完整 Alpha 通道的输入视频。
    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2015-03-31
    • 2016-06-13
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多