一、流媒体业务水印两种实现方式
点播直播业务经常需要加水印,保护版权,防止录屏盗播。很多新手分不清硬水印(内置到视频画面里面)、动态水印(播放器叠加 DOM 水印)两者的巨大区别,业务选型踩很多坑。
硬水印:转码 / 推流阶段,把水印文字、logo 直接绘制到视频 TS 分片画面像素里面。不管用什么播放器、什么设备,只要播放视频就一定会看到水印,水印属于视频画面的一部分,无法通过前端关闭。
DOM 动态水印:网页播放器层面,用 div、canvas 标签浮在 video 视频上层,叠加一层文字水印。水印不在视频分片内部,只是网页页面一层 DOM 元素。用户截图、录屏可以抓到水印,但是用户简单关掉页面 DOM 元素,水印就直接消失,视频原始分片里面完全没有水印。
很多外包、乙方项目需求没有写清楚,测试只看网页页面有水印就验收上线。上线之后用户抓 M3U8 下载 TS 分片,原始视频文件完全不带水印,版权防护完全失效。
遇到水印相关业务问题,我会使用 m3u8live.cn,加载 M3U8 流,观察画面是否自带水印。如果网页调试工具打开视频看不到水印,说明业务是前端 DOM 浮层水印,不是视频硬水印。
二、硬水印(转码内置画面水印)优缺点
✅优点:水印绘制在视频像素画面内,不管任何播放器、下载分片,水印永久存在,防下载盗播能力强。 ❌缺点:
- 需要转码、推流阶段处理,消耗 CPU 算力;
- 水印文字、位置修改,需要重新转码;
- 点播一旦转码完成,水印内容不能动态变更。
直播硬水印:编码器或者转码服务实时把 logo 绘制到每帧画面。
三、DOM 动态浮层水印优缺点
✅优点:前端 JS 可以随意修改水印文字、位置,不用重新转码视频,开发实现简单,不消耗转码算力。 ❌致命短板:水印只是页面 DOM,不属于视频内容。调试控制台删掉 div,水印立刻消失;下载 M3U8 分片拿到原始无水印视频。只适合防普通网页截图,不能防止用户下载原始媒体资源。
四、业务高频踩坑场景
坑 1:需求要版权防盗水印,只做了前端 DOM 浮层水印
产品需要防止视频被下载传播,开发只做网页 DOM 水印。网页看有水印,下载 TS 分片视频完全干净无水印,防盗目标完全达不到。
坑 2:测试只在业务项目页面测试水印,不剥离页面验证
测试只在自己业务页面看有水印就验收。把 M3U8 地址复制出来,放到干净的网页调试工具打开,视频画面没有水印,才发现只是 DOM 浮层水印。
坑 3:混淆点播和直播水印能力
点播硬水印一旦转码完成,水印文字不能改;直播硬水印可以在推流端动态调整水印文字。很多新手以为点播也可以不重新转码动态修改硬水印。
坑 4:多码率 Master 流,部分清晰度档位忘记打硬水印
只给默认清晰度打上水印,其余子码率分片没有绘制水印,用户手动切换到其他档位拿到无水印视频。
五、业务开发测试注意点
- 需求文档写清楚:是需要视频画面内置硬水印,还是仅网页 DOM 浮层水印。两者防盗能力差距巨大。
- 验收硬水印,不能只在自己业务页面看效果。把 M3U8 链接放到干净网页调试工具打开,如果视频画面依旧有水印,才代表是真正内置硬水印。
- 多码率业务,每一个子清晰度都要验证水印是否存在。
- 点播硬水印,修改水印文字必须重新转码;直播硬水印可以推流端动态调整。
- DOM 浮层水印只能作为辅助,不能当成版权防盗的手段。
六、总结
硬水印是直接绘制到视频分片画面像素内部;DOM 动态水印只是网页上层浮层,不属于视频本身。很多业务踩坑,需求要防盗水印,结果只实现前端 DOM 浮层,下载分片视频完全没有水印。验收硬水印,要剥离业务页面,使用干净的播放环境验证视频画面自带水印。借助网页调试工具,打开待测 M3U8,如果视频画面依旧存在水印,才证明水印真正内置到分片里面。