如何基于鼠标光标坐标为视频添加光标Overlay?
解决FFmpeg添加大量鼠标光标Overlay的方案
核心思路
放弃多次叠加overlay滤镜的方式,改用单个overlay配合动态参数控制,彻底避免命令行参数爆炸或脚本长度超限的问题。以下是三种实用方案:
方案1:单个Overlay + 分段时间表达式(适合时间点数量中等场景)
利用FFmpeg的between()函数生成分段坐标表达式,让单个overlay滤镜在不同时间区间自动切换坐标。
操作步骤:
- 整理所有鼠标时间戳与坐标,按时间从小到大排序,格式为
时间戳, x坐标, y坐标。 - 用PHP脚本自动生成x、y的表达式,示例逻辑:
- 对于时间区间
[t0, t1),坐标为(x0,y0);[t1, t2)为(x1,y1),以此类推。 - 生成的表达式示例(假设3个时间点):
x='if(between(t,0,2),100,if(between(t,2,5),300,500))' y='if(between(t,0,2),200,if(between(t,2,5),400,600))'
- 对于时间区间
- 执行FFmpeg命令:
ffmpeg -i input.mp4 -i cursor.png \ -filter_complex "[1]format=rgba,alpha=0.5[cursor]; \ [0][cursor]overlay=x='if(between(t,0,2),100,if(between(t,2,5),300,500))':y='if(between(t,0,2),200,if(between(t,2,5),400,600))'" \ output.mp4format=rgba确保光标图片带透明通道,alpha=0.5设置光标透明度可按需调整。
方案2:Sendcmd滤镜(适合超大量时间点场景)
通过外部命令文件控制overlay参数,彻底避免命令行或filter脚本过长的问题。
操作步骤:
- 生成命令文件
cursor_cmds.txt,每行对应一个时间点的坐标指令:0.0 set overlay@cursor_overlay x 100 y 200; 2.0 set overlay@cursor_overlay x 300 y 400; 5.0 set overlay@cursor_overlay x 500 y 600; # 更多时间点... - 执行FFmpeg命令,用
sendcmd加载命令文件动态修改overlay坐标:ffmpeg -i input.mp4 -i cursor.png \ -filter_complex "[1]format=rgba,alpha=0.5[cursor]; \ [0][cursor]overlay@cursor_overlay=x=0:y=0[vid]; \ [vid]sendcmd=c='cursor_cmds.txt'" \ -map "[vid]" output.mp4overlay@cursor_overlay给滤镜命名,方便sendcmd精准控制;sendcmd=c='cursor_cmds.txt'加载外部命令文件。
方案3:预先生成光标轨迹视频(适合逻辑分离场景)
先单独生成仅包含光标移动的透明视频,再与原视频叠加,处理流程更清晰。
操作步骤:
- 生成与原视频同分辨率、同时长的透明背景视频:
ffmpeg -f lavfi -i color=c=black@0:s=1920x1080:r=30:d=30 -pix_fmt rgba cursor_bg.mp4s=1920x1080替换为原视频分辨率,d=30替换为原视频时长(秒),r=30为帧率。
- 用方案2的sendcmd方法,给透明视频添加光标轨迹,生成
cursor_track.mp4:ffmpeg -i cursor_bg.mp4 -i cursor.png \ -filter_complex "[1]format=rgba,alpha=0.5[cursor]; \ [0][cursor]overlay@cursor_overlay=x=0:y=0[vid]; \ [vid]sendcmd=c='cursor_cmds.txt'" \ -map "[vid]" cursor_track.mp4 - 将原视频与光标轨迹视频叠加:
ffmpeg -i input.mp4 -i cursor_track.mp4 -filter_complex "[0][1]overlay" output.mp4
内容的提问来源于stack exchange,提问作者Dima
相关产品推荐
相关产品推荐

