流媒体协议(四):RTMP、HLS、WebRTC,直播推拉流到底是怎么回事?

前几篇我们把视频和音频分别压缩好了。现在问题来了:这些数据怎么从主播的摄像头,传到几万观众的手机上?一根网线扛不住几万人同时拉流——流媒体协议就是解决"一对多实时分发"的。

大家好,我是黒漂技术佬。

我做智慧农业的大棚监控那会儿,需要把 RTSP 摄像头画面推到 Web 端和小程序端实时观看。这中间涉及 RTSP 拉流 → FFmpeg 转 RTMP 推流 → 流媒体服务器 → HLS/WebRTC 分发 一整条链路。这一篇,我把这条链路上的每一个协议掰开揉碎讲清楚。


一、流媒体的核心矛盾:延迟 vs 兼容性

所有流媒体协议都在两个指标之间做取舍:

低延迟 ←——————————————————→ 高兼容性 / 稳定性
 (WebRTC)      (RTMP)    (HLS)
  • 要极致低延迟(视频会议、云游戏):选 WebRTC,端到端 < 1 秒。
  • 要普适兼容(手机浏览器看直播):选 HLS,几乎所有设备原生支持,但延迟 5~30 秒。
  • 中间方案(PC 直播、传统 CDN):RTMP/HTTP-FLV,延迟 2~5 秒。

没有银弹,选型永远看场景。


二、RTMP:直播行业的"上古神器"

RTMP(Real-Time Messaging Protocol) 是 Adobe 在 2002 年为 Flash 播放器设计的协议,基于 TCP 长连接。虽然 Flash 在 2020 年正式入土,但 RTMP 依然活跃在推流端。

2.1 RTMP 的工作模式

推流端(OBS / FFmpeg)         流媒体服务器(nginx / SRS)       观众端(浏览器 / App)
     │                               │                               │
     ├──── RTMP 推流 ────────────────►│                               │
     │   rtmp://server/live/room1     │                               │
     │                               ├──── HTTP-FLV / HLS 分发 ──────►│
     │                               │   http://server/live/room1.flv │

推流用 RTMP,但拉流(观众看)在现代浏览器里不能直接用 RTMP——浏览器不支持 Flash 了。所以服务器收到 RTMP 流后,会转成 HTTP-FLV 或 HLS 再分发给观众。这就是典型的"RTMP 进,多协议出"。

2.2 RTMP 的优缺点

优点缺点
延迟低(2~5 秒)浏览器原生不支持拉流
OBS/FFmpeg/几乎所有直播软件都支持推流基于 TCP,弱网容易卡
生态极成熟,CDN 普遍支持Adobe 已停更,技术不再演进

RTMP 还在用的原因单纯是:推流端没有更好的替代者。 WebRTC 推流复杂,SRT 推流设备支持少,RTMP 虽然老,但够用。


三、HLS:苹果的"万能胶协议"

HLS(HTTP Live Streaming) 是苹果在 2009 年推出的流媒体协议。它的核心思路出奇简单:把直播流切成一个个小文件(.ts),用 HTTP 分发给观众。

3.1 HLS 工作流程

推流端 ──RTMP──► 流媒体服务器
                      │
             ┌────────┴────────┐
             │  切片器(m3u8)  │
             └────────┬────────┘
                      │
        ┌─────────────┼─────────────┐
        ▼             ▼             ▼
  live001.ts    live002.ts    live003.ts  ...(每个 2~10 秒)
        │             │             │
        └─────────────┴─────────────┘
                      │
            live.m3u8(播放列表)
            ┌───────────────────────────────────┐
            │ #EXTM3U                            │
            │ #EXT-X-TARGETDURATION:5            │
            │ #EXTINF:5.0,                       │
            │ live001.ts                         │
            │ #EXTINF:5.0,                       │
            │ live002.ts                         │
            │ #EXTINF:5.0,                       │
            │ live003.ts                         │
            └───────────────────────────────────┘
                      │
                      ▼
            观众浏览器:读取 m3u8 → 按列表顺序下载 ts → 播放

3.2 为什么 HLS 的延迟那么高?

因为播放器必须缓存至少 2~3 个 ts 分片才敢开始播放(防止网络抖动导致中断)。一般每个分片 5~10 秒,加上编码和传输,延迟自然就上去了。

降低 HLS 延迟的方法:缩小分片时长到 2 秒,播放器缓存降到 2 片。但代价是 HTTP 请求频率变高,服务器压力增大,网络差的观众更容易卡。

3.3 HLS 的核心优势

  • 所有浏览器原生支持:iOS Safari、Android Chrome、PC 浏览器,全都不用装插件。
  • 天然穿透防火墙和 CDN:走标准 HTTP/HTTPS,跟普通网页请求一样,不会被企业防火墙拦截。
  • 自适应码率(ABR):一个 master.m3u8 里可以列出 480P / 720P / 1080P 三路流,播放器根据网速自动切换——网络差自动降画质,不中断。

四、HTTP-FLV:RTMP 的"轻量替身"

HTTP-FLV 本质就是把 RTMP 的 FLV 数据包通过 HTTP 长连接持续传输。延迟接近 RTMP(2~5 秒),但浏览器通过 HTML5 的 MSE(Media Source Extensions)就能播。

B 站直播网页端用的就是 HTTP-FLV(配 flv.js)。不过 flv.js 只支持 H.264 + AAC,H.265 需要 hls.js 或 WebRTC。

协议延迟浏览器支持代表场景
RTMP2~5s❌ 需插件推流端
HTTP-FLV2~5s✅ flv.jsB 站网页直播
HLS5~30s✅ 原生支持手机直播、点播
WebRTC< 1s✅ 原生 API视频会议、低延迟直播

五、WebRTC:实时通信的"瑞士军刀"

WebRTC(Web Real-Time Communication) 是 Google 在 2011 年开源的实时通信框架,浏览器内置,不需要任何插件。

5.1 WebRTC 做了什么?

它把一整套实时通信技术打包进了浏览器:

  • 音视频编解码:内置 Opus 音频、VP8/VP9/H.264 视频编码。
  • NAT 穿透:STUN / TURN 协议,自动解决内网穿透问题。
  • 点对点传输:默认 P2P,数据不经过服务器中转(除非 TURN)。
  • 安全加密:强制 DTLS + SRTP 加密,中间人无法窃听。

5.2 WebRTC 不等于"不用服务器"

这是个常见误解。WebRTC 的 P2P 需要在两端建立连接,中间需要:

  • 信令服务器(Signaling Server):交换 SDP(会话描述)和 ICE 候选地址。WebRTC 标准故意没规定信令协议——你可以用 WebSocket、MQTT,甚至两只鸽子传纸条。
  • STUN/TURN 服务器:解决 NAT 穿透。两个都在内网的设备,大概率需要 TURN 服务器中转——这时候就不是真正的 P2P 了。

5.3 一对多直播用 WebRTC?

P2P 天生是一对一。要做一对多,需要 SFU(Selective Forwarding Unit,选择性转发单元):

主播 ──► SFU 服务器 ──► 观众 1
                   ──► 观众 2
                   ──► 观众 3
                   ──► ...

SFU 收到主播的一路流,转发给每个观众。观众端仍然只是"一对一"连接 SFU,不需要直连主播。主流 SFU 开源方案:mediasoup、Janus、LiveKit。


六、实战选型速查表

你的场景推荐方案
传统直播(游戏、秀场),延迟 2~5 秒可接受RTMP 推流 + HTTP-FLV + HLS 分发
手机 App 直播,观众全在移动端RTMP 推流 + HLS 分发
视频会议 / 在线教育 / 低延迟交互WebRTC + SFU
监控摄像头画面拉到 Web 端RTSP → FFmpeg 转 RTMP → nginx-rtmp → HTTP-FLV
无人机图传 / 远程遥控WebRTC(超低延迟) 或 SRT(弱网优化)
海外分发HLS + CDN(CloudFront / Cloudflare)

本篇核心回顾

协议诞生延迟传输基础现状
RTMP2002 Adobe2~5sTCP推流标配,拉流不用了
HLS2009 Apple5~30sHTTP移动端直播王者
HTTP-FLV国产衍生2~5sHTTP 长连接B 站等 PC 端在用
WebRTC2011 Google<1sUDP + P2P实时通信首选

知道这些协议是什么、延迟多少、谁在用,你已经超过 90% 的同行了。

我是黒漂技术佬,下篇见。

Logo

火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。

更多推荐