Ffmpeg 如何在不将图像遮罩应用于视频的情况下创建圆形视频(视频顶部的透明区域)效果

Ffmpeg 如何在不将图像遮罩应用于视频的情况下创建圆形视频(视频顶部的透明区域)效果,ffmpeg,mp4,mask,Ffmpeg,Mp4,Mask,基本上,我在谷歌上搜索了很多,解决方案建议使用一些PNG掩码,或者不提供所需的解决方案 我发现了什么 ffmpeg -i main.mkv -i facecloseup.mkv -filter_complex "[1]trim=end_frame=1, geq='st(3,pow(X-(W/2),2)+pow(Y-(H/2),2));if(lte(ld(3),pow(min(W/2,H/2),2)),255,0)':128:128, loop=-1:1,setpts=N/FR

基本上,我在谷歌上搜索了很多,解决方案建议使用一些PNG掩码,或者不提供所需的解决方案

我发现了什么

ffmpeg -i main.mkv -i facecloseup.mkv
 -filter_complex "[1]trim=end_frame=1,
  geq='st(3,pow(X-(W/2),2)+pow(Y-(H/2),2));if(lte(ld(3),pow(min(W/2,H/2),2)),255,0)':128:128,
  loop=-1:1,setpts=N/FRAME_RATE/TB[mask];
  [1][mask]alphamerge[cutout];
  [0][cutout]overlay=x=W-w:y=0[v];
  [0][1]amix=2[a]"
 -map "[v]" -map "[a]"  out.mp4
所以我试着从他们那里提取需要的东西,但我不明白我到底需要怎么做,我做了这个:

ffmpeg -i video.mp4 -filter_complex "[0]geq='st(3,pow(X-(W/2),2)+pow(Y-(H/2),2));if(lte(ld(3),pow(min(W/2,H/2),2)),255,0)':H:W; [0:v][mask]alphamerge" out.mp4
还有一次,伙计们,如果你们要发布一些“准备好的图像遮罩”解决方案——离开吧,问题是如何在空中制作遮罩

所以,假设我们有红方块(是的,比率是静态的,总是1:1),是的,我不能发布它,因为我没有10个代表(…)

-红场

-圈

-结果

-最终结果

实际上,我想从@Gyan或@llogan那里得到答案,因为我搜索了很多,只有这两个人知道如何以编程方式制作东西

更多技术细节: 纵横比为常数-1:1,宽度和高度应以自动方式从视频中获取,我们需要创建一个带有透明圆圈的白色正方形,最终结果必须包含带有白色背景的“圆形”视频。

您可以使用以下图像复制“最终结果”

2输入

height
变量的值应与源文件的高度匹配。在这种情况下,它是600像素

red="red.png"
blue="blue.png"

height=600

ffmpeg \
-loop 1 -i "${red}" \
-loop 1 -i "${blue}" \
-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=${height}[circular shaped video small];\
[0][circular shaped video small]overlay" \
-filter_complex_threads 1 \
-c:v libx264 \
-preset ultrafast \
-t 5 \
"final_result.mp4"
使用图像时,您只需要在输入前面设置
-loop 1
选项

如果您正在使用视频,您可以决定使用哪种音频

你可以在我的原稿中看到一切细节

1只输入

在这里,您只需选择圆形渐晕图的颜色

颜色名称列在列表中

1视频自动平方 包括音频。抗锯齿渐晕边缘


好的,很有趣。图片只是一个例子,我只有一个视频文件,我需要在上面画一个正方形的面具。在您当前的解决方案中,仍然有两层,但我会尝试一下,好吗。所以,我需要在空气中创建“方形和圆形面具”,并应用它。这部分是我需要的代码,您在以前的解决方案中发布,正确。所以,基本上我只需要复制这个层。我已经相应地编辑了我的解决方案
ffmpeg-i“video.mp4”-循环1-filter_complex”[0]setsar=1:1,format=yuva444p,drawbox=color=black@1:t=fill[vignette];[0]format=yuva444p,geq=lum='p(X,Y)'[圆形视频];[vignette][圆形视频]覆盖“-过滤器复杂线程1-c:v libx264-预设超快-t 5“结果.mp4”
Win version.yuva444p和libx264等都与编解码器有关,不是吗?所以,我还有两个问题,第一个问题:你能不能像超级最小解决方案那样发布,只用于在视频上绘制图层,而没有不成功的选项(如果是的话,我的意思是我不需要转换为另一种格式,我只想保持视频原样(如声音比特率、视频fps、编解码器等),即使处理过程可能需要一些时间)?这个例子非常简单。你只能在小晕图中省略一个
格式=yuva444p,
。我在上一个例子中编辑了这个。复杂的
-filter\u
需要编码,我假设音频的
libx264
+
aac
是一个非常常见的选择。你可以更改av编解码器,但不能省略它们。
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001f761dd8e40] Invalid stream specifier: mask.
    Last message repeated 1 times
Stream specifier 'mask' in filtergraph description [0]geq='st(3,pow(X-(W/2),2)+pow(Y-(H/2),2));if(lte(ld(3),pow(min(W/2,H/2),2)),255,0)':H:W; [0:v][mask]alphamerge matches no streams.
ffmpeg -i video.mp4 -filter_complex "[0]geq=lum_expr='st(3,pow(X-(W/2),2)+pow(Y-(H/2),2));if(lte(ld(3),pow(min(W/2,H/2),2)),255,0)':H:W; [0:v][mask]alphamerge" out.mp4
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001bfd9218e80] Invalid stream specifier: mask.
    Last message repeated 1 times
Stream specifier 'mask' in filtergraph description [0]geq=lum_expr='st(3,pow(X-(W/2),2)+pow(Y-(H/2),2));if(lte(ld(3),pow(min(W/2,H/2),2)),255,0)':H:W; [0:v][mask]alphamerge matches no streams.
red="red.png"
blue="blue.png"

height=600

ffmpeg \
-loop 1 -i "${red}" \
-loop 1 -i "${blue}" \
-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=${height}[circular shaped video small];\
[0][circular shaped video small]overlay" \
-filter_complex_threads 1 \
-c:v libx264 \
-preset ultrafast \
-t 5 \
"final_result.mp4"
in="blue.png"

vignette_color="red"

ffmpeg \
-loop 1 -i "${in}" \
-filter_complex "\
[0]setsar=1:1,format=yuva444p,drawbox=color=${vignette_color}@1:t=fill[vignette];\
[0]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];\
[vignette][circular shaped video]overlay" \
-filter_complex_threads 1 \
-c:v libx264 \
-preset ultrafast \
-t 5 \
"result.mp4"
in="snowboarder.mp4"

vignette_color="black"

# edge of vignette can be jagged. 
# use value between 1 - 2 (e.g. 1.2). 1 doesn't do anything.
anti_aliasing=2

ffmpeg \
-i "${in}" \
-filter_complex "\
[0:v]crop=ih:ih[video square];[video square]split=2[video square 1][video square 2];\
[video square 1]setsar=1:1,drawbox=color=${vignette_color}@1:t=fill[vignette];\
[video square 2]scale=w=iw*"${anti_aliasing}":h=iw*"${anti_aliasing}",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)'[scaled up circular shaped video];\
[scaled up circular shaped video]scale=w=iw/"${anti_aliasing}":h=iw/"${anti_aliasing}"[circular shaped video];\
[vignette][circular shaped video]overlay" \
-filter_complex_threads 1 \
-c:v libx264 \
-c:a aac \
-preset ultrafast \
"result_square.mp4"