M3U8 入门说明:结构、字段与播放机制
M3U8 是 HLS 协议使用的播放列表文本文件。播放器并不直接播放 m3u8,而是解析里面的媒体分片地址(通常是 ts 或 fmp4),按顺序拉流并拼接播放。
1. 主清单与子清单
常见场景下,一个入口 m3u8 是“主清单”,里面列出了多路码率;播放器会根据网络状况选择一个子清单继续播放。
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
low/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2400000,RESOLUTION=1280x720
high/index.m3u8
2. 子清单里的关键字段
- #EXTINF:后续分片时长(秒)。
- #EXT-X-TARGETDURATION:分片最大时长,播放器缓冲策略依赖它。
- #EXT-X-MEDIA-SEQUENCE:直播流起始序号,直播会持续增长。
- #EXT-X-ENDLIST:点播结束标记,直播通常没有。
3. 直播与点播差异
点播(VOD)清单一般稳定且有 ENDLIST;直播清单会不断更新,播放器需要轮询拉取新分片,因此直播对网络波动更敏感。
4. 为什么"能打开链接但不能播放"
- 跨域未放开,浏览器拦截分片请求。
- 签名鉴权失效,分片返回 403/401。
- 视频编码不兼容,例如某些浏览器无法硬解 HEVC。
5. 实际案例分析:直播流加载失败
假设你拿到一个直播地址 https://example.com/live/stream.m3u8,在浏览器里能打开看到文本内容,但播放器始终黑屏。按照以下步骤排查:
- 步骤1:检查 m3u8 内容是否包含
#EXTM3U头,确认文件格式正确。 - 步骤2:查看分片地址是绝对路径还是相对路径,相对路径需要与 m3u8 同域。
- 步骤3:打开浏览器开发者工具,观察 Network 面板,看分片请求是否返回 200。
- 步骤4:如果分片请求报 CORS 错误,联系流服务提供商配置跨域头。
- 步骤5:检查视频编码,H.264 兼容性最好,HEVC/H.265 在部分浏览器无法播放。
6. 进阶:理解分片加载时序
播放器加载 M3U8 时,内部时序大致如下:首先下载并解析主清单,根据带宽选择合适码率;然后下载子清单,获取分片列表;接着按顺序下载分片并解码播放。直播场景下,播放器会定时重新拉取子清单,获取新分片。理解这个时序有助于排查"为什么直播延迟越来越高"或"为什么拖动进度条后卡顿"等问题。如果子清单更新不及时,直播延迟就会累积;如果分片下载超时,播放器就会进入缓冲状态。