WebRTC是浏览器原生支持的点对点音视频通信技术,核心由MediaStream、RTCPeerConnection和RTCDataChannel三部分组成,需信令服务与STUN/TURN服务器协同实现连接。
WebRTC 是浏览器原生支持的实时音视频通信技术,不用装插件、不依赖中间服务器转发媒体流,两个浏览器之间能直接“面对面”传视频和音频。构建视频聊天应用的核心,就是用它建立点对点连接、交换媒体流、处理网络变化。
它不是单个 API,而是由三部分协同工作:
navigator.mediaDevices.getUserMedia() 拿到本地摄像头和麦克风流,显示在页面上靠 标签。WebRTC 自己不负责“怎么找到对方”,这得靠你实现的信令服务(比如 WebSocket 或 HTTP)。双方要交换三类信息:
STUN 服务器帮你发现公网地址(90% 场景够用);遇到严格防火墙或对称 NAT,就得加 TURN 服务器中转媒体流——推荐用免费的 Twilio STUN/TURN 或自建 Coturn。
假设 A 主动发起,B 加入同一房间:
getUserMedia 获取本地流 → 添加到 RTCPeerConnection → 调用 createOffer → setLocalDescription → 发 Offer 给 B;setRemoteDescription → 调用 createAnswer → setLocalDescription → 发 Answer 给 A;setRemoteDescription;icecandidate 事件,把每个 Candidate 通过信令发给对方;addstream(旧版)或 track(新版)事件,把对方的远程流绑定到自己的 元素上。新手常卡在这几个地方:
getUserMedia 在非 HTTPS(或 localhost 以外的 http)下会被浏览器禁用;iceConnectionState 是 “failed” 还是 “disconnected”,配合日志查 Candidate 是否正常交换;track 动态添加:新版 Chrome/Firefox 不再触发 addstream,要用 pc.ontrack =
e => { video.srcObject = e.streams[0]; };pc.close()、stream.getTracks().forEach(t => t.stop()),否则摄像头灯常亮。基本上就这些。不复杂但容易忽略细节。跑通两人直连后,再扩展多人(用 SFU 架构)、录制、美颜、屏幕共享,都是顺延出来的能力。