一文看懂 M3U8:从文件结构到播放原理
本质:一份纯文本清单
不少人以为 m3u8 是某种视频格式,其实它只是一份 UTF-8 编码的文本清单,扩展名里的 8 正是 UTF-8 的意思。清单本身不装任何画面,它只负责记录"去哪里取数据、按什么顺序取"。
真正的影像被切成了一个个小体积的 TS 分片存放在服务器上。播放器读清单、领任务、按序取片,整个过程像在执行一张详尽的购物清单。
逐行拆解媒体清单
下面这份清单带了加密信息,我们逐行来看:
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="enc.key"
#EXTINF:7.5,
part-000.ts
#EXTINF:6.2,
part-001.ts
#EXT-X-ENDLIST
#EXTM3U:固定开头,缺了这一行,播放器会直接拒绝解析。#EXT-X-TARGETDURATION:声明单片时长上限,本例每片不超过 8 秒。#EXT-X-KEY:说明分片经过 AES-128 加密,密钥需要按 URI 另行下载。#EXTINF:标注紧跟其后的那个分片的精确时长。#EXT-X-ENDLIST:收尾标记,看到它就说明内容到此为止。
主清单与子清单的分工
当内容方提供多档画质时,会出现两级结构:主清单只登记各档画质子清单的地址与带宽参数,子清单才真正记录分片。播放器先取主清单挑一档,再去对应子清单领分片。这样的分层让换清晰度变成了"换个清单",播放不必中断。
播放器从拿到地址到出画面
- 请求 m3u8 地址,把返回的清单文本解析成任务表。
- 若清单里有
#EXT-X-KEY,先去取密钥备用。 - 下载最前面的几个分片,凑够起播所需的缓冲量。
- 解封装 TS 数据,送入解码器,画面和声音就出来了。
- 趁当前分片还没播完,提前去取下一批,如此循环。
想亲手走一遍完整流程?打开 M3U8Lab 在线播放器,粘贴任意地址就能观察加载节奏。
直播与点播的差异
点播清单末尾带 #EXT-X-ENDLIST,内容固定,进度条随便拖。直播清单则没有结尾标记,服务器不停追加新分片、淘汰旧分片,播放器必须定期重新拉取清单才能跟上最新进度——这也是 HLS 直播延迟的主要来源。
小结
把 m3u8 理解成一张"导航图"而非视频本身,许多疑问都会迎刃而解:清单定顺序,分片装画面,主子两级撑起多档画质。想继续深入,可以在 教程中心 找到 HLS 画质切换、卡顿排查等进阶文章。