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

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

探讨前端通过 EME(加密媒体扩展)结合 DRM 技术实现视频防录屏的原理与实战。EME 作为 W3C 标准 API,协调网页应用与浏览器 CDM 模块交互,利用硬件级安全通道防止截图或录屏捕获画面。文章解析 Widevine、PlayReady 等常见 DRM 方案,提供从初始化 EME 到处理 License 请求的完整代码示例,并对比不同场景下的防护方案选择,指出 L1 级硬件保护的有效性限制及适用边界。

SecGuard发布于 2026/3/15更新于 2026/10/2285 浏览
前端 EME DRM 反录屏原理与实战代码

前端真的能防录屏?EME(加密媒体扩展)DRM 反录屏原理 + 实战代码

EME 架构示意图

在实际开发中,很多开发者会问:为什么有些视频网站截屏或录屏时画面是黑的?单纯靠 JS 监听用户快捷键往往不够可靠,绕过的方法太多了。要实现真正的防护,必须依赖浏览器原生支持的 API。

这就是 Encrypted Media Extensions (EME)。

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、AndroidGoogle Widevine
Edge/WindowsMicrosoft PlayReady
Safari/iOS/macOSApple FairPlay

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

在浏览器层面,EME + DRM 可以实现防截屏 / 防录屏,其核心机制如下:

  1. 媒体文件是加密的 内容本身是加密视频(如 Widevine Modular 加密),没有密钥无法解码。

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

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

  3. 禁止系统级截屏(取决于 DRM)

    例如在 Chrome 上播放 Netflix 时:

    • 用系统截图键 → 图片是黑屏
    • 用屏幕录制 → 视频区域是黑色

这是因为 Widevine L1(硬件级)支持防截屏。DRM 解密后的视频帧不会进入 CPU 层,而是直接通过 GPU 的保护路径输出,截屏 API 无法捕获受保护的视频帧。

  1. 禁止浏览器扩展抓取视频帧 DRM 视频帧在受保护的视频管线(Video Pipeline)中,扩展无法获取。

  2. 禁止调试工具记录媒体流 媒体解密密钥不会暴露在 JS 中。

EME 播放加密媒体的代码示例

我们知道 EME 是一套 W3C 标准化的 JavaScript API,它在不暴露密钥和明文数据的前提下,充当网页应用、浏览器和底层 DRM 系统(CDM)之间的'安全信使'。

以下示例展示一个使用 EME 播放加密 DASH(mpd)视频的完整流程。

注意:需要服务器提供 License Server 才能真正播放。

创建 video 标签

<video id="video" controls width="600"></video>

JavaScript 初始化 EME

这里我们需要请求支持的 DRM,配置好 initDataTypes 和 videoCapabilities,然后建立 MediaKeys 对象。

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 请求

当视频开始播放遇到加密内容时,会触发 encrypted 事件。我们需要模拟从许可证服务器获取许可证并喂给 CDM。

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);
});

设置加密视频源

最后设置视频源,通常使用 DASH 格式的 mpd 文件。

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. 前端真的能防录屏?EME(加密媒体扩展)DRM 反录屏原理 + 实战代码
  2. 什么是 Encrypted Media Extensions(EME)
  3. 常见 DRM 方案
  4. EME 是如何实现浏览器防截屏 / 防录屏
  5. EME 播放加密媒体的代码示例
  6. 创建 video 标签
  7. JavaScript 初始化 EME
  8. 处理 license 请求
  9. 设置加密视频源
  10. 如何为你的应用选择方案?
  11. 总结

更多推荐文章

查看全部
  • Javashop 百万级并发压测报告:架构与性能深度解析
  • llamafile 使用指南:从下载到运行仅需 3 步
  • Linux 进程等待机制:wait 与 waitpid 详解及僵尸进程治理
  • 栈的压入弹出序列验证算法详解
  • C++ 二叉搜索树原理与高效实现
  • Modbus CRC16 算法规范与计算示例
  • Python 数据分析进阶:模型评估与图像处理实战
  • 利用Python与Virtual Audio Cable实现系统音频的实时捕获与处理
  • 利用腾讯云 HAI 与 DeepSeek 快速构建个人网页
  • GitHub Codespaces 部署 OpenClaw 个人智能体实战指南
  • 快速排序非递归实现详解:基于栈的模拟思路
  • Jenkins Pipeline 自动化构建与部署 Java 项目
  • Qwen3-ASR-1.7B 在博物馆 AR 导览中的实时语音转写与知识图谱应用
  • 从三年前端到韩国 CS 硕士:留学复盘与回归前端之路
  • C++ 核心特性解析:引用、内联函数与 nullptr 用法
  • 人工智能基础:DIKWP 模型与学习路径
  • 前端文件上传方案:分片上传与断点续传实战
  • CentOS 系统定时执行 Python 邮件发送任务的五种方案
  • 二分查找算法详解(上)
  • 本地 AI 小说生成器部署指南:从零搭建与配置

相关免费在线工具

  • 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