[时间:2018-06] [状态:Open]
[关键词:流媒体,HLS,m3u8,playlist,variant, alternate]0 引言
本文主要是对apple官网上的一文的整理,加上rfc8216 section 8的部分内容。
本文的目标在于整理不同类型的HLS m3u8格式,对其表征的多媒体数据做必要说明。希望读者读完本文能够基本知道目前HLS所支持的m3u8格式。至于对应字段的详细含义,建议参考rfc8216或其他资料。
言归正传,HLS通过一些列小文件来发送音视频等多媒体数据,通常该分片长度为10s。一个索引文件,也称为playlist(中译名为播放列表),通常提供对这一系列分片文件的描述信息,通常使用.m3u8
作为其后缀;对于mp3格式的playlist则使用.m3u
作为后缀。该索引文件将被客户端获取,客户端解析之后可得到对应的待请求序列的信息。
本文是对我的的扩展,如果你对HLS不了解,建议阅读之。
1 不同HLS playlist示例文件
本文将给出10种不同的playlist,包括内容如下:
- 点播(VOD,Video On Demand)playlist
- Event playlist
- 直播playlist(滑动窗口)
- byte-range playlist
- 包含密钥的playlist
- 内嵌广告的playlist
- master playlist
- 包含alternate media的playlist
- I-frame playlist
- 包含session的master playlist
其中加粗的是我在实际工作中可能遇到比较多的。其他的仅在标准文档中见到。
前三类playlist(VOD/Event/Live)我们可以将之称为basic playlist。master playlist是对basic playlist的描述信息。2 点播playlist
HLS中点播playlist是静态的文件,生成之后一般不允许修改,server端可以预先生成切片文件。其格式如下:
#EXTM3U#EXT-X-PLAYLIST-TYPE:VOD#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXTINF:9.009,http://media.example.com/first.ts#EXTINF:9.009,http://media.example.com/second.ts#EXTINF:3.003,http://media.example.com/third.ts#EXT-X-ENDLIST
m3u8中支持绝对路径,也支持相对路径(推荐使用,节省带宽资源);以下格式与上面是等效的
#EXTM3U#EXT-X-PLAYLIST-TYPE:VOD#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXTINF:9.009,first.ts#EXTINF:9.009,second.ts#EXTINF:3.003,third.ts#EXT-X-ENDLIST
点播playlist最典型的特征是:
- playlist中包含
#EXT-X-ENDLIST
字段 EXT-X-PLAYLIST-TYPE
字段为VOD
(可选)
playlist可以使用http,也可以使用https协议。
3 Event playlist
Event playlist特征字段是:EXT-X-PLAYLIST-TYPE
字段是EVENT
。
#EXTM3U#EXT-X-PLAYLIST-TYPE:EVENT#EXT-X-TARGETDURATION:10#EXT-X-MEDIA-SEQUENCE:0#EXTINF:10,fileSequence0.ts#EXTINF:10,fileSequence1.ts#EXTINF:10,fileSequence2.ts#EXTINF:10,fileSequence3.ts
其中并不包含EXT-X-ENDLIST
字段,后续结束是会自动添加。这里EVENT
字段含义是可以改动playlist内容,但是只能在m3u8文件末尾添加新的分片信息,不能在文件中间添加任何内容。
#EXTM3U#EXT-X-PLAYLIST-TYPE:EVENT#EXT-X-TARGETDURATION:10#EXT-X-MEDIA-SEQUENCE:0#EXTINF:10,fileSequence0.ts#EXTINF:10,fileSequence1.ts#EXTINF:10,fileSequence2.ts#EXTINF:10,fileSequence3.ts...#EXTINF:10,fileSequence120.ts#EXTINF:10,fileSequence121.ts#EXT-X-ENDLIST
Event playlist通常用于晚会或体育赛事,用于为用户提供当前时间到开播时间任意点的seek。
4 直播playlist
对于直播playlist,其特征字段就是没有EXT-X-ENDLIST
标签,并且不存在EXT-X-PLAYLIST-TYPE
标签。
#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:1#EXTINF:10,fileSequence1.ts#EXTINF:10,fileSequence2.ts#EXTINF:10,fileSequence3.ts
对于任意一个分片URI被移除该playlist,必须更新EXT-X-MEDIA-SEQUENCE
字段(+1即可)。移除URI必须按照顺序,并保证客户端通过滑动窗口拿到连续的分片信息。按照这样更新之后的playlist如下:
#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:2#EXTINF:10,fileSequence2.ts#EXTINF:10,fileSequence3.ts#EXTINF:10,fileSequence4.ts#EXTINF:10,
5 带有密钥的playlist
这里的密钥是由EXT-X-KEY
字段指定的,其中给出了加密方法,和密钥的存储路径。
#EXTM3U#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:7794#EXT-X-TARGETDURATION:15#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"#EXTINF:2.833,http://media.example.com/fileSequence52-A.ts#EXTINF:15.0,http://media.example.com/fileSequence52-B.ts#EXTINF:13.333,http://media.example.com/fileSequence52-C.ts#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=53"#EXTINF:15.0,http://media.example.com/fileSequence53-A.ts
6 byte-range playlist
该类型playlist主要是使用新的字段
#EXT-X-BYTERANGE: length[@offset]
使用该字段,可以不用在server上存储大量的小文件,而仅通过一个文件,通过偏移量和长度来支持分片。与点播playlist中的m3u8等价的playlist内容如下: #EXTM3U#EXT-X-TARGETDURATION:11#EXT-X-MEDIA-SEQUENCE:0#EXT-X-VERSION:4 #EXTINF:9.009,#EXT-X-BYTERANGE:75232@0media.ts #EXTINF:9.009,#EXT-X-BYTERANGE:82112@752321media.ts #EXTINF:3.003,#EXT-X-BYTERANGE:69864media.ts
注意这里必须指定EXT-X-VERSION
字段为4,否则可能低版本HLS协议不支持。
7 内嵌广告的playlist
有时候我们需要在直播或点播中插入广告,广告的编码格式可能跟原来的编码格式不同,为了支持类似场景,HLS提供了EXT-X-DISCONTINUITY
字段,用于通知客户端可能存在码流编码格式不连续。其对应的m3u8格式如下:
#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:0#EXTINF:10.0,ad0.ts#EXTINF:8.0,ad1.ts#EXT-X-DISCONTINUITY#EXTINF:10.0,movieA.ts#EXTINF:10.0,movieB.ts
8 master playlist
master playlist其中并不包含分片有关信息,而是描述了同一个源的不同编码格式,在HLS中称之为variant。master playlist中描述了variant的诸多信息,比如下载带宽、音视频编码信息、视频分辨率等等。典型的示例如下:
#EXTM3U#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=150000,RESOLUTION=416x234, \CODECS="avc1.42e00a,mp4a.40.2"http://example.com/low/index.m3u8#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=240000,RESOLUTION=416x234, \CODECS="avc1.42e00a,mp4a.40.2"http://example.com/lo_mid/index.m3u8#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=640000,RESOLUTION=640x360, \CODECS="avc1.42e00a,mp4a.40.2"http://example.com/high/index.m3u8#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=64000,CODECS="mp4a.40.5"http://example.com/audio/index.m3u8
master playlist中不包含#EXTINF
字段。其中描述的每个variant都是一个独立的m3u8文件。
9 包含alternate media的master playlist
alternate media为HLS提供了一种外挂音频、视频、字幕的格式,可以在不改动已生成的HLS分片信息的情况下,为客户端提供新的可选媒体信息。为此,在STREAM-INF
添加了AUIOD
、VIDEO
属性,以实现关联。
#EXTM3U#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="bipbop_audio",LANGUAGE="eng",NAME="BipBop Audio 1",AUTOSELECT=YES,DEFAULT=YES#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="bipbop_audio",LANGUAGE="eng",NAME="BipBop Audio 2",AUTOSELECT=NO,DEFAULT=NO,URI="alternate_audio_aac/prog_index.m3u8"#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="English",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="en",CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog, public.accessibility.describes-music-and-sound",URI="subtitles/eng/prog_index.m3u8"#EXT-X-STREAM-INF:BANDWIDTH=263851,CODECS="mp4a.40.2, avc1.4d400d",RESOLUTION=416x234,AUDIO="bipbop_audio",SUBTITLES="subs"gear1/prog_index.m3u8#EXT-X-STREAM-INF:BANDWIDTH=41457,CODECS="mp4a.40.2",AUDIO="bipbop_audio",SUBTITLES="subs"gear0/prog_index.m3u8
此m3u8中包含2个variants,一个alternate audio以及一个alternate subtitle。它们使用EXT-X-MEDIA
中的GROUP-ID
字段与EXT-X-STREAM-INF
中的AUDIO
、VIDEO
、SUBTITLES
关联在一起。
10 I-frame playlist
为了实现快播和倒放,通常需要特定的数据以支持类似操作,一种方法就是通过记录I帧位置来实现。HLS为了支持此功能,提供了EXT-X-I-FRAMES-ONLY
和EXT-X-I-FRAME-STREAM-INF
字段。后者需要放到master playlist中即可,其示例如下:
#EXTM3U#EXT-X-VERSION:4#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=80000,CODECS="avc1.42e00a,mp4a.40.2", \URI="lo/iframes.m3u8"#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=200000,CODECS="avc1.42e00a,mp4a.40.2", \URI="mid/iframes.m3u8"#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=380000,CODECS="avc1.42e00a,mp4a.40.2", \URI="hi/iframes.m3u8"
EXT-X-I-FRAMES-ONLY
字段是放在对应I-Frame的playlist中的,典型用法如下:
#EXTM3U#EXT-X-VERSION:4#EXT-X-I-FRAMES-ONLY ... #EXTINF:4.12,#EXT-X-BYTERANGE:9400@376segment1.ts#EXTINF:3.56,#EXT-X-BYTERANGE:7144@47000segment1.ts #EXTINF:3.82,#EXT-X-BYTERANGE:10340@1880segment2.ts
该文件间接给出了I帧所在位置的偏移量及其长度。
11 包含session的master playlist
session用于在playlist中传输任意服务器端自定义的数据,其对应字段如下:
#EXT-X-SESSION-DATA:DATA-ID="com.example.lyrics",URI="lyrics.json"#EXT-X-SESSION-DATA:DATA-ID="com.example.title",LANGUAGE="en", \VALUE="This is an example"#EXT-X-SESSION-DATA:DATA-ID="com.example.title",LANGUAGE="es", \VALUE="Este es un ejemplo"
12 小结
本文简要整理了HLS不同类型的playlist及其对应的关键字,可以根据不同的关键字区分不同的playlist类型。理清这些类型之后,对于熟悉HLS解析会有较大帮助。仅供参考。
更详细内容建议参考rfc8216。
参考资料
- rfc8216: HTTP Live Streaming
- Technical Note TN2288: Example Playlist Files for use with HTTP Live Streaming