越偏单向广播、观众越多,越适合 HLS;越要双向互动,越不适合。 点播几乎没有理由不用它。
5.1.3 算清了延迟代价,这一节拿这个代价去对照真实场景。 5.2 开始钻细节,从 m3u8 的文件格式讲起。
一、场景与延迟容忍度
把常见场景按「能忍多少延迟」排一排,结论就很清楚: 演唱会与赛事直播 10~30 秒,常用 HLS。 在线教育大班课 6~15 秒,也常用。 电商带货 3~6 秒,更偏 HTTP-FLV,因为主播要看到「观众刚说的话」,延迟差一秒体感就差很多。 视频点播对延迟没有要求,几乎必用。 视频会议与连麦要小于 0.5 秒,只能选 WebRTC。
规律:越偏「单向广播」、观众越多,越适合 HLS。 越偏「双向互动」、延迟要求越狠,越不适合。
注意「观众多」这一条不是绝对的: 小规模也能用 HLS,只是它的优势发挥不出来。 选型时真正卡住人的往往不是规模,而是延迟。
二、起播时间怎么估
假设切片 4 秒、客户端先下 3 个切片再开播,四步的开销是: 取 m3u8 约 50 毫秒——几 KB,一次往返。 取 3 个切片约 150 毫秒——并行下,每个几十 KB。 解封装首帧约 30 毫秒——先找 PAT/PMT,再找关键帧。 解码首帧约 50 毫秒——硬件解码更快,软件要慢一倍。
算下来 300 毫秒左右就能出画面,看起来不错。 但这是「切片都已经存在服务器上」的情况。
直播时切片是边生成边发的,所以你还要等「最新的那个切片被切完」。 这一段才是真正的大头,正好等于一个切片时长。 所以「起播 300 毫秒」和「延迟 4 秒」是两回事,别混着说。
三、为什么点播几乎必用
因为点播对延迟没有要求,而 HLS 的优点全都对上了: ① 切片是静态文件:可以直接扔到对象存储,成本极低。 没有人看的老片,存着几乎不花钱。 ② 支持拖动:跳到任意时间点就是「取那个切片」。 不需要服务端算偏移,也不需要 range 请求之外的支持。 ③ 多码率切换:换个 m3u8 就行,不用重新协商。
还有一条不那么显眼但很实用的优点: 切片的生成是离线的,可以先跑一遍内容审核再上线。 直播做不到这一点,这也是点播架构和直播架构的根本差别之一。
四、动手 Demo:为什么大平台几乎都用它
把五种场景的延迟容忍度与 HLS 的实际延迟摆在一起对照。 再算一遍起播的四步开销,看「300 毫秒」是靠什么凑出来的。
scenes = [
("演唱会/赛事", 10, 30, "HLS 常用"),
("在线教育大班课", 6, 15, "HLS 常用"),
("电商带货", 3, 6, "偏 HTTP-FLV"),
("视频点播", 0, 999, "几乎必用 HLS"),
("视频会议/连麦", 0, 1, "只能 WebRTC"),
]
# HLS 在 4 秒切片、回溯 3、缓冲 1 时的延迟区间
hls_lo, hls_hi = 4 * 3, 4 * 4
print("场景 能忍下限 能忍上限 HLS 能进吗")
for name, lo, hi, hint in scenes:
ok = "能" if hls_lo <= hi else "不能"
print("%-14s %8d %8d %s(%s)" % (name, lo, hi, ok, hint))
print()
steps = [("取 m3u8", 50), ("取 3 个切片", 150),
("解封装首帧", 30), ("解码首帧", 50)]
for k, v in steps:
print(" %-12s %4d 毫秒" % (k, v))
print(" 合计 %d 毫秒(不含等切片生成)" % sum(v for _, v in steps))
实跑输出:
--------------------------------------------------------------------
应用场景——为什么大平台几乎都用它
--------------------------------------------------------------------
**① 场景与延迟容忍度**
场景 典型延迟 是否选 HLS
----------------------------------------------------------
演唱会/赛事直播 10~30 秒 常用
在线教育大班课 6~15 秒 常用
电商带货 3~6 秒 少用,偏 HTTP-FLV
视频点播 无所谓 几乎必用
视频会议/连麦 小于 0.5 秒 不用,选 WebRTC
**规律很清楚:越偏「单向广播」、观众越多,越适合 HLS。**
**越偏「双向互动」、延迟要求越狠,越不适合。**
**② 起播时间怎么估**
假设切片 4 秒、客户端先下 3 个切片再开播:
环节 耗时 说明
------------------------------------------------------
取 m3u8 50 毫秒 几 KB,一次往返
取 3 个切片 150 毫秒 并行下,每个几十 KB
解封装首帧 30 毫秒 找 PAT/PMT 再找关键帧
解码首帧 50 毫秒 硬件解码更快
**算下来 300 毫秒左右就能出画面,看起来不错。**
**但这是「切片都已经存在服务器上」的情况。**
**直播时切片是边生成边发的,所以你还要等「最新的那个切片被切完」。**
**这一段才是真正的大头,正好等于一个切片时长。**
**③ 为什么点播几乎必用**
**因为点播对延迟没有要求,而 HLS 的优点全都对上了:**
**① 切片是静态文件**:**可以直接扔到对象存储,成本极低。**
**② 支持拖动**:**跳到任意时间点就是「取那个切片」。**
**③ 多码率切换**:**换个 m3u8 就行,不用重新协商。**
判据写成了「HLS 下限能不能塞进场景上限」——12 秒塞不进电商的 6 秒,所以那一行判「不能」。 四步合计正好 280 毫秒,加上 DNS 与 TCP 握手才是常说的「300 毫秒」。 点播那行写成上限 999 是个取巧,表示「没有延迟要求」,不是真的 999 秒。
30 秒实验
- 把切片改成 2 秒,看电商那行判定怎么变——延迟降到 6~8 秒,还是压不进 6 秒,但已经接近。
- 把「取 3 个切片」的 150 毫秒改成 600 毫秒,看合计——这就是弱网下的真实起播时间。
- 加一行「安防监控」,自己填能忍多少秒——一般能忍 1~2 秒,所以不选 HLS。
常见误区
- 「起播快就等于延迟低」——两回事,起播是首帧时间,延迟是画面落后多少。
- 「小规模直播不能用 HLS」——能用,只是优势不明显。
- 「点播用 HLS 是因为延迟低」——正好相反,是因为延迟无所谓。
自测三问(点开对答案)
1. 选 HLS 最该看哪两个条件? —— **延迟能忍几秒、观众规模多大**;规模大、延迟能忍就选它。 2. 起播 300 毫秒和延迟 4 秒有什么区别? —— **起播是首帧前的时间,延迟是画面落后直播源的时长**,两者不冲突。 3. 点播为什么几乎必用 HLS? —— **切片即静态文件、可拖动、多码率切换零成本**,还能离线审核。- ☐ (本节完,下一节 5.2.1 m3u8 简介)