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

Mic*_*l A 2 ffmpeg

我正在尝试使用FFMPEG创建一个视频,其中一个视频覆盖在另一个视频上.

我有2个MP4.我需要使叠加视频中的所有黑色像素透明,以便我可以看到它下面的主视频.

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

首先,以下将叠加层置于中心位置,因此隐藏了主视频下方的部分:

    ffmpeg -i 1.mp4 -vf "movie=2.mp4 [a]; [in][a] overlay=352:0 [b]" combined.mp4 -y
Run Code Online (Sandbox Code Playgroud)

而且,这一个,将叠加视频放在左侧,但它的不透明度设置为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
Run Code Online (Sandbox Code Playgroud)

我的目标只是让覆盖层(2.mp4)中的所有黑色像素完全透明.如何才能做到这一点.

Gya*_*yan 7

这样做的概念性方法是对黑色进行色度键然后叠加,但正如@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
Run Code Online (Sandbox Code Playgroud)

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