1. WebRTC实时通信概述:架构、挑战与丢包影响

各位同学好,我是老张。做实时音视频这行十几年了,踩过的坑比走过的路还多。今天咱们开始《WebRTC丢包恢复与抗丢包编码》的第一章,先把地基打牢。

WebRTC这玩意儿,说白了就是浏览器之间直接通话的技术。不用装插件,不用额外客户端,打开网页就能视频。但真正把它用好,你得理解它背后的架构和那些让人头疼的网络问题。

1.1 WebRTC整体架构

先看一张整体架构图,我习惯把WebRTC分成四层:

核心要点:WebRTC不是单一协议,而是一整套实时通信解决方案的集合。

WebRTC 四层架构 应用层(Application Layer) JavaScript API · getUserMedia · RTCPeerConnection · RTCDataChannel 会话层(Session Layer) SDP 协商 · ICE 连接建立 · STUN/TURN 穿透 传输层(Transport Layer) SRTP/SCTP · DTLS 加密 · NACK/RTX 重传 · FEC 前向纠错 网络层(Network Layer) UDP · IPv4/IPv6 · NAT 穿透 · 带宽估计 丢包恢复主要工作在传输层,但需要会话层和应用层的配合

这四层各司其职。应用层给你提供API,会话层负责建立连接,传输层保证数据安全到达,网络层处理底层的网络通信。我们这门课重点在传输层,尤其是丢包恢复这块。

1.2 实时通信的核心挑战

做实时通信,说白了就是在跟物理定律较劲。我当年做第一个视频通话项目时,天真地以为只要把数据发出去就行了。结果呢?画面卡成PPT,声音断断续续,用户直接投诉到老板那里去了。

实时通信面临的主要挑战,我总结为以下四点:

挑战 具体表现 影响
延迟 端到端延迟超过400ms 对话失去自然感,像对讲机
抖动 网络延迟忽高忽低 音频卡顿、视频花屏
丢包 数据包在传输中丢失 画面撕裂、声音中断
带宽波动 可用带宽动态变化 视频质量忽高忽低

我的经验:这四个挑战中,丢包是最难处理的。延迟你可以通过优化路由解决,抖动可以用jitter buffer吸收,带宽波动可以动态调整码率。但丢包一旦发生,数据就没了,你得想办法把它找回来或者补上去。

1.3 丢包对实时通信的影响

丢包到底有多可怕?咱们分场景来看。

1.3.1 音频丢包

音频数据是连续采样的,每个包包含几十毫秒的音频帧。丢一个包,就意味着这段时间的声音完全丢失。

  • 1%丢包率:偶尔听到"咔哒"声,还能接受
  • 3%丢包率:声音开始断断续续,听感明显变差
  • 5%丢包率:关键词语可能丢失,对话需要反复确认
  • 10%丢包率:基本无法正常通话

我记得有一次线上会议,有个同事的网络丢包率到了8%。他说的每句话都像被剪刀剪过一样,我们只能靠猜来理解他的意思。最后不得不让他关掉视频,只保留音频,才勉强能沟通。

1.3.2 视频丢包

视频丢包的影响更直观。视频编码依赖帧间预测,一个关键帧丢了,后面几十个依赖它的帧全废了。

注意:视频丢包有"雪崩效应"。一个I帧丢了,后续所有P帧和B帧都无法解码,直到下一个I帧到来。这会导致画面长时间卡住或绿屏。

我曾经在一个项目中遇到过极端情况:用户网络丢包率15%,视频画面直接变成马赛克拼图,人脸都认不出来。用户说"你们这产品还不如QQ视频",这话我记了好几年。

1.3.3 丢包对用户体验的量化影响

丢包率 音频MOS分 视频PSNR(dB) 用户体验评级
0% 4.5 40+ 优秀
1% 4.0 35 良好
3% 3.2 28 一般
5% 2.5 22 差
10%+ 1.5 15 不可用

你看这个表,丢包率从0%到5%,用户体验直接从"优秀"掉到"差"。这就是为什么我们要花30章来讲丢包恢复——它直接决定了产品的生死。

1.4 WebRTC的丢包恢复策略概览

WebRTC内置了几种丢包恢复机制,我简单列一下,后面每章都会详细讲:

  1. NACK(否定确认):接收方告诉发送方"这个包我没收到,再发一次"
  2. RTX(重传):发送方收到NACK后,重新发送丢失的包
  3. FEC(前向纠错):发送冗余数据,接收方直接用冗余恢复丢失的包
  4. PLC(丢包隐藏):接收方自己"猜"丢失的数据,比如音频的波形插值
  5. 码率自适应:检测到丢包时主动降低码率,减少网络压力

核心思路:没有一种策略能解决所有丢包问题。实际产品中需要组合使用,根据网络状况动态切换。这也是我们这门课要讲的核心——怎么组合、怎么调优。

好了,第一章就到这里。你想想看,丢包这件事,看似简单,但牵扯到编码、传输、解码、播放整个链路。后面我们会一步步深入,把每个环节都吃透。