视频防录屏完全方案:水印、跑马灯与用户追溯
付费课程上线三个月,二手平台出现九块九的「全套录屏版」——这是内容生意最疼的一刀。技术上无法做到「绝对防录屏」(屏幕总能被拍),但可以做到威慑与追溯:让每一份翻录都带着盗录者的身份信息。本文给出一套播放侧的完整方案:三种水印行为 × 身份宏变量 × 可视化配置,组合成「录了就能溯源」的闭环。
防录屏的现实逻辑:威慑 + 溯源
先校准预期:浏览器沙箱内的 DRM 不是万能的(录屏软件在操作系统层抓屏,网页无感知)。成熟的防护是两层:
- 威慑层:让潜在盗录者「看到水印就知道录了也没法干净地卖」——动态游走的水印无法被裁剪避开(裁剪即破坏画面),全屏平铺让打码成本高到不值;
- 溯源层:水印里嵌入观看者身份(用户 ID、手机号脱敏、IP、时间戳),泄露版本流出后一眼定位到人——威慑从「防所有人」收窄为「追具体人」,这才是可运营的防线。
ZWPlayer 的水印体系(ZWMAP 水印规范)就是按这个逻辑设计的。
三种水印行为:静态、动态、平铺
水印通过 watermarks 配置传入(数组 / ZWMAP 对象 / 指向 JSON 的 URL 三种形式均可),每条水印三种行为模式:
static — 静态水印(品牌层)
固定位置的文字或图片,放品牌 Logo、版权声明。它不防录,是身份声明。
图 1:静态文字水印——左下角版权声明
dynamic — 动态游走(防录核心)
水印在画面内按设定方向(水平/垂直/对角/随机)移动,碰到边界反弹。录屏者无法预判位置,裁剪与跟踪打码都难。配合 interval/duration 还能周期性隐藏再出现。
图 2:动态游走水印——带用户 ID 与实时时间,位置随播放移动
tile — 全屏平铺(密度压制)
文字按倾斜网格铺满画面(角度、行列间距可调),形成密集水印矩阵。单个打码无意义,整体抹除等于毁了画面。
图 3:全屏平铺水印 -30° 倾斜网格
组合拳
三种行为可同时挂载——静态放品牌、动态放「ID+时间」、平铺放「内部资料」声明,一张画面三层防护:
图 4:静态 + 动态 + 平铺三层组合——付费内容的推荐配置
溯源的关键:宏变量
水印文本支持 {key} 模板变量,播放时动态解析:
{sys_time}:客户端本地时间,每秒更新——盗录版本里的时间戳就是「案发时间」;- 自定义变量:播放器
variables参数传入,典型如登录用户的脱敏手机号、会员 ID:
new ZWPlayer({
playerElm: 'player',
url: '/course/lesson-01.mp4',
watermarks: '/course/wm.json', // 三种形式任一
variables: { user_id: '138****1234' }, // 服务端渲染进页面
});
服务端把当前登录用户的标识注入 variables——每位观众看到的是印着自己 ID 的画面。泄露版本流出,比对人即可。这套机制在 ZWMAP 水印规范(zwmap-060)中有完整定义。
可视化配置:Watermark Studio
水印参数(位置、透明度、颜色、运动、平铺网格)手写 JSON 容易错。在线水印编辑器提供可视化配置:加载视频实时预览、图层列表管理多条水印、右侧属性面板调参数、JSON 面板导出标准 ZWMAP 结构直接接进播放器。
图 5:Watermark Studio——图层列表 + 属性面板 + 画布实时预览
图 6:JSON 面板导出标准 ZWMAP 水印结构
落地清单
- [ ] 静态层:品牌/版权文字(不透明度 70% 左右,可读不抢戏);
- [ ] 动态层:
{user_id} · {sys_time},随机方向、中速(speed 3 左右); - [ ] 平铺层(内容敏感度高一档时加):内部资料声明 + user_id,22% 左右透明度;
- [ ]
variables由服务端按登录态注入,切勿前端写死; - [ ] 水印 JSON 与视频分离存放,换水印策略不必重转码;
- [ ] 法务配套:用户协议写明水印含身份标识,溯源有据可依。
想横向比较「播放器原生水印 vs CSS 覆盖 vs FFmpeg 预压制」三种实现路线的取舍,见《网页视频加水印的四种方式对比》。