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

时间:2015-09-30 07:02:06

标签: 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的文档很少,我不确定如何去做。

2 个答案:

答案 0 :(得分:7)

尽管我认为现有的答案对一个圆圈是有好处的,但这听起来像是您想要更多的“圆角矩形”。这是我的操作方式:

[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

alpha values can’t be changed in a source that doesn’t have an existing alpha channel。因此format=yuva420p过滤器将添加一个(即a中的yuva)。据我所知,yuva444p也很常见(在other answers中使用),但是其他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'是否在茅草区域内:

Upper left quadrant

也就是说,是否:

    X' < 10
and Y' < 10

如果不是,则将a设置为255(即显示像素)。

如果它们落在该区域内,则计算点(X,Y)(10,10)处的圆心之间的距离。如果点(X,Y)落在圆内,则a设置为255;否则,a设置为0,并且该像素被隐藏。

可以更改半径以提供或多或少的“倒圆角”。半径为20的完整示例命令为:

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

给出结果:

Example rounded rectangle video frame

在我的示例中,我使用1020作为圆的半径,但是您可以将其更改为任意数字,以使拐角或多或少地变圆。

答案 1 :(得分:1)

Main movie,带有圆形覆盖物(2nd movieResult

ffmpeg \
-i "trailer_iphone.m4v" \
-i "sintel_trailer-480p.mp4" \
-filter_complex "\
[1]format=yuva444p,geq=lum='p(X,Y)':a='st(1,pow(min(W/2,H/2),2))+st(3,pow(X-(W/2),2)+pow(Y-(H/2),2));if(lte(ld(3),ld(1)),255,0)'[circular shaped video];\
[circular shaped video]scale=w=-1:h=200[circular shaped video small];\
[0][circular shaped video small]overlay" \
-filter_complex_threads 1 \
-map 0:a \
-metadata:s:a:0 title="Sound main movie" \
-disposition:a:0 default \
-map 1:a \
-metadata:s:a:1 title="Sound overlayed movie" \
-disposition:a:1 none \
-c:v libx264 \
-preset ultrafast \
-shortest \
"result.mp4"

说明:

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

第6行:将圆形视频的高度缩放到200px,并保持宽高比

第7行:重叠视频

第8行:Gyan提出了针对geq过滤器here的解决方案。

您可以跳过第9-14行。然后ffmpeg将默认使用主电影的音轨。

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

第10行:可选:在输出中为第一个音轨命名(在VLC中有效)

第11行:可选:确保将输出中的第1个音频轨道作为默认轨道播放

第12行:可选:第二个输入的音频将是输出中的第二个音频轨道。

第13行:可选:在输出中为第二音轨命名(在VLC中有效)

第14行:可选:确保除非使用播放器(VLC)选择第二音频轨,否则不会播放输出中的第二音轨。

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

相关问题