视频图片去水印
一个技能、两个引擎,按文件扩展名自动分流。本文件是唯一入口,两个引擎的脚本都在 scripts/ 目录下。
推荐调用方式:一条命令(按扩展名硬分流)
不想手动判断类型、或想要确定性分流时,直接用统一调度器。它只做「类型判断 + 参数转发」,不含任何处理逻辑,两个引擎依旧各自独立:
python "<本skill目录>/scripts/run_erase_any.py" "<文件绝对路径>" [引擎参数...]
| 输入 | 实际转发到 |
|---|---|
图片(.jpg 等)+ --token "<clientTempToken>" |
scripts/run_erase.py(云端 AI 擦除) |
视频(.mp4 等)+ --box 右下角:200x80 |
scripts/run_erase_video.py(ffmpeg delogo) |
- 参数按类型自动挑选转发,对当前引擎不适用的参数(如图片传了
--box)会自动忽略并打印提示,不会报错崩掉。 - 不支持的扩展名、文件不存在 → 明确报错并列出支持的格式,绝不猜。
- 需要精细控制时,仍可直接调用下面的引擎脚本,两者效果完全一致。
第一步:判断类型并分流
| 输入类型 | 引擎 | 脚本 |
|---|---|---|
图片:.png .jpg .jpeg .webp .bmp .tif .tiff |
云端 AI 智能擦除 | scripts/run_erase.py |
视频:.mp4 .mov .mkv .avi .webm .flv .m4v |
本机 ffmpeg delogo | scripts/run_erase_video.py |
- 扩展名不在表内或文件不存在 → 明确报错,说明支持的格式,不要猜。
- 用户没给文件绝对路径 → 先问,不要猜。
通用约定(两个引擎都要遵守)
- 输出统一落到桌面「去水印结果」文件夹(脚本自动定位桌面,兼容 OneDrive 重定向)。
- 交付前必须自查结果(图片目检、视频抽帧核对),确认水印真被清除、无残留、主体画面无损,再用展示工具呈现给用户。
- 引擎报错时原样透传真实错误信息,严禁编造输出路径或假装成功。
python不可用时改用python3;两者都不可用则停止并报告。
引擎 A:图片 → 云端 AI 智能擦除
全自动识别水印位置,无需手动标注;平铺水印、移动水印、半透明大字都能处理。
使用流程(严格按顺序)
- 确认用户已给出图片绝对路径。
- 调用一次
connect_cloud_service(云端凭证接口),取clientTempToken(只在本次任务内使用,不展示、不缓存、不复用旧值)。 - 执行:
python "<本skill目录>/scripts/run_erase.py" \
--image-file "<图片绝对路径>" \
--token "<clientTempToken>" \
[--prompt "<补充指令,例如:去除右下角水印>"] \
[--output-dir "<可选>"]
- 读取 stdout 末尾
=== RESULT ===块中的OUTPUT_FILE,确认文件存在。 - 目检输出图片(水印清除干净、主体自然)后交付,告知桌面路径。
参数
| 参数 | 必填 | 说明 |
|---|---|---|
--image-file |
是 | 图片绝对路径,≤4MB,支持 png/jpg/webp/bmp/tif |
--token |
是 | connect_cloud_service 返回的 clientTempToken |
--prompt |
否 | 水印位置等补充指令,可显著提升效果 |
--output-dir |
否 | 默认桌面「去水印结果」文件夹 |
--max-poll-time |
否 | 轮询上限秒数,默认 600 |
错误处理
- 超过 4MB 直接报错——让用户先压缩,不要自行转码绕过。
SUBMISSION_STATUS_UNKNOWN:不要重试提交、不要 sleep 循环,如实告知。AUTH_INVALID_TEMP_KEY(token 过期):重新取新 token 后仅重试查询/落盘,不重复提交任务。
引擎 B:视频 → ffmpeg delogo 精准擦除
只适合位置固定的水印(角标 logo、台标、右下角标识、固定 ID 文字条)。只影响框内像素,框外画面零损失,音轨原样保留。
能力边界(必须先向用户说清)
| 情况 | 能否处理 |
|---|---|
| 固定位置的角标 / 台标 / ID 文字条 | ✅ 效果好 |
| 半透明大字水印(位置固定不动) | ✅ 可以 |
| 移动的水印、随镜头运动的水印 | ❌ 不支持 |
| 全屏平铺水印 | ❌ 不支持(图片引擎可以) |
用户拿不准时,如实告知边界,不要硬接单。
依赖:ffmpeg(必需)+ 自动安装规则
查找顺序:本 skill 的 bin/ffmpeg.exe → 环境变量 FFMPEG_PATH → 系统 PATH → C:\ffmpeg\bin。
新电脑上首次使用大概率没有 ffmpeg。不要直接告诉用户「装不了」,按下面任一方式自动装好:
- 方式 A(推荐):原命令加
--auto-install,脚本先自动联网下载安装(约 200MB,仅首次,视网速几分钟)再干活。 - 方式 B:先照常跑原命令;若 stdout 出现
=== DEPENDENCY MISSING ===,立刻执行其中INSTALL_CMD:那一行的完整命令,装完原样重跑原命令:
python "<本skill目录>/scripts/ensure_ffmpeg.py"
- 方式 C(只查状态):
python "<本skill目录>/scripts/ensure_ffmpeg.py" --check,输出FFMPEG_STATUS: FOUND或MISSING。
安装器行为:下载源顺序 gyan.dev 官方构建 → GitHub BtbN 构建 → winget 兜底;装到本 skill 的 bin/ 目录(免配置 PATH、免管理员权限);装完实跑 ffmpeg -version 校验,校验不过不会报成功;自动安装失败时打印手动安装指引,此时把指引原样转述给用户,严禁编造「已安装」。
使用流程(严格按顺序)
- 确认用户已给出视频绝对路径;先问清水印位置。
- 用户说不清位置就先抽预览帧自己看:
python "<本skill目录>/scripts/run_erase_video.py" --video-file "<视频绝对路径>" --probe
输出 PROBE_FRAME 指向预览帧 PNG,图片尺寸即视频尺寸(见 VIDEO_SIZE),据此目测水印坐标。
- 指定擦除区域执行:
python "<本skill目录>/scripts/run_erase_video.py" --video-file "<视频绝对路径>" --box <区域> [--box <区域2> ...]
区域两种写法(可混用、可多框):
- 像素坐标:--box 900,500,200,80(左上角x, 左上角y, 宽, 高)
- 锚点+尺寸:--box 右下角:200x80 或 --box br:200x80+10+10(角:宽x高+水平边距+垂直边距)
- 角点支持:左上角 / 右上角 / 左下角 / 右下角 / 上中 / 下中 / 中间(英文 tl/tr/bl/br/tc/bc/center)
- 读取 stdout 末尾
=== RESULT ===的OUTPUT_FILE,确认文件存在。 - 必须抽一帧处理后的画面自查(水印无残留、无涂抹异常)再交付;有残留就微调框坐标重跑(输出自动加时间戳,注意用最新的那个文件名抽帧)。
- 交付时告知桌面路径;长视频(>5 分钟)先告知预计耗时。
其他约定
- 文件名:
<原名>_去水印.mp4;机器命名改为去水印_YYYYMMDD-HHMMSS.mp4;重名自动加时间戳。 - 源视频宽高为奇数时自动裁齐到偶数(最多 1 像素),已内置。
- 画质
crf=18,可用--crf调整;严禁用 sleep + 重复提交的方式重试。