Written by
daweibayu
on
on
M3U8 解析
HLS
m3u8 文件格式是 HLS 协议中的一部分,所以要先介绍 HLS。
HLS 即 HTTP Live Streaming
的简写。其协议 rfc8216 - HTTP Live Streaming,免费的。
简要历史:
- Apple 在 WWDC 2009 上首次介绍 HLS 并发布其基本规范。
- 2013 年 Apple 提交 HLS 规范草案到 IETF
- 2017 年 RFC 8216 标准发布
- 2019 年 Apple 支持 Low-Latency HLS
Apple 当时提出的 HLS 主要是原因(历史背景)大概如下:
- Flash 兼容问题(乔帮主一直墙裂反对 Flash)
- 多设备兼容问题(当时 iphone 初代已经发布了)
- 效率问题(移动端带宽有限)
其特点如下:
- HLS 的核心之一就是自适应码率(不同网络下可以使用不同码率的视频源,如高低清的切换)
- 支持
Interstitial Content Boundaries
(前前前司的片头片尾便是如此支持的) - 基于 Http 协议,方便于三方适配(CDN 等)
- 使用 H.264
m3u8(m3u)
上边扯了很多上下文,接下来见真章。示例播放文件 - sl.m3u8,文件是可直接下载的,文本编辑器打开如下:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=688301
http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/0640_vod.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=165135
http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/0150_vod.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=262346
http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/0240_vod.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=481677
http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/0440_vod.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1308077
http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/1240_vod.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1927853
http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/1840_vod.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=2650941
http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/2540_vod.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=3477293
http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/3340_vod.m3u8
这其实就是一个 总分
的结构,通过 sl.m3u8 索引了不同码率的 m3u8,这也是自适应码率的支持方式。关于 EXT-X-STREAM-INF
可看具体协议文档 section-4.3.4.2 EXT-X-STREAM-INF。
选取其中的一个 0640_vod.m3u8 继续下载,文本编辑器打开如下:
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
0640/06400.ts
#EXTINF:10,
0640/06401.ts
#EXTINF:10,
0640/06402.ts
#EXTINF:10,
0640/06403.ts
#EXTINF:10,
0640/06404.ts
...
#EXTINF:10,
0640/0640535.ts
#EXT-X-ENDLIST
#EXTINF:<duration>,[<title>]
,格式便是如下,如示例,则表示
#EXTINF:10,
0640/06400.ts
则表示 06400.ts 这个片段的长度是 10s。
常见标签如下:
- *#EXTM3U:标志文件为 M3U8。
- #EXTINF:指定媒体片段的持续时间。
- #EXT-X-TARGETDURATION:指定媒体片段的最大持续时间。
- #EXT-X-ENDLIST:指示播放列表的结束(非直播流)。
- #EXT-X-STREAM-INF:定义多码率流的信息(在主播放列表中)。
- #EXT-X-MEDIA:描述替代媒体(例如,多语言音轨或字幕)。
- #EXT-X-DISCONTINUITY:标记时间轴或内容的中断(如广告插入)。
- #EXT-X-BYTERANGE:用于部分媒体段的分片请求。
- #EXT-X-KEY:描述加密信息,用于 DRM 保护。
其中的 ts 仍然可以下载:
片段 Media Segments
协议中支持的片段格式如下:
- ts(MPEG-2 Transport Stream,最常见) MPEG-2 Transport Streams
- mp4 or m4s Fragmented MPEG-4 (包含 moof 标签)
- aac、mp3 等 Packed Audio
- vtt WebVTT