1. 流媒体基础与低延迟概述

大家好,欢迎来到这门课。我是你们的老朋友,一个在流媒体领域摸爬滚打了十几年的工程师。

咱们开门见山。这门课叫《从零构建低延迟流媒体系统》,第一件事,得把「流媒体」和「低延迟」这两个词掰扯清楚。别觉得基础,我见过太多人把 HLS 延迟降到 5 秒就欢呼「低延迟」了——嗯,在云游戏场景里,5 秒够你死三回了。

1.1 什么是流媒体?

流媒体,说白了就是「边下边播」。你不需要等整个视频文件下载完,只要拿到一小段数据就能开始播放。传统的下载播放,你得等一个 2GB 的 MP4 文件全部落盘;流媒体不一样,服务器把视频切成一个个小片段,客户端拿到第一个片段就开播,后面的片段在后台继续拉。

这个机制听起来简单,但实现起来坑不少。我早期做过一个点播项目,用户反馈「怎么播到一半卡住了?」查了半天,原来是切片时长设得太长,客户端缓存策略又激进,结果内存爆了。所以你看,切片大小、缓存策略、网络抖动,这些都会直接影响用户体验。

核心要点: 流媒体的本质是「数据生产 → 数据分发 → 数据消费」的实时管道。延迟,就是这根管道的「响应速度」。

1.2 低延迟的定义与指标

聊低延迟之前,得先定个标准。到底多少算「低」?不同场景差别很大。

我个人习惯把延迟分成两个维度来考量:

  • 端到端延迟(End-to-End Latency):从摄像头采集到观众屏幕显示,中间经过编码、传输、解码、渲染的总耗时。这是最核心的指标。
  • 首屏时间(Time to First Frame):用户点击播放,到屏幕上出现第一帧画面的时间。这个指标直接影响用户留存——你想想看,如果点开一个直播,黑屏超过 3 秒,你还有耐心等吗?

不同场景对这两个指标的要求完全不同。我整理了一张表,方便你对照:

应用场景 端到端延迟要求 首屏时间要求 典型协议
传统直播(体育、新闻) 10-30 秒 < 3 秒 HLS, DASH
互动直播(连麦、带货) < 3 秒 < 1 秒 WebRTC, SRT
云游戏 < 100 毫秒 < 500 毫秒 WebRTC, 自研 UDP
远程协作(会议、医疗) < 200 毫秒 < 1 秒 WebRTC
注意: 延迟不是越低越好。低延迟往往意味着更高的带宽消耗和更差的抗丢包能力。我曾经在一个弱网环境下测试 WebRTC,延迟压到了 50 毫秒,结果画面全是马赛克——这就是「为低延迟牺牲质量」的典型反面教材。

1.3 低延迟的应用场景

咱们挑三个典型场景聊聊,看看低延迟到底有多重要。

1.3.1 直播

传统直播用 HLS,延迟通常在 15-30 秒。这在「看球赛」场景下还能忍——反正你也就比现场慢半拍。但到了「直播带货」就不行了。主播喊「3、2、1,上链接!」结果观众那边延迟了 10 秒,链接早被抢光了。所以现在主流直播平台都在推低延迟方案,LL-HLS 能把延迟压到 3-5 秒,WebRTC 甚至能到 1 秒以内。

1.3.2 云游戏

这是对延迟最苛刻的场景。你按一下键盘,画面要在 100 毫秒内响应,否则玩家就会觉得「手感不好」。我参与过一个云游戏项目,初期用 SRT 协议,延迟在 150 毫秒左右,测试玩家反馈「像在泥潭里走路」。后来换成 WebRTC + 自研 FEC 策略,延迟降到 60 毫秒,玩家才说「嗯,能玩了」。你看,60 毫秒的差距,就是「能玩」和「不能玩」的分界线。

1.3.3 远程协作

视频会议、远程手术、协同设计,这些场景要求延迟低于 200 毫秒,否则对话就会「抢话」——你这边刚开口,对方那边已经说完了,整个交流节奏全乱。WebRTC 是这类场景的标配,因为它天然支持双向通信和低延迟。

1.4 主流低延迟协议对比

协议选型是架构师的核心决策之一。选错了,后面改起来成本极高。我把自己用过的几个主流协议做个对比,希望能帮你少走弯路。

1.4.1 WebRTC

WebRTC 是目前低延迟领域的「王者」。它基于 UDP,天然支持 P2P,延迟可以做到 100 毫秒以内。但它的缺点也很明显:

  • 架构复杂:需要部署 STUN/TURN 服务器处理 NAT 穿透
  • 抗丢包能力弱:纯 UDP 在弱网下容易丢包,需要自己实现 FEC 或 NACK
  • 大规模分发困难:P2P 模式不适合万人同时观看的场景

我曾经在一个项目中用 WebRTC 做万人直播,结果 TURN 服务器带宽直接被打满,成本飙升。后来改成了 WebRTC + CDN 混合架构,才把成本降下来。

1.4.2 SRT

SRT 是 Haivision 开源的协议,基于 UDP 但加入了 ARQ(自动重传)机制。它的优势是:

  • 抗丢包能力强:适合卫星链路、公共互联网等不稳定环境
  • 延迟可控:通常 200-500 毫秒
  • 配置简单:不需要 STUN/TURN

但 SRT 的延迟比 WebRTC 高,而且浏览器原生不支持,需要借助插件或转码。我一般用它做「推流端到服务器」的传输,而不是直接到观众端。

1.4.3 LL-HLS

LL-HLS 是 Apple 在 2019 年推出的低延迟版本 HLS。它把传统的 6 秒切片缩小到 1-2 秒,并引入了「部分片段」的概念,让播放器可以更早开始播放。延迟能降到 3-5 秒。

它的优势是兼容性好——所有 Apple 设备原生支持,CDN 也广泛支持。但 3-5 秒的延迟对于互动场景还是不够用。我个人的建议是:如果目标用户以 iOS 为主,且对延迟要求不高,LL-HLS 是个稳妥的选择。

1.4.4 HESP

HESP 是 Harmonic 推出的协议,号称「WebRTC 级别的延迟,HLS 级别的兼容性」。它通过 HTTP/2 的 Server Push 和特殊的切片策略,把延迟压到了 1 秒以内。但它的生态还不够成熟,目前主要用在专业广播领域。

为了让你更直观地对比,我画了一张协议对比图:

主流低延迟协议对比 延迟(毫秒) 100ms 300ms 500ms 1s 3s WebRTC 50-150ms SRT 200-500ms HESP 300-800ms LL-HLS 3-5s 传统 HLS 15-30s 协议选型建议 • 互动直播/云游戏 → WebRTC • 弱网推流/卫星传输 → SRT • 专业广播/低延迟HLS → HESP • iOS生态/通用直播 → LL-HLS 我的经验: 没有「万能协议」,只有「适合场景」。 我通常会在架构中预留协议切换能力, 比如推流用 SRT,分发用 WebRTC + LL-HLS 双通道。 这样既能保证推流稳定性,又能兼顾 不同终端的兼容性。
我的建议: 如果你是刚开始做低延迟系统,先从 WebRTC 入手。它虽然复杂,但生态最成熟,社区最活跃,踩坑也能找到人问。等你把 WebRTC 吃透了,再去看 SRT 和 HESP,会发现很多概念是相通的。