WebRTC是浏览器原生支持的实时音视频通信技术,核心组件包括MediaStream(获取音视频)、RTCPeerConnection(建立P2P连接)和RTCDataChannel(传输数据),需信令服务器交换SDP和ICE候选者,并依赖STUN/TURN穿透NAT。
WebRTC(Web Real-Time Communication)是浏览器原生支持的实时音视频通信技术,无需插件即可实现点对点(P2P)的视频通话、音频通话和数据传输。它直接在浏览器中运行,核心能力包括媒体采集、编解码、网络传输和连接建立,关键在于用 JavaScript 控制整个流程。
要实现点对点视频通话,离不开以下三部分协同工作:
navigator.mediaDevices.getUserMedia() 获取本地摄像头和麦克风流,生成 MediaStream 对象,可直接绑定到 标签播放。RTCPeerConnection 本身不负责发现对方或传递连接信息。两个浏览器必须先交换三类关键信息才能连通:
以 A 主叫 B 为例,简化步骤如下:
getUserMedia 获取本地流 → 添加到 RTCPeerConnection(addTrack 或 addStream)→ 调用 createOffer() → setLocalDescription(offer) → 通过信令服务器把 offer 发给 B。RTCPeerConnection → setRemoteDescription(offer) → 调用 createAnswer() → setLocalDescription(answer) → 把 answer 发回 A。setRemoteDescription(answer);
B 在收集到 ICE 候选者后,通过信令逐个发给 A;A 同样将自己收集到的候选者发给 B。addIceCandidate() 后,若网络可达,连接自动建立,ontrack 事件触发,远端视频流即可渲染到页面。大多数用户处于路由器后(私有 IP),无法被直接访问。WebRTC 用以下方式解决连接问题:
stun:stun.l.google.com:19302)。RTCPeerConnection,由其自动按优先级尝试连接路径。不复杂但容易忽略。真正写起来要处理错误回调、连接状态监听(iceConnectionState)、流事件(ontrack、onremovetrack)、重连逻辑和兼容性(如 Safari 对某些 API 的差异)。但只要理清信令职责、SDP 生命周期和 ICE 流程,一个基础双人视频通话就能跑通。