Video 为视频提供圆形透明边缘,以便使用FFMPEG将其覆盖到另一个视频上
我试图在一个较大的视频(800x800)上叠加一个较小的视频(200x200) 我使用了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行:要创建圆形
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