跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

前端 EME DRM 反录屏原理与实战代码

EME(加密媒体扩展)是 W3C 标准 API,用于浏览器播放受 DRM 保护的媒体。通过 CDM 模块解密,视频帧经 GPU 保护路径输出,可防止系统级截屏和录屏。实现流程包括初始化 EME、处理 License 请求及设置加密源。防录屏效果取决于 DRM 等级(如 Widevine L1),移动端或特定浏览器支持较好,PC 浏览器通常难以完全防护。构建防盗录需结合 DRM 加密、授权服务器及硬件支持。

CryptoLab发布于 2026/2/4更新于 2026/7/247.3K 浏览
前端 EME DRM 反录屏原理与实战代码

在这里插入图片描述

什么是 Encrypted Media Extensions(EME)

相信小伙伴在上一些视频网站的时候,在你截屏或录屏的时候,图片是黑屏或视频区域是黑色,为什么这些视频网站能防录屏?可能有小伙伴要说了,可以监听用户快捷键啊,我只能说想得还是太简单了~如果仅仅是靠一些 JS,那可绕过的方法实在太多了!

必须是浏览器原生支持的 API 才可行,这个就是 Encrypted Media Extensions。

在这里插入图片描述

Encrypted Media Extensions 是 W3C Web API,用于让浏览器播放受 DRM(Digital Rights Management 数字版权保护)加密的媒体。 用通俗一点的话来说:EME 就是一套 JS API,用来控制浏览器的 DRM 解密模块。

更多详细的介绍可以参考官方文档:https://www.w3.org/TR/encrypted-media/

常见 DRM:

平台DRM
Chrome、AndroidGoogle Widevine
Edge/WindowsMicrosoft PlayReady
Safari/iOS/macOSApple FairPlay

EME 是如何实现浏览器防截屏 / 防录屏

在浏览器层面,EME + DRM 可以实现防截屏 / 防录屏:

媒体文件是加密的 内容本身是 加密视频(如 Widevine Modular 加密)

浏览器通过 CDM 模块解密 浏览器内置一个 CDM(Content Decryption Module)

例如 Chrome 内置 Widevine CDM CDM 运行在沙箱,不暴露密钥

禁止系统级截屏(取决于 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 标签
<video id="video" controls width="600"></video>
JavaScript 初始化 EME
const video = document.getElementById("video");
async function initEME() {
    // 请求支持的 DRM,如 Widevine
    const keySystem = "com.widevine.alpha";
    // 配置
    const config = [{
        initDataTypes: ["cenc"],
        videoCapabilities: [{
            contentType: 'video/mp4; codecs="avc1.64001E"'
        }]
    }];
    // 请求 DRM 支持
    const access = await navigator.requestMediaKeySystemAccess(keySystem, config);
    const mediaKeys = await access.createMediaKeys();
    await video.setMediaKeys(mediaKeys);
    console.log("EME 初始化成功");
}
initEME();
处理 license 请求

模拟从许可证服务器获取许可证

video.addEventListener("encrypted", async (event) => {
    const session = video.mediaKeys.createSession();
    session.addEventListener("message", async (e) => {
        // 向授权服务器发送的消息
        const license = await fetch("/license", {
            method: "POST",
            body: e.message
        }).then(r => r.arrayBuffer());
        // 将 license 喂给 CDM
        await session.update(license);
    });
    // 初始化 CDM
    await session.generateRequest(event.initDataType, event.initData);
});
设置加密视频源
video.src = "https://example.com/encrypted.mpd"; // 加密视频

如何为你的应用选择方案?

如果你的核心需求是防止用户复制、下载、非法传播视频/音频内容,那么你需要实现 EME DRM。这需要后端准备加密的内容、部署许可证服务器,并前端集成相应的 DRM 厂商(如 Widevine)的 SDK。

如果你的核心需求是防止用户通过截屏、录屏泄露应用界面(如聊天窗口、文档、软件界面),那么你应该寻找操作系统或框架提供的防截屏 API。对于 Web 应用,这通常意味着你需要将应用打包为 Electron 等桌面应用才能实现。

总结

EME 本质是浏览器访问 DRM 的 API,本身不实现防录屏。 真正的防录屏能力来自 DRM(Widevine / PlayReady / FairPlay)以及设备硬件。 在 L1 级设备上,可完全禁止系统级截屏与录屏;在 PC 浏览器(L3)上基本无法防。 如果你计划构建一个防盗录系统,应采用:

DRM 加密 → 授权服务器 移动端 App 或支持 L1 的浏览器 加上行为水印 / 动态鉴权等配套策略

目录

  1. 什么是 Encrypted Media Extensions(EME)
  2. EME 是如何实现浏览器防截屏 / 防录屏
  3. EME 播放加密媒体的代码示例
  4. 创建 video 标签
  5. JavaScript 初始化 EME
  6. 处理 license 请求
  7. 设置加密视频源
  8. 如何为你的应用选择方案?
  9. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 缓存算法实战:LRU 与 LFU 的 Java 实现与原理解析
  • Java Map 和 Set 数据结构详解与对比
  • Python 爬虫实战:使用 DrissionPage 抓取 BOSS 直聘岗位数据
  • LangChain 智能体中间件如何参与 Agent、Model 和 Tool 交互
  • Nuxt 框架集成 Element UI 及 CSS 引入方案
  • 使用 NCC 和 PKG 将 Node.js 项目打包为跨平台可执行文件
  • Welford 算法:海量数据均值与方差的流式计算
  • Java 串口通信库 jSerialComm 跨平台开发指南
  • YOLO 无人机目标检测实战:7261 张数据集与 QT 可视化界面实现
  • DeepSeek-OCR-WEBUI 开源实践与部署指南
  • 异步编程实战:构建高性能 Python 网络应用
  • 基于 NebulaGraph 与大语言模型构建中医药鼻炎知识图谱
  • Web3 学习指南:从比特币到以太坊的演进
  • 使用 Rokid 灵珠平台搭建旅游 AR 智能体实战指南
  • Linux 多路转接 IO 模型详解:select
  • Nginx 安装配置、核心参数及反向代理实战
  • 主流大模型横评:GPT、Claude、Gemini、Llama 及国产模型选型指南
  • Hunyuan-MT-7B WEBUI 本地化部署方案
  • 飞书机器人图片消息发送实战与常见报错解决
  • C# 荣获 2023 年度编程语言奖,TIOBE 2024 年 1 月排行榜解读

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online