无需预设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
相关产品推荐
相关产品推荐

