FFMPEG:将一个视频叠加到另一个视频上,并使黑色像素透明

FFMPEG:将一个视频叠加到另一个视频上,并使黑色像素透明,ffmpeg,Ffmpeg,我正在尝试使用FFMPEG创建一个视频,其中一个视频叠加在另一个视频上 我有两辆MP4。我需要使覆盖中的所有黑色像素透明,以便我可以看到它下面的主视频 我找到了两种方法将一个视频叠加到另一个视频上: 首先,以下内容将覆盖层定位在中心,因此隐藏其下方的主视频部分: ffmpeg -i 1.mp4 -vf "movie=2.mp4 [a]; [in][a] overlay=352:0 [b]" combined.mp4 -y 这一个将覆盖视频放置在左侧,但其不透明度设置为50%,因此下面至

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

我有两辆MP4。我需要使覆盖中的所有黑色像素透明,以便我可以看到它下面的主视频

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

首先,以下内容将覆盖层定位在中心,因此隐藏其下方的主视频部分:

    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)中的所有黑色像素完全透明。如何做到这一点。

您将无法获得“替换黑色像素”的方法来正常工作。实际上,您需要的是一个具有真实alpha通道的前景视频,在对背景进行覆盖之前,可以对其进行操作和测试。对于一个描述问题的扩展示例,请查看我关于该主题的文章。当使用FFMPEG时,导入alpha通道视频的一种简单方法是使用Quicktime,并以32 BPP的速度对动画编解码器视频进行处理。

实现这一点的理想方法是对黑屏进行色度键处理,然后进行叠加,但正如@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
依赖于luma表达式。我们不希望这样,所以我使用
hue
过滤器将这些通道置零。然后,我使用
alphamerge
过滤器将其作为alpha通道与叠加视频的第一个副本合并。然后,覆盖。正如我所说,这可能不会产生令人满意的结果。您可以调整geq过滤器中的值
16
,以更改黑色阈值。对于有限范围(Y:16-235)的视频文件,建议的范围是16-24。

我对所有这些都很陌生,我发现语法非常混乱。但是,我被告知,我应该能够修改叠加视频中的混合模式,以创建透明度。这不可行吗?请参阅我的博客文章了解详细信息,问题在于质量和最终结果的实际外观。你需要一个全阿尔法通道的输入视频。非常感谢!这正是我想要的。诚然,我并不完全理解这个解释,也不可能仅仅通过查看FFMPEG文档就得出这样的结论,我发现它非常神秘。我认为结果实际上是令人满意的,但如果我的客户不同意,我会同意MoDJ的建议。(谢谢你们两位!)