disableRemotePlayback仅是提示性属性,非强制策略;Chrome/Edge隐藏投屏按钮,Safari(iOS 15.4+)弱提示AirPlay,Firefox无视;系统录屏、抓包等完全不受限;真正防投屏需DRM的outputProtection配合服务端license策略与HTTPS安全上下文。

disableRemotePlayback 属性根本不能防投屏
它只是个提示,不是策略。设 disableRemotePlayback 后,Chrome/Edge 会隐藏投屏按钮、禁用右键 Cast 选项;但 Safari(iOS 15.4+)只对 AirPlay 做弱提示,Firefox 完全无视。用户仍可:用系统级录屏(QuickTime、Xbox Game Bar)、手机拍屏、抓包提取分片 URL —— 这些行为完全不受该属性影响。
真正能限制投屏输出的是 DRM 的 outputProtection 配置
EME 本身不控制输出,但 Widevine / PlayReady / FairPlay 的 license server 可在下发许可证时声明硬件级约束:
-
outputProtection设为"HDCP_REQUIRED",CDM 就拒绝在未启用 HDCP 的链路(如普通 HDMI 线、非认证投屏设备)上解密视频帧 - FairPlay 要求 TLS 证书可信 +
fairplay-require-hdcp响应头,否则播放器直接静音或报MediaKeyError - 注意:这个限制只生效于 DRM 解密后的视频帧输出阶段,对未加密的 poster 图、Canvas 截图、系统录屏无防护力
前端 EME 初始化必须配合服务端 license 策略才有效
光写 video.disableRemotePlayback = true 或加属性毫无意义。关键路径是:
- 服务端打包时必须嵌入 PSSH box(Widevine)或 SKD(FairPlay),且 manifest 中声明
<contentprotection></contentprotection>元素 - 前端调用
navigator.requestMediaKeySystemAccess()时,initDataTypes和audioCapabilities/videoCapabilities必须匹配 license server 支持的 profile(比如"cenc"+"avc1.640028") - license request 发出后,服务端需在响应中返回含
outputProtection策略的 JWPL(Widevine)或 XML(PlayReady)——这不是前端能控制的,全靠后端鉴权逻辑
别忽略 HTTPS 和安全上下文的硬性门槛
所有 EME 操作强制要求 HTTPS,HTTP 下 navigator.requestMediaKeySystemAccess 直接返回 undefined。更隐蔽的坑是:
立即学习“前端免费学习笔记(深入)”;
- 本地开发用
http://localhost可以跑通,但一旦部署到子路径(如https://a.com/app/),CDN 或反向代理若没透传Upgrade-Insecure-Requests头,部分 CDM 会拒绝初始化 - iframe 嵌套场景下,父页面若没设
sandbox="allow-scripts allow-same-origin",MediaKeys创建会抛SecurityError - Chrome 120+ 对非安全上下文中的
MediaKeySessiongenerateRequest 行为开始标记为 deprecated,未来可能彻底阻断



















