HTML视频在智能电视上无法真正“防投屏”,核心在于浏览器不参与投屏协议协商,真正起作用的是电视接收能力、网络发现机制和资源访问控制。

HTML视频在智能电视上无法真正“防投屏”,因为浏览器本身不参与投屏协议协商;所谓“防”,其实是阻断外部设备发现、连接或拉取视频流的路径。核心手段只有三个:禁用接收端能力、切断网络发现、隔离视频资源访问。
为什么<video>加controls或disablePictureInPicture没用
这些属性只影响浏览器内播放器 UI 和内部行为,对投屏完全无感。电视端能否投,取决于它是否能作为 Cast/Miracast/DLNA 接收器被发现,和网页里<video>有没有右键菜单、能不能全屏无关。Chrome 的 Cast 按钮投的是整个标签页,不是<video>元素;DLNA 推送靠的是 App 或系统级服务扫描本地 HTTP 服务,不是解析 HTML 标签。
从电视端关闭投屏接收功能(最直接)
这是唯一能立竿见影的方式,但依赖电视品牌和型号支持:
- 小米/Redmi 电视:设置 → 投屏设置 → 关闭“无线投屏”或开启“投屏需密码”
- 海信电视:设置 → 网络 → 多屏互动 → 关闭“启用多屏互动”
- 创维/酷开:设置 → 设备偏好 → 屏幕镜像 → 切换为“关闭”
- 三星 Tizen:设置 → 连接 → 镜像屏幕 → 关闭“允许镜像”
- LG webOS:设置 → 共享与连接 → 连接设备 → 关闭“允许设备连接”
注意:部分老款电视没有关闭入口,只能拔网线或关 Wi-Fi——物理隔离是最彻底的“防”。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
立即学习“前端免费学习笔记(深入)”;
前端代码能做的有限但关键动作
前端无法阻止投屏,但可增加投屏链路中的失败点:
- 避免使用公网可访问的视频地址:
<video src="https://cdn.example.com/video.mp4">→ 改为动态 token 鉴权 URL,且 token 有效期短、绑定 UA/IP,让电视端 WebView 无法复用 - 禁用 MSE(Media Source Extensions):
if ('mediaSource' in window) { delete window.MediaSource; },可让 hls.js / dash.js 失效,间接阻断 WebRTC/HLS 方案投屏 - 不暴露原始流地址:HLS 的
.m3u8文件本身是纯文本,若被电视浏览器直接访问就能播;应将.m3u8路径设为登录态接口(如/api/play.m3u8?token=xxx),并校验 session - 禁止跨域加载:
<video crossorigin="anonymous">+ 后端响应头Access-Control-Allow-Origin: null,可让非同源投屏脚本读不到视频元信息
网络层隔离才是硬防线
所有投屏协议(Cast/Miracast/DLNA)都依赖局域网设备发现(mDNS/SSDP/UDP 广播),只要切断这一步,前端再怎么播,电视也“看不见”你的设备:
- 路由器开启“AP 隔离”或“客户端隔离”,让手机和电视无法互相 ping 通
- 给电视分配独立 VLAN 或使用访客网络,并关闭该网络与其他子网的通信
- 在电视所在网络段的防火墙规则中,屏蔽 UDP 端口 1900(SSDP)、8008/8009(Cast)、5353(mDNS)
别信“前端加个oncontextmenu禁右键就能防投屏”——投屏不走右键,也不走 JS 上下文;真正起作用的永远是电视有没有开着接收口,以及它和你手机之间通不通得了那几条 UDP 广播包。


















