昨天跳完舞,想给视频里的其他人打码发布,又难到了我。

我首先想到的是剪映。它有人脸跟踪和局部打码功能,我之前也尝试用过,但画面里的人一多,处理起来就比较麻烦:需要逐个添加遮罩、调整跟踪,人物互相遮挡或者快速移动时,还容易出现跟丢和漏脸的情况。

更麻烦的是,我不是要把所有人都打码,而是要指定保留其中一个人。

如果视频只有几秒,手动处理也不是不行。但视频稍微长一点,画面里的人再多一点,光是逐个添加遮罩和检查有没有漏脸,就很折磨了。

我干脆把视频交给 Claude,让它想办法处理。

Claude 不仅把视频做出来了,还把整个过程整理成了一个可以重复使用的 Skill。以后再遇到类似的视频,我只需要告诉 Claude:“保留左边穿棕色衣服的人,其他人全部打码。”它就知道接下来应该怎么做。

这件事比“识别人脸”复杂一点

最直接的思路,是先用模型检测每一帧里的人脸,再在检测框内加上马赛克。听起来并不复杂,但如果只做到这一步,成片的效果通常不好。

人脸检测不是每一帧都稳定。人物侧脸、低头、被遮挡或者移动太快时,模型都可能短暂漏检。如果直接按照每一帧的检测结果打码,马赛克就会时有时无,不断闪烁,甚至偶尔露出完整的人脸。

所以,这个工作流没有停留在人脸检测,而是要把同一个人的检测框连接成一条连续轨迹。中间偶尔漏掉几帧,就根据前后帧的位置进行补齐,让马赛克能够持续跟着人物移动。

另一个问题是,怎么告诉 Claude 应该保留谁。

这里并不是让模型自动识别“这个人是我”。Claude 会先从视频里抽取几张参考画面,并给检测到的人脸加上编号。我只需要在其中一帧里指出要保留的人,脚本就会从这个位置向前、向后跟踪。正式渲染时,属于这个人的人脸框会从打码列表里排除,其他检测到的人脸继续打码。

这样,给 AI 比较模糊的一句话,就能实现人脸打码了,比如输入一句:

保留我框住的这个人,其他人全部打码。

中途还踩了一个 HDR 的坑

第一次处理出来的视频,人脸打码本身没有太大问题,但成片明显变灰、变白了,和原视频的颜色差别很大。

检查后才发现,源视频是手机拍摄的 HDR 素材。如果按照普通 SDR 视频的方式解码和重新编码,BT.2020、HLG 等色彩信息可能会丢失。播放器用错误的方式解释画面颜色,看起来就像视频被蒙上了一层灰。

为了解决这个问题,正式处理前需要先用 ffprobe 检查视频的色彩信息。如果检测到 HLG 或 HDR10,就换成适合 HDR 素材的处理方式,使用更高位深的管线和 HEVC 10bit 输出,同时把原视频的色彩元数据重新写回去。

重新处理后,视频的亮度和颜色才恢复正常。

由此可见,一套真正可以复用的视频处理流程,不能只包含核心功能,还得包含输入检查和结果验收。

我把这套流程整理成了一个 Skill

视频处理完成后,我顺手把这次用到的脚本、处理步骤和踩过的坑,整理成了一个 video-face-mosaic Skill。

这次整理的 Skill 已经放到了 GitHub:

video-face-mosaic Skill

如果你也有“视频里只保留一个人,其他人全部打码”的需求,可以直接拿去试试。