2、WebRTC整体架构:WebRTC的架构分层、核心模块介绍

好,咱们今天聊聊WebRTC的整体架构。说实话,很多初学者一上来就写代码,结果遇到问题根本不知道从哪查起。我个人习惯是,先搞清楚这玩意儿到底分几层,每层管什么。就像盖房子,你得先知道地基、承重墙、水电管线都在哪,对吧?

2.1 架构分层:三层模型

WebRTC的架构,说白了就是三层:应用层核心引擎层底层传输层。我画了张图,你一看就明白。

应用层 (Application Layer) Web API (getUserMedia, RTCPeerConnection, RTCDataChannel) 核心引擎层 (Core Engine Layer) 音视频引擎 采集/编解码/回声消除 传输层 ICE/DTLS/SRTP/拥塞控制 信令管理 SDP协商/状态机 底层传输层 (Transport Layer) UDP / TCP / P2P穿透 (STUN/TURN)

你看,最上层是应用层,就是我们写JavaScript调用的那些API——getUserMediaRTCPeerConnectionRTCDataChannel。中间是核心引擎层,这是WebRTC最复杂、最核心的部分。最下面是传输层,负责数据怎么从A点到B点。

关键点:WebRTC的架构设计遵循「关注点分离」原则。每一层只关心自己的事,上层不用管底层怎么传数据,底层也不用管上层传的是什么内容。

2.2 核心模块详解

2.2.1 音视频引擎

音视频引擎,我习惯叫它「多媒体心脏」。它负责三件事:采集处理编解码

  • 采集:通过getUserMedia拿到摄像头和麦克风的数据流。嗯,这里要注意,不同浏览器对设备权限的处理不太一样,我踩过坑。
  • 处理:包括回声消除(AEC)、降噪(NS)、自动增益控制(AGC)。我曾经在一个会议室场景里,回声消除没调好,结果对方听到自己的声音延迟了半秒又传回来,那体验简直灾难。
  • 编解码:VP8、VP9、H.264、AV1。浏览器默认支持VP8和H.264,但VP9的压缩率更高,画质更好。

避坑指南:我曾经在项目中遇到一个问题——用户用Chrome正常,但用Safari就黑屏。查了半天,原来是Safari对H.264的硬件解码支持更好,但VP8的软件解码性能跟不上。所以,编解码器的选择一定要做兼容性测试

2.2.2 传输层

传输层是WebRTC的「高速公路」。它要解决两个核心问题:怎么找到对方,以及怎么安全高效地传数据

协议/技术 作用 我的经验
ICE 交互式连接建立,找到最优路径 ICE的候选者收集顺序很重要,我遇到过UDP被防火墙阻断,最后靠TURN中继才连上
STUN 获取公网IP和端口 大部分场景够用,但对称NAT下STUN会失效
TURN 中继转发,穿透失败时的保底方案 带宽成本高,我一般只在P2P连不上时才启用
DTLS 加密传输通道 握手延迟大约1-2个RTT,对实时性有轻微影响
SRTP 加密音视频数据 默认开启,你不需要额外配置

你想想看,为什么WebRTC要用UDP而不是TCP?因为实时通信最怕延迟。TCP丢包会重传,导致后续数据包排队等待,延迟越来越高。UDP丢包就丢了,大不了用前向纠错(FEC)或者丢帧补偿。说白了,实时通信是「宁可丢包,不要延迟」。

2.2.3 信令

信令是WebRTC里「最容易被误解」的部分。很多人以为WebRTC自带信令,其实不是。WebRTC只规定了信令的状态机和SDP格式,但信令的传输方式——你用WebSocket、HTTP轮询、还是邮件发送——完全由开发者自己决定。

信令的核心就是交换两样东西:

  1. SDP(会话描述协议):描述你的媒体能力,比如支持哪些编解码器、分辨率、带宽等。
  2. ICE候选者:告诉对方你的IP地址和端口,方便建立P2P连接。

注意:信令通道必须在媒体通道建立之前完成。我曾经犯过一个错误——先建立了WebSocket连接,然后才去创建RTCPeerConnection,结果SDP交换的时机没控制好,导致连接一直卡在「connecting」状态。正确的做法是:先创建PeerConnection,再通过信令交换SDP和ICE候选者

2.3 浏览器支持情况

说到浏览器支持,我记得2015年那会儿,Chrome和Firefox已经支持了,但Safari和Edge还在观望。现在情况好多了,主流浏览器基本都支持WebRTC,但细节上还是有差异。

浏览器 WebRTC支持 编解码器 备注
Chrome ✅ 完整支持 VP8, VP9, H.264, AV1 最稳定,推荐开发首选
Firefox ✅ 完整支持 VP8, VP9, H.264 对VP9支持较好
Safari ✅ 支持(14+) H.264, VP8 早期版本有兼容问题,现在基本OK
Edge ✅ 完整支持 VP8, H.264 Chromium内核后与Chrome一致
微信内置浏览器 ⚠️ 部分支持 H.264 X5内核,建议用H.264

为什么会这样?因为WebRTC标准虽然统一了API,但底层的编解码器实现、ICE策略、甚至getUserMedia的约束语法,各家浏览器都有「小脾气」。我建议你开发时,至少用Chrome和Safari各测一遍,这两个浏览器的差异最大。

一句话总结:WebRTC的架构就是「应用层调API,引擎层做处理,传输层管连接」。信令是胶水,把两端粘在一起。浏览器支持方面,Chrome最稳,Safari要小心,微信内嵌浏览器建议降级方案。


公众号:蓝海资料掘金营,微信deep3321