1. WebRTC 概述:起源、技术栈与应用场景

WebRTC 这玩意儿,说白了就是让浏览器能直接视频通话。不用装插件,不用额外客户端。我第一次接触它是在 2013 年,当时还在做传统的 Flash 直播方案。说实话,那时候觉得这技术挺糙的,延迟高、兼容差。但后来我发现,我错了。

1.1 WebRTC 的起源与发展

2011 年,Google 收购了 Global IP Solutions(GIPS),一家做 VoIP 引擎的公司。然后 Google 把这套技术开源了,就是后来的 WebRTC。2013 年,W3C 和 IETF 开始标准化。我记得当时 Chrome 和 Firefox 还在打架,各自实现不一样,搞得我们开发者很头疼。

发展到现在,WebRTC 已经是 W3C 推荐标准了。所有主流浏览器都支持,包括 Safari。嗯,这里要注意,Safari 的支持来得比较晚,大概 2017 年才跟上。

关键里程碑:

  • 2011 - Google 收购 GIPS,开源 WebRTC
  • 2013 - W3C 发布首个工作草案
  • 2017 - Safari 正式支持 WebRTC
  • 2021 - WebRTC 成为 W3C 推荐标准

1.2 核心技术栈

WebRTC 不是单一技术,是一整套协议栈。我习惯把它分成三层:

WebRTC 核心技术栈 应用层 API getUserMedia · RTCPeerConnection · RTCDataChannel 会话/信令层 SDP · ICE · STUN · TURN · DTLS 传输层 SRTP/SRTCP · RTP/RTCP · SCTP 编解码层 VP8 · VP9 · H.264 · Opus · G.711

你想想看,浏览器要完成实时通信,得做多少事?采集摄像头、编码、打包、穿越 NAT、解码、渲染。每一层都有坑。我曾经在一个项目中,ICE 连接死活建立不起来,查了两天才发现是 STUN 服务器配置错了。

1.3 核心 API 详解

WebRTC 暴露给 JavaScript 的 API 其实就三个:

API 作用 我踩过的坑
getUserMedia 采集音视频 移动端必须加 {audio: true, video: {facingMode: 'user'}}
RTCPeerConnection 建立 P2P 连接 ICE 候选者收集顺序影响连接速度
RTCDataChannel 传输任意数据 SCTP 缓冲区满会导致丢消息

个人习惯:我每次写 getUserMedia 都会加 try-catch。因为用户可能拒绝授权,或者设备不支持。别问我怎么知道的。

1.4 应用场景分析

WebRTC 能做的事,比大多数人想象的多。不只是视频通话。

  • 视频会议 - 最经典场景。Zoom、Google Meet 都在用。但要注意,多人会议需要 SFU 或 MCU 架构。
  • 远程医疗 - 对延迟要求极高。我曾经帮一家医院做过远程超声方案,延迟必须控制在 200ms 以内。
  • 直播连麦 - 主播和观众互动。这里有个坑:推流用 RTMP,连麦用 WebRTC,需要做协议转换。
  • 屏幕共享 - 用 getDisplayMedia 实现。注意帧率设置,我一般设 15fps,太高了 CPU 扛不住。
  • IoT 实时监控 - 摄像头数据直接推送到浏览器。省去了转码服务器。

1.5 与传统流媒体方案对比

很多人问我:WebRTC 和 RTMP、HLS 比,到底强在哪?我直接给你看对比:

特性 WebRTC RTMP HLS
延迟 < 500ms 1-3s 5-30s
浏览器原生支持 是 需插件 是
P2P 能力 原生支持 不支持 不支持
编解码 VP8/VP9/H.264 H.264 H.264
抗丢包 强(FEC+NACK) 弱 弱
部署复杂度 高 中 低

注意:WebRTC 延迟低,但部署复杂。你需要 STUN/TURN 服务器,还要处理信令。如果只是做直播,HLS 可能更省事。选方案要看场景,别盲目追新。

1.6 为什么选择 WebRTC

我做了十年流媒体,从 RTMP 到 HLS 到 WebRTC。说实话,WebRTC 是最难搞的,但也是最有价值的。原因有三:

  1. 延迟是硬需求 - 视频通话延迟超过 1 秒,用户就受不了。WebRTC 能做到 200ms 以内。
  2. 自适应码率 - 网络波动时自动降码率。这个功能在移动端特别重要。我见过太多方案在网络差的时候直接卡死。
  3. 安全 - 强制 DTLS 加密。不像 RTMP 那样裸奔。现在浏览器都要求安全上下文才能用 WebRTC。

嗯,最后说一句。WebRTC 不是银弹。它解决的是实时互动问题,不是分发问题。如果你要做万人直播,还是得靠 CDN。但如果你要做的是两个人或者小范围的实时互动,WebRTC 是目前最好的选择。