最常见原因是非https或非localhost的http协议导致浏览器静默禁用;需确保安全上下文、用户手势触发、检查设备可用性并正确处理权限状态。

getUserMedia 调用失败:权限被拒或返回空流
浏览器拒绝访问摄像头/麦克风,最常见原因是页面没走 HTTPS 或 localhost 以外的 HTTP 协议。Chrome、Edge 等现代浏览器会直接禁用 getUserMedia,控制台报错 NotAllowedError: Permission denied 或 NotFoundError: Requested device not found。
解决办法很简单:
- 开发阶段务必用
http://localhost(不是file://协议打开 HTML 文件) - 部署到线上时必须启用 HTTPS;HTTP 域名下
getUserMedia会被静默禁用 - 调用前加个兜底判断:
navigator.mediaDevices.enumerateDevices()看设备列表是否为空,排除物理设备未接入或被占用 - 移动端需额外加
playsinline和autoplay属性,否则视频可能黑屏或弹全屏
RTCPeerConnection 连接卡在 iceConnectionState = "checking"
看到 iceConnectionState 长时间停在 checking,基本说明 ICE 候选交换失败或 STUN/TURN 配置无效。这不是代码写错了,而是网络协商根本没跑通。
关键检查点:
-
iceServers至少配一个可用 STUN 地址,比如{ urls: "stun:stun.l.google.com:19302" };别只写stun:不带域名或端口 - 确保信令通道真正送达了
offer和answer—— 很多人本地测试时用两个标签页,但忘了手动复制粘贴 SDP,导致对方setRemoteDescription没执行 -
onicecandidate触发后必须把event.candidate发给对方;如果只发了一次就停止,后续候选(如 TURN 中继地址)就丢了 - 在
chrome://webrtc-internals里看 ICE 日志,搜索failed或timeout,能快速定位是 STUN 不通还是防火墙拦截
远程视频不显示:ontrack 事件没触发或 srcObject 赋值无效
本地视频能播,远程一直黑屏,大概率是媒体流没正确绑定到 <video></video> 元素。注意 ontrack 是唯一可靠的接收远端流入口,别依赖 onaddstream(已废弃)。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
实操要点:
- 监听必须写在
new RTCPeerConnection之后、setRemoteDescription之前,否则可能错过首次 track -
ontrack回调里拿到的是event.streams[0],不是event.stream;老教程里这个字段名容易写错 - 赋值用
videoElement.srcObject = stream,不是src;设成src会触发重新加载,且不支持 MediaStream - 移动端 iOS Safari 必须加
playsinline autoplay muted,否则自动静音+强制全屏,导致画面不可见
一端离开后另一端无法跟新用户连通
这是 WebRTC 多人场景中最隐蔽的坑:旧 RTCPeerConnection 对象没关闭,残留的 ICE 状态、DTLS 握手、媒体轨道会干扰新连接的协商,导致 createOffer 后 SDP 缺失 codec 或 candidate 为空。
必须显式清理:
- 调用
peerConnection.close(),而不是只设peerConnection = null - 手动 stop 所有本地轨道:
localStream.getTracks().forEach(t => t.stop()) - 清空
srcObject:localVideo.srcObject = null、remoteVideo.srcObject = null - 如果用了自定义信令(比如 WebSocket),记得
send({ type: 'leave' })通知服务端清除房间状态,避免新用户收到旧 offer
WebRTC 的“点对点”只是媒体流层面的直连,背后所有协商逻辑都极度依赖时序和状态清理。一个没 close() 的连接,比没初始化的连接更危险——它看起来正常,却会在你换人重连时突然失效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










