(FFMPEG)在用透视图覆盖视频之前使区域透明

(FFMPEG) Make areas transparent before overlaying a vid with perspective

我正在尝试为一个小视频添加视角,然后将其叠加在另一个视频之上。

到目前为止,我可以将视频缩小,为其添加透视并将其叠加到其他视频。但应用透视滤镜后,多余的区域并没有变透明,只是把像素拉长了。

透视滤镜没有太多文档,但据我所知,没有办法将额外的像素设置为透明。

所以我猜我需要在所需区域应用某种 alpha 蒙版?

这是我用于透视的命令:

ffmpeg -i /synced_folder/testvid.mp4 -vf perspective=0:0:W:H/4:0:H:W:3*H/4:0:1:0 /synced_folder/output5.mp4

不认为这很重要,但我 运行 ffmpeg 在带有 centOS 的虚拟机上。

This is a SS of how the result looks like:

我通过在我想要的区域使用 alpha 0 的 png,然后使用 alphaextract 和 alphamerge 命令获得了预期的效果。

它有效,但如果有人知道如何直接从透视命令获得透明背景,我将不胜感激。

ffmpeg -y -i video.mp4 -loop 1 -i alphamask.png -filter_complex "[1:v]alphaextract[alf];[0:v][alf]alphamerge" -c:v qtrle -an /synced_folder/output.mov

(请注意,如果您播放输出,它可能看起来不起作用。要查看结果,您必须在背景中覆盖它)

这需要一种非常规的方法。透视滤镜旨在纠正录制过程中某些类型的失真,而不是用于 DVE 类型的覆盖。边缘的像素将被扩展以填充 canvas.

这里的技巧是给视频添加透明填充,然后添加透视。被扩展的像素将是透明像素,在叠加时变得不可见。

ffmpeg -i base.mp4 -i overlay.mp4
filter_complex" [1]pad=iw+4:ih+4:2:2:black@0,perspective=0:0:W:H/4:0:H:W:3*H/4:0:1:0[p];
                [0][p]overlay=-2:-2"    output.mp4

我填充了 2 个像素的边框,选择它是因为通常的像素格式是 4:2:0。边框颜色为黑色,但 alpha 为 0.

严格来说,应该更正透视值以考虑到边界,但这是一个很小的变化。叠加层也会偏移以将可见视频与预期目的地对齐。

不幸的是,Gyan 的方法对我不起作用。透视后的区域刚好填黑

我不确定这是最好的方法,但我用 chromakey 解决了这个问题。

创建带有透视和绿色背景的视频:

ffmpeg -i video.mp4 -filter_complex "pad=iw+4:ih+4:2:2:0x00FF00@0,perspective=0:0:W:H/4:0:H:W:3*H/4:0:1:0" video_persp.mp4

叠加和剪切绿色背景:

ffmpeg -i video2.mp4 -i video_persp.mp4 -shortest -filter_complex "[1:v]chromakey=0x00FF00:0.2:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" video_final.mp4

奖金:如果你想在图片上使用透视并将其添加到视频(没有黑色区域)

ffmpeg -i image.jpeg -filter_complex "pad=iw+4:ih+4:2:2:0x00FF00@0,perspective=0:0:W:H/4:0:H:W:3*H/4:0:1:0" image_persp.jpeg
ffmpeg -i image_persp.jpeg -vf "chromakey=0x00FF00:0.2:0.2" -c copy -c:v png image_transparent.png
ffmpeg -i video.mp4 -i image_transparent.png -filter_complex "[0]overlay=100:300" output.mp4