Video 为视频提供圆形透明边缘,以便使用FFMPEG将其覆盖到另一个视频上

Video 为视频提供圆形透明边缘,以便使用FFMPEG将其覆盖到另一个视频上,video,ffmpeg,Video,Ffmpeg,我试图在一个较大的视频(800x800)上叠加一个较小的视频(200x200) 我使用了FFMPEG覆盖过滤器来实现这一点 ffmpeg -i big.mp4 -vf "movie=small.mkv[clip2]; [in][clip2] overlay=1:5 [out]" final.mp4 挑战在于较小的视频需要将其边缘磨圆。 我试过使用alphaextract和alphamerge。关于FFMPEG的文档很少,我不知道该怎么做 带圆形覆盖层() 说明: 第5行:要创建圆形

我试图在一个较大的视频(800x800)上叠加一个较小的视频(200x200)

我使用了FFMPEG覆盖过滤器来实现这一点

    ffmpeg -i big.mp4 -vf "movie=small.mkv[clip2]; [in][clip2] overlay=1:5 [out]"  final.mp4
挑战在于较小的视频需要将其边缘磨圆。 我试过使用alphaextract和alphamerge。关于FFMPEG的文档很少,我不知道该怎么做

带圆形覆盖层()

说明:

第5行:要创建圆形遮罩,我们使用“geq”过滤器。这用于从第二个视频输入创建带有alpha通道的圆形视频

第6行:将圆形视频的高度缩放为200px,保留纵横比

第7行:叠加视频

第8行:为geq过滤器提出了这个解决方案

你可以跳过第9-14行。然后ffmpeg将默认使用主电影的音频曲目

第9行:可选:第一个输入的音频将是输出中的第一个音频曲目

第10行:可选:为输出中的第一个音频曲目命名(在VLC中工作)

第11行:可选:确保输出中的第一个音频曲目将作为默认曲目播放

第12行:可选:第二个输入的音频将是输出中的第二个音频曲目

第13行:可选:为输出中的第二个音轨命名(在VLC中工作)

第14行:可选:确保输出中的第二个音频曲目不会播放,除非您用播放器(VLC)选择它


第17行:输出的持续时间将与最短输入的持续时间一样长

虽然我认为现有答案适用于圆形,但听起来您更想要一个“圆角矩形”。我是这样做的:

[1]format=yuva420p,geq=lum='p(X,Y)':a='if(gt(abs(W/2-X),W/2-10)*gt(abs(H/2-Y),H/2-10),if(lte(hypot(10-(W/2-abs(W/2-X)),10-(H/2-abs(H/2-Y))),10),255,0),255)'[rounded];
关于
格式

这个。因此
format=yuva420p
过滤器添加了一个(即
yuva
中的
a
)。据我所见,
yuva444p
也很常见(在中使用),但其他格式如
rgba
应该可以工作,只要它们有alpha通道。我最初的源代码是
yuv420p
,所以我制作了我的
yuva420p

关于
geq

似乎您无法仅更改alpha通道(如果您尝试,您将得到一个错误“亮度或RGB表达式是必需的”),因此
lum='p(X,Y)
基本上是一个虚拟的无操作,允许您在不更改任何其他内容的情况下更改alpha

因此,无需单独检查每个角点,X和Y通过以下公式转换为左上象限:

X' = W/2-abs(W/2-X)
Y' = H/2-abs(H/2-Y)
公式的第一部分检查
X'
Y'
是否在茅草区域内:

即是否:

    X' < 10
and Y' < 10
给出结果:


在我的示例中,我使用了
10
20
作为圆的半径,但您可以将其更改为任意数字,以使角更圆或更圆。

太棒了!为了方便起见,我用一个shell变量替换了边界半径的数字:
corner\u radius=10
ffmpeg-f lavfi-I color=darkblue:size=800x600-f lavfi-I color=gray:size=600x450-frames:v180-filter\u complex”[1]格式=yuva420p,geq=lum='p(X,Y):a='if(gt(abs(abs(W/2-X),W/2-${corner\u radius})**-${corner_radius}),如果(lte(hypot(${corner_radius}-(W/2-abs(W/2-X)),${corner_radius}-(H/2-abs(H/2-Y)),${corner_radius}),255,0),255)[圆角];[0][圆角]覆盖=X=(W-W)/2:Y=(H-H)/2“示例.mp4
也很棒!我能做些什么来获得更好的圆角吗?请定义“更好”。-)您可以尝试不同的半径值。如果您根本不喜欢四分之一圆圆弧,您可以绘制自己的曲线,并找出如何将其表示为公式,然后调整上述内容以使用它。如果您的圆角角是锯齿状的(锯齿状),您可以先将大小增加两倍(“…color=gray:size=1200x900…”),然后在这个更大的画布上运行“geq”,最后将其缩小。然后圆角将消除锯齿,看起来更平滑。(但是在这种情况下,最好为圆角使用百分比值。)
    X' < 10
and Y' < 10
ffmpeg -f lavfi -i color=darkblue:size=800x600 -f lavfi -i color=gray:size=600x450 -frames:v 180 -filter_complex "[1]format=yuva420p,geq=lum='p(X,Y)':a='if(gt(abs(W/2-X),W/2-20)*gt(abs(H/2-Y),H/2-20),if(lte(hypot(20-(W/2-abs(W/2-X)),20-(H/2-abs(H/2-Y))),20),255,0),255)'[rounded];[0][rounded]overlay=x=(W-w)/2:y=(H-h)/2" example.mp4