一、WebRTC 的前世今生:从实验室到实时通信的基石

聊 WebRTC 之前,我想先问你一个问题:在 2011 年之前,浏览器之间怎么实现实时音视频通话?

答案是——几乎不可能。那时候你要么装插件(Flash、Silverlight),要么用 ActiveX,要么自己写个桌面客户端。说白了,实时通信是“富人的游戏”,门槛高得离谱。

我 2012 年刚接触这个领域时,还在用 Flash 做视频会议。每次用户说“我浏览器崩溃了”,我都得先问一句“Flash 版本对吗?”——那种体验,真的不想再经历第二次。

1.1 发展历史:三个关键节点

WebRTC 不是一夜冒出来的。它的发展脉络,我总结成三个关键节点:

时间 事件 意义
2011 年 Google 收购 GIPS 公司 获得了核心的音频处理引擎(AEC、NR、AGC)
2011 年 5 月 Google 开源 WebRTC 项目 将 GIPS 技术免费开放,推动浏览器原生支持
2013 年 1 月 Chrome 和 Firefox 首次实现互连 证明 WebRTC 可以跨浏览器工作,里程碑事件

我记得 2013 年那次互连测试,我特意开了两台电脑,一台 Chrome、一台 Firefox,两边视频通了的那一刻,办公室里几个人围过来看——说实话,挺激动的。因为这意味着“浏览器原生实时通信”不再是概念,而是真能用了。

核心认知:WebRTC 不是从零造轮子,而是把 GIPS 在 VoIP 领域积累十几年的技术,直接搬进了浏览器。你想想看,这相当于把专业级通信能力,免费塞给了每个前端开发者。

1.2 核心应用场景:不止是视频通话

很多人一提 WebRTC 就想到“视频聊天”,其实它的应用场景比这宽得多。我按使用频率排个序:

  1. 视频会议 / 远程协作——最经典场景。Zoom、Google Meet、腾讯会议底层都在用 WebRTC。
  2. 直播连麦 / 互动直播——主播和观众之间低延迟互动,WebRTC 比 HLS 延迟低一个数量级。
  3. 远程医疗 / 在线教育——对延迟和稳定性要求极高,WebRTC 的拥塞控制算法是核心优势。
  4. 屏幕共享 / 远程桌面——getDisplayMedia API 就是 WebRTC 的一部分。
  5. P2P 文件传输 / 数据通道——很多人不知道,WebRTC 的 DataChannel 可以传任意二进制数据。

我在项目中遇到过最“奇葩”的场景,是用 WebRTC 做无人机图传。客户要求延迟低于 200ms,传统的 RTMP 方案根本做不到。最后我们用 WebRTC 的 Simulcast 分层编码,配合自适应码率,硬是把延迟压到了 150ms 以内。嗯,这种场景,非 WebRTC 不可。

一个小建议:如果你刚开始学 WebRTC,别只盯着视频。先玩明白 DataChannel,它比音视频简单得多,而且能帮你理解底层传输机制。

1.3 浏览器兼容性概览:别踩这些坑

兼容性这个话题,我每次讲都要多说两句。因为——WebRTC 的兼容性问题,坑过很多人,包括我自己。

先看一张主流浏览器的支持情况:

浏览器 WebRTC 支持 前缀 / 注意事项
Chrome / Edge (Chromium) ✅ 完整支持 无前缀,标准 API
Firefox ✅ 完整支持 部分 API 实现略有差异(如 SDP 格式)
Safari (iOS / macOS) ✅ 支持(14.0+) 早期版本需要 webkit 前缀,H264 优先
内置浏览器 ⚠️ 部分支持 X5 内核,需额外适配
IE 11 ❌ 不支持 无原生 WebRTC,需降级方案

我曾经在 Safari 上栽过一次:用户反馈视频黑屏,查了半天,发现是 Safari 默认使用 H264 编码,而我的信令服务器只协商了 VP8。从那以后,我养成了一个习惯——编码协商逻辑里,永远把 H264 和 VP8 都列上。

避坑指南:如果你要兼容 iOS Safari,记住三点:

  • 必须支持 H264(Safari 不支持 VP8 硬解)
  • getUserMedia 必须在用户手势触发后调用(点击事件里)
  • 音频采样率限制:Safari 不支持 48kHz 以外的采样率

1.4 一张图看懂 WebRTC 知识体系

下面这张 SVG 图,是我自己梳理的 WebRTC 核心知识框架。你可以把它当作整个课程的地图:

WebRTC 核心知识体系 应用层(视频会议 / 直播 / 远程医疗) WebRTC API 层(getUserMedia / RTCPeerConnection / RTCDataChannel) 引擎层(核心模块) 音频引擎(AEC / NR / AGC) 视频引擎(VP8 / H264 / Simulcast) 传输引擎(ICE / DTLS / SRTP) 传输层(UDP / ICE / STUN / TURN / SCTP) 网络层(IP / UDP / 防火墙穿透) 本课程覆盖引擎层及以上

这张图我建议你保存下来。每次学完一个模块,回来看看它在整个体系中的位置——你会发现,WebRTC 其实没那么复杂,它就是一个分层清晰、模块解耦的实时通信框架。

1.5 为什么现在学 WebRTC 正当时?

说句实在话,WebRTC 已经过了“要不要用”的讨论阶段。2024 年的今天,它已经是实时通信的事实标准。我身边做音视频的团队,几乎都在用 WebRTC 或者基于它二次开发。

三个理由:

  • 浏览器原生支持——不用装任何插件,Chrome、Firefox、Safari、Edge 全部内置。
  • 生态成熟——信令服务器有 Janus、Mediasoup、LiveKit,客户端 SDK 覆盖所有平台。
  • 性能持续优化——Google 每年投入大量资源改进拥塞控制、编码器、延迟。

我个人觉得,WebRTC 就像当年的 jQuery——刚出来时大家观望,等生态成熟了,不学反而成了短板。这门课我会带你从封装解析的角度,把 WebRTC 的底层逻辑彻底讲透。准备好了吗?我们开始。