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

时间:2016-07-25 22:27:50

标签: ffmpeg

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

我有2个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)中的所有黑色像素完全透明。怎么办呢。

2 个答案:

答案 0 :(得分:6)

这样做的概念性方法是将黑色色度键然后叠加,但正如@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。

答案 1 :(得分:0)

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

相关问题