广告
— 广告位 In-Article —

什么是 HLS 协议?

HTTP Live Streaming(HLS)是苹果公司于 2009 年提出的自适应比特率流媒体协议,基于标准 HTTP 传输,目前已成为互联网视频分发的主流标准。Netflix、YouTube、爱奇艺等平台均使用 HLS 分发视频。

HLS 的工作原理分三步:① 服务器将视频切割成 2-10 秒的小片段(.ts 文件);② 生成一个 M3U8 播放列表文件,记录所有片段的地址;③ 播放器读取 M3U8,按顺序下载片段播放,并根据网速切换画质。

M3U8 文件有哪两种类型?

理解 M3U8,首先要区分两种文件:

  • 主播放列表(Master Playlist):列出所有可用的画质档位,每一行对应一个分辨率/码率的媒体播放列表地址
  • 媒体播放列表(Media Playlist):列出某一特定画质下,所有 .ts 片段的实际地址

播放器拿到 M3U8 后,先解析主播放列表,选定一个码率,再去取对应的媒体播放列表,开始下载片段。

主播放列表示例

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
360p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/index.m3u8

媒体播放列表示例

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.009,
https://cdn.example.com/seg000.ts
#EXTINF:9.009,
https://cdn.example.com/seg001.ts
#EXT-X-ENDLIST

关键标签含义速查

标签含义
#EXTM3U文件头标识,必须存在于第一行
#EXT-X-VERSIONHLS 协议版本号,影响可用特性
#EXT-X-TARGETDURATION所有片段中最长的时长(秒),播放器据此设置超时
#EXT-X-MEDIA-SEQUENCE当前列表中第一个片段的序号(直播用)
#EXTINF下一个片段的精确时长
#EXT-X-KEY加密信息,指定 AES-128 密钥地址
#EXT-X-ENDLIST播放列表结束标志,有此标签为点播,无则为直播
#EXT-X-STREAM-INF主播放列表专用,声明下一行媒体列表的码率和分辨率

自适应码率(ABR)工作机制

ABR 是 HLS 最核心的特性。播放器内部维护一个带宽估算器,根据最近几个片段的下载速度计算可用带宽,与主播放列表中各档位的 BANDWIDTH 值对比,自动选择最合适的码率。

切换时机:当连续 3 个片段的下载速度低于当前码率的 1.5 倍时,播放器会切换到更低档位;反之当带宽充裕时,会逐步提升画质。整个过程用户无感知,播放不中断。

HLS 与其他流媒体协议对比

协议延迟CDN 友好浏览器支持适用场景
HLS / M3U88-30s✓ 原生支持全平台点播、大规模直播
RTMP1-3s✗ 需专用服务器需插件推流端到服务器
DASH8-30s✓ 原生支持较好点播(Netflix等)
WebRTC<1s✗ 难以缓存现代浏览器实时互动(视频通话)

想直接体验 HLS 播放,访问 StreamFlow 在线播放器,粘贴任意 M3U8 链接即可播放,无需安装任何软件。

💡 避坑指南 · 使用 M3U8 的常见误区
  • 直播流没有 #EXT-X-ENDLIST,播放器需要不断轮询刷新列表,不要误以为是文件损坏
  • M3U8 中的片段地址可以是相对路径,解析时必须以 M3U8 文件所在目录为基准拼接完整 URL
  • 遇到 CORS 错误时不是播放器问题,是服务器缺少 Access-Control-Allow-Origin 响应头
  • 主播放列表的 BANDWIDTH 是峰值码率,不是平均码率,设置偏高会导致频繁降级
  • 加密的 M3U8(含 #EXT-X-KEY)必须同时能访问到密钥 URL,否则无法解密播放