传输协议选型:WebRTC vs RTMP vs HLS vs SRT

做低延迟流媒体,第一个绕不开的坎就是协议选型。我见过太多团队,架构画得漂漂亮亮,结果协议选错,延迟直接崩到十几秒。今天咱们把这四个主流协议掰开揉碎,看看它们到底适合什么场景。

先看延迟天花板

先给个直观数据。我习惯把延迟分成三个档位:

协议 典型延迟 延迟等级
WebRTC 200ms - 500ms 实时级
SRT 500ms - 2s 准实时级
RTMP 2s - 5s 低延迟级
HLS 6s - 30s+ 普通级

注意,这是理想网络下的数据。实际项目中,HLS 跑到 40 秒我都见过。为什么会这样?后面细说。

WebRTC:实时互动的王者

WebRTC 的设计目标就是「人跟人说话不能有延迟感」。200ms 以内,这是它的底线。

核心原理:它基于 UDP,走的是 P2P 直连。没有分片、没有缓冲队列,数据到了就渲染。我参与过一个在线教育项目,老师板书和学生端必须同步在 300ms 以内,当时选 WebRTC 几乎是唯一解。

适用场景:视频会议、远程医疗、在线教育、云游戏、直播连麦。

避坑指南:我曾经在一个跨国会议项目里踩过坑——WebRTC 的 ICE 穿透在对称 NAT 环境下成功率只有 70% 左右。后来加了 TURN 中继,延迟虽然涨到 400ms,但至少能连上了。嗯,这里要注意,TURN 服务器带宽成本很高,一台 10Gbps 的机器一天能烧掉几千块。

SRT:传输层的可靠卫士

SRT 是 Haivision 开源的协议,本质是在 UDP 上做 ARQ(自动重传)和 FEC(前向纠错)。说白了,它既要 UDP 的低延迟,又要 TCP 的可靠性。

我为什么推荐 SRT:在弱网环境下,SRT 的表现比 RTMP 好太多。我记得有一次给某省级电视台做直播推流,上行带宽只有 2Mbps,丢包率 5%。RTMP 直接卡死,SRT 靠着 FEC 硬扛下来了,延迟控制在 1.5 秒以内。

特性 SRT RTMP
传输层 UDP + ARQ/FEC TCP
抗丢包 强(可配置重传策略) 弱(TCP 队头阻塞)
延迟可控性 高(可设置 latency) 中
防火墙友好 一般(需开放 UDP 端口) 好(HTTP 端口)

个人习惯:做直播推流时,如果网络条件差,我优先选 SRT。如果网络好且需要低延迟,才考虑 RTMP。

RTMP:老将的坚守与局限

RTMP 是 Adobe 在 2000 年代初推出的协议,基于 TCP 长连接。它曾经是直播行业的标配,现在嘛……有点老了。

优点:生态成熟,几乎所有编码器和 CDN 都支持。延迟能做到 2-5 秒,对于非互动场景够用。

致命伤:TCP 的队头阻塞。你想想看,如果网络丢了一个包,TCP 要等重传,后面的数据都得排队。我做过测试,在 2% 丢包率下,RTMP 延迟直接飙到 15 秒以上。

注意:RTMP 默认只支持 Flash,现在浏览器已经全面禁用 Flash。如果要走 Web 播放,必须转封装成 HLS 或 WebRTC。多一层转封装,就多一层延迟。

HLS:兼容性之王,延迟之殇

HLS 是 Apple 推出的,基于 HTTP 的流媒体协议。它的核心思路是「切分 + 索引」:把视频切成 2-10 秒的小片段,客户端通过 m3u8 索引文件拉取。

延迟为什么高?因为至少要等一个分片下载完才能播放。如果分片是 6 秒,那延迟至少 6 秒。再加上索引文件的更新周期,10 秒以上很常见。

不过,Apple 后来推出了 Low-Latency HLS(LL-HLS),把分片切到 1 秒以内,延迟能降到 3-5 秒。但部署起来比较麻烦,需要 CDN 支持。

版本 分片大小 典型延迟 部署难度
标准 HLS 6-10s 10-30s 低
LL-HLS 0.5-1s 3-5s 高

适用场景:标准 HLS 适合点播和延迟不敏感的大规模直播(如体育赛事、电视直播)。LL-HLS 适合需要兼容 iOS 生态的低延迟场景。

选型决策树

我一般按这个逻辑选协议:

  1. 需要实时互动(延迟 < 500ms) → WebRTC
  2. 弱网环境推流(延迟 1-2s 可接受) → SRT
  3. 标准直播推流(延迟 2-5s) → RTMP
  4. 大规模分发 + iOS 兼容 → HLS
  5. 混合场景 → 推流用 SRT/RTMP,播放端用 WebRTC/HLS

你想想看,实际项目中很少只用一种协议。我做过一个直播平台,主播端用 SRT 推流,服务端转封装,观众端根据网络情况自动切换 WebRTC(低延迟模式)和 HLS(高兼容模式)。

协议对比全景图

下面这张图是我自己整理的协议选型框架,涵盖了传输层、延迟、抗丢包和适用场景四个维度:

流媒体传输协议选型全景图 WebRTC UDP + DTLS + SRTP SRT UDP + ARQ + FEC RTMP TCP 长连接 HLS HTTP + TS 分片 延迟 200ms 1s 5s 30s+ WebRTC SRT RTMP HLS 抗丢包 SRT (FEC + ARQ) WebRTC (NACK) RTMP HLS 适用场景 视频会议 在线教育 弱网推流 卫星传输 标准直播推流 编码器对接 大规模分发 iOS 兼容 选型建议:推流端优先 SRT/RTMP,播放端根据延迟需求选 WebRTC 或 HLS

最后说几句实在的

协议选型没有银弹。我见过有人非要用 WebRTC 做点播,结果服务器成本翻了 10 倍。也见过有人死守 RTMP,结果用户投诉延迟高到没法用。

我的建议是:先定延迟目标,再选协议,最后做混合架构。延迟目标定在 500ms 以内,就老老实实上 WebRTC。定在 2-3 秒,SRT 加 LL-HLS 的组合很香。如果只是做电视直播,标准 HLS 完全够用,别折腾。