前端 EME DRM 反录屏原理与实战代码
在视频网站截屏黑屏的现象背后,其实是浏览器原生 API 在起作用。单纯依靠 JavaScript 监听快捷键来防录屏并不可靠,绕过方法太多。真正有效的方案是 Encrypted Media Extensions (EME),它是一套控制浏览器 DRM 解密模块的 JS API。
什么是 Encrypted Media Extensions(EME)
Encrypted Media Extensions 是 W3C Web API,用于让浏览器播放受 DRM(Digital Rights Management 数字版权保护)加密的媒体。用通俗一点的话来说:EME 就是一套 JS API,用来控制浏览器的 DRM 解密模块。
更多详细的介绍可以参考官方文档:https://www.w3.org/TR/encrypted-media/
常见 DRM 支持
| 平台 | DRM |
|---|---|
| Chrome、Android | Google Widevine |
| Edge/Windows | Microsoft PlayReady |
| Safari/iOS/macOS | Apple FairPlay |
EME 是如何实现浏览器防截屏 / 防录屏
在浏览器层面,EME + DRM 可以实现防截屏 / 防录屏,核心机制如下:
- 媒体文件是加密的:内容本身是加密视频(如 Widevine Modular 加密)。
- 浏览器通过 CDM 模块解密:浏览器内置一个 CDM(Content Decryption Module),例如 Chrome 内置 Widevine CDM。CDM 运行在沙箱中,不暴露密钥。
- 禁止系统级截屏:取决于 DRM 级别。例如在 Chrome 上播放 Netflix 时,用系统截图键或屏幕录制,视频区域是黑色。
- 禁止浏览器扩展抓取视频帧:DRM 视频帧在受保护的视频管线(Video Pipeline)中,扩展无法获取。
- 禁止调试工具记录媒体流:媒体解密密钥不会暴露在 JS 中。
这是因为 Widevine L1(硬件级)支持防截屏,DRM 解密后的视频帧不会进入 CPU 层,而是直接通过 GPU 的保护路径输出,截屏 API 无法捕获受保护的视频帧。
EME 播放加密媒体的代码示例
我们知道 EME 是一套 W3C 标准化的 JavaScript API,它在不暴露密钥和明文数据的前提下,充当网页应用、浏览器和底层 DRM 系统(CDM)之间的'安全信使'。以下示例展示一个使用 EME 播放加密 DASH(mpd)视频的完整流程。
注意:需要服务器提供 License Server 才能真正播放。
创建 video 标签
<video id="video" controls width="600"></video>


