文章目录
1. HLS 是什么
HLS(HTTP Live Streaming) 是苹果公司 2009 年推出的流媒体协议,它的核心思想非常巧妙:
把一个完整的视频切成很多个小片段(通常是 10 秒左右的 .ts 文件),然后通过一个 m3u8 播放列表 告诉播放器按什么顺序播放这些片段。
为什么要这么做?
- 可以自适应码率——根据用户网速动态切换清晰度
- 走标准 HTTP 协议,CDN 天然支持,不用专门的流媒体服务器
- 支持直播和点播
- 手机/浏览器兼容性极好
2. m3u8 播放列表详解
你图片里的就是一个**点播场景(VOD)**的 m3u8 文件,我们逐行解读:
#EXTM3U ← 文件头,必须有,说明这是扩展 M3U 格式
#EXT-X-MEDIA-SEQUENCE:0 ← 第一个切片的序号(直播时会不断滚动更新)
#EXT-X-TARGETDURATION:10 ← 每个切片的最大时长,单位秒
#EXTINF:10, ← 下一个切片的实际时长(必须 <= TARGETDURATION)
http://media.example.com/segment1.ts ← 切片的地址
#EXTINF:10,
http://media.example.com/segment2.ts
#EXTINF:10,
http://media.example.com/segment3.ts
#EXT-X-ENDLIST ← 播放列表结束标记(点播才有,直播没有)
播放逻辑: 播放器下载 m3u8 → 解析出切片列表 → 按顺序下载 .ts 文件 → 边下边播。
3. HLS 的两种工作模式
📺 点播模式(VOD)
- 视频是完整的,提前切好所有切片
- m3u8 里有
#EXT-X-ENDLIST - 播放器可以拖动进度条(seek)
- 例子:腾讯视频、B站的回放
📡 直播模式(Live)
- 切片是实时生成的
- m3u8 里 没有
#EXT-X-ENDLIST - 播放器需要定期重新请求 m3u8,获取新的切片
#EXT-X-MEDIA-SEQUENCE会不断增大- 有一定延迟(通常 20~60 秒,取决于切片时长)
直播模式下的 m3u8 大概长这样:
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:152 ← 不断增大,表示最新的切片序号
#EXT-X-TARGETDURATION:10
#EXTINF:10,
segment152.ts
#EXTINF:10,
segment153.ts
#EXTINF:10,
segment154.ts
← 没有 ENDLIST,说明还在继续
4. 自适应码率(HLS 最强大的功能)
实际应用中,通常有一个 Master Playlist(主播放列表),里面包含多个不同清晰度的子播放列表:
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360 ← 标清 800kbps
360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720 ← 高清 2Mbps
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080 ← 超清 5Mbps
1080p.m3u8
工作原理:
- 播放器先下载 Master Playlist
- 根据当前网速选择合适的码率
- 网速快 → 切到更高清
- 网速慢 → 自动降清晰度,避免卡顿
这就是你看视频时"网速不好自动变模糊"的原因。
5. 切片格式:.ts 是什么
.ts = MPEG-TS(Transport Stream),是一种传输流格式。
为什么用 .ts 而不是 .mp4?
- TS 的设计目标就是"流式传输",每一小段都能独立解码
- 即使中间丢了一段数据,后面的还能继续播
- MP4 的元数据(moov box)通常在文件开头,不适合切片
不过 HLS 后来也支持 fMP4(fragmented MP4)切片了,这是后话。
6. HLS 完整工作流程
视频源 → 编码器/转码器 → 切片工具 → [很多 .ts 文件 + m3u8 播放列表] → CDN → 播放器
↓
生成多码率
(1080p / 720p / 480p ...)
- 编码切片:把原始视频按 2~10 秒一段切开,编码成 H.264/H.265 + AAC
- 生成播放列表:输出 m3u8 文件
- 部署到 CDN:所有文件都是静态文件,直接放 HTTP 服务器上
- 播放器播放:客户端下载 m3u8,按顺序拉取切片播放
7. 常用标签速查表
| 标签 | 作用 | 必填 |
|---|---|---|
#EXTM3U | 文件标识 | ✅ |
#EXTINF | 单个切片时长 | ✅ |
#EXT-X-TARGETDURATION | 切片最大时长 | ✅ |
#EXT-X-MEDIA-SEQUENCE | 起始切片序号 | 直播用 |
#EXT-X-ENDLIST | 播放列表结束 | 点播用 |
#EXT-X-STREAM-INF | 自适应码率子流描述 | Master用 |
#EXT-X-KEY | 加密密钥(DRM) | 可选 |
#EXT-X-DISCONTINUITY | 编码参数变化标记 | 可选 |
#EXT-X-MAP | 初始化片段(fMP4用) | 可选 |
8. HLS 的优缺点
优点:
- 兼容性最好(iOS 原生支持,安卓、浏览器也都支持)
- 走 HTTP,防火墙友好,CDN 加速简单
- 自适应码率体验好
- 实现简单,服务端压力小
缺点:
- 延迟较高(20s+),不适合互动直播
- 切片产生大量小文件,存储管理麻烦
- 苹果生态绑定较深(不过现在已经是行业标准了)
3万+



被折叠的 条评论
为什么被折叠?



