M3U8 解析

HLS

m3u8 文件格式是 HLS 协议中的一部分,所以要先介绍 HLS。
HLS 即 HTTP Live Streaming 的简写。其协议 rfc8216 - HTTP Live Streaming,免费的。

简要历史:

  1. Apple 在 WWDC 2009 上首次介绍 HLS 并发布其基本规范。
  2. 2013 年 Apple 提交 HLS 规范草案到 IETF
  3. 2017 年 RFC 8216 标准发布
  4. 2019 年 Apple 支持 Low-Latency HLS

Apple 当时提出的 HLS 主要是原因(历史背景)大概如下:

  1. Flash 兼容问题(乔帮主一直墙裂反对 Flash)
  2. 多设备兼容问题(当时 iphone 初代已经发布了)
  3. 效率问题(移动端带宽有限)

其特点如下:

  1. HLS 的核心之一就是自适应码率(不同网络下可以使用不同码率的视频源,如高低清的切换)
  2. 支持 Interstitial Content Boundaries(前前前司的片头片尾便是如此支持的)
  3. 基于 Http 协议,方便于三方适配(CDN 等)
  4. 使用 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

section-4.3.2.1 EXTINF

#EXTINF:<duration>,[<title>],格式便是如下,如示例,则表示

#EXTINF:10,
0640/06400.ts

则表示 06400.ts 这个片段的长度是 10s。

常见标签如下:

其中的 ts 仍然可以下载:

片段 Media Segments

协议中支持的片段格式如下:

  1. ts(MPEG-2 Transport Stream,最常见) MPEG-2 Transport Streams
  2. mp4 or m4s Fragmented MPEG-4 (包含 moof 标签)
  3. aac、mp3 等 Packed Audio
  4. vtt WebVTT

ts(MPEG-2 Transport Stream)