disableRemotePlayback是HTML5 video标签唯一原生防投屏提示属性,仅Chrome/Edge可靠支持、Safari部分支持、Firefox完全无效,须以布尔形式直接写入标签(如<video controls disableRemotePlayback>),不可赋值或动态设置。

disableRemotePlayback 属性是唯一能快速部署、且无需额外 SDK 或服务端改造的防投屏手段,但它只对 Chrome/Edge 有效,Safari 部分支持,Firefox 完全无效——别指望它“防住所有人”,只适合做轻量级提示。
怎么写才让 disableRemotePlayback 生效
必须作为布尔属性原样写在 <video> 标签里,不带等号、不赋值、不加引号:
<video controls disableRemotePlayback> <source src="video.mp4" type="video/mp4"> </video>
以下写法全部无效:
disableRemotePlayback="true"disableRemotePlayback="disabled"-
:disableRemotePlayback="true"(Vue 模板绑定也不行) - 用 JavaScript 动态设置:
videoEl.setAttribute('disableRemotePlayback', '')—— 多数浏览器忽略
为什么点了 Cast 按钮还是能投
因为 disableRemotePlayback 不是拦截器,只是向浏览器发一个“建议”:
立即学习“前端免费学习笔记(深入)”;
- Chrome/Edge:会隐藏地址栏 Cast 图标、禁用右键菜单里的“投射到设备”选项,但用户仍可手动点浏览器右上角 Cast 按钮投整个标签页
- Safari:iOS 15.4+ / macOS 12.3+ 仅对 AirPlay 弹窗做灰显提示,不影响系统级镜像
- Firefox:该属性被完全忽略,Cast 按钮照常可用
- 所有浏览器:无法阻止 macOS QuickTime 录屏、Windows Xbox Game Bar、手机拍摄投屏画面
真正要降低投屏风险,得组合这几件事
单靠前端属性毫无意义,必须配合服务端和播放逻辑:
- 服务端生成带签名、有时效的视频 URL(如
/proxy/video/abc?t=1734642000&s=abcd1234),过期即 403 - 前端监听
webkitbeginfullscreen或enterpictureinpicture,触发暂停 + 提示:“检测到全屏行为,已暂停播放” - 敏感内容启用 DRM(Widevine/FairPlay),并在 license server 策略中设
outputProtection: { hdcp: "required" },强制要求 HDCP 输出通路 - 避免把原始 MP4 地址直接塞进
src,改用 HLS/DASH 分片流,配合动态密钥 + HTTPS + Referer 校验
最常被忽略的一点:即使你写了 disableRemotePlayback,只要视频 URL 是静态、长期有效的,用户照样能抓包后用 VLC 或 ffplay 直接拉流——防投屏的前提,是先防直链盗用。



















