You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需预设PNG蒙版,基于FFmpeg实时生成蒙版实现1:1比例圆形视频(白色背景)的技术方案咨询

FFmpeg实时生成圆形蒙版,输出1:1带白背景的圆形视频

我折腾了好一阵,查了好多资料,但现在找到的FFmpeg蒙版方案大多都是用PNG预设图的,完全不符合我的需求——我需要实时生成蒙版,不用提前准备图片。

我参考了一些相关的FFmpeg命令示例:

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

还有一段拼接命令的代码:

command = "-i " + this.video1Path.getPath() + " -i " + this.video2Path.getPath() + " -filter_complex [1]trim=end_frame=1,geq=lum_expr='st(3,pow(X-(W/2),2)+pow(Y-(H/2),2));if(lte(ld(3)," + (this.mZoomLayout.getZoomedWidth()/2) + "*" + (this.mZoomLayout.getZoomedWidth()/2) + "),255,0)':128:128,format=gray,loop=-1:1,setpts=N/FRAME_RATE/TB[mask];[1][mask]alphamerge,format=rgba,lutrgb=a=if(gte(val\\,16)\\,val)[cutout];[0][cutout]overlay=" + this.mZoomLayout.getCircleX() + ":" + this.mZoomLayout.getCircleY() + ":enable='between(t,0," + this.videoTwoDuration + ") -c:v libx264 -crf 24 -preset ultrafast " + videoPath.getPath();

我试着从这些示例里提取逻辑,自己写了命令,但执行的时候一直报错。

第一次执行的命令:

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

报错信息:

[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.

我调整了一下命令,加了lum_expr参数,再执行:

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.

我的具体需求

我要实现的是带白色背景的“圆形视频”,效果分为几个阶段:

  • 初始是1:1的红色正方形
  • 生成圆形蒙版
  • 过渡到中间效果
  • 最终输出圆形视频

技术要求

  • 视频比例固定为1:1;
  • 自动从输入视频中获取宽高参数;
  • 实时生成内部带透明圆形的白色正方形蒙版;
  • 最终输出为带白色背景的“圆形视频”;
  • 重点强调:绝对不能用预设图片蒙版,必须实时生成。

特别希望能得到@Gyan或@llogan的解答,之前查资料的时候发现二位是FFmpeg编程实现领域的专家,麻烦帮忙看看问题出在哪,怎么实现我的需求,非常感谢!

内容的提问来源于stack exchange,提问作者Arina Lubimova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:08:10