前端真的能防录屏?EME(加密媒体扩展)DRM 反录屏原理 + 实战代码
很多小伙伴在访问某些视频网站时,尝试截屏或录屏会发现画面是黑的。这不仅仅是简单的 JS 监听快捷键就能解决的,因为绕过方法太多了。真正有效的方案依赖于浏览器原生支持的 API,也就是 Encrypted Media Extensions (EME)。
什么是 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,它运行在沙箱中,不暴露密钥给 JS。
-
禁止系统级截屏(取决于 DRM) 以 Chrome 播放 Netflix 为例,使用系统截图键或屏幕录制工具,视频区域会显示为黑色。这是因为 Widevine L1(硬件级)支持防截屏,DRM 解密后的视频帧不会进入 CPU 层,而是直接通过 GPU 的保护路径输出,截屏 API 无法捕获受保护的视频帧。
-
禁止浏览器扩展抓取视频帧 DRM 视频帧在受保护的视频管线(Video Pipeline)中,普通扩展无法获取。
-
禁止调试工具记录媒体流 媒体解密密钥不会暴露在 JS 环境中。
EME 播放加密媒体的代码示例
我们知道 EME 是一套 W3C 标准化的 JavaScript API,它在不暴露密钥和明文数据的前提下,充当网页应用、浏览器和底层 DRM 系统(CDM)之间的'安全信使'。以下示例展示一个使用 EME 播放加密 DASH(mpd)视频的完整流程。
注意:需要服务器提供 License Server 才能真正播放。
创建 video 标签
< = =>


