博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HLS playlist典型示例
阅读量:5864 次
发布时间:2019-06-19

本文共 7086 字,大约阅读时间需要 23 分钟。

[时间: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

在刚启动时,其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

其中并不包含EXT-X-ENDLIST字段,后续结束是会自动添加。这里EVENT字段含义是可以改动playlist内容,但是只能在m3u8文件末尾添加新的分片信息,不能在文件中间添加任何内容。

当Event playlist结束时,其内容如下:

#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标签。

直播playlist是一个典型的滑动窗口,server端会对源格式做实时转码(存在一点延时),并定期清理已发布的分片信息。典型的滑动窗口大小为3-5个分片。其m3u8格式如下:

#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添加了AUIODVIDEO属性,以实现关联。

该形式的m3u8格式如下:

#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中的AUDIOVIDEOSUBTITLES关联在一起。

可以通过alternate media实现多码率、多音频、多字幕、多视角的HLS推流。

10 I-frame playlist

为了实现快播和倒放,通常需要特定的数据以支持类似操作,一种方法就是通过记录I帧位置来实现。HLS为了支持此功能,提供了EXT-X-I-FRAMES-ONLYEXT-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。

参考资料

  1. rfc8216: HTTP Live Streaming
  2. Technical Note TN2288: Example Playlist Files for use with HTTP Live Streaming

转载地址:http://ppynx.baihongyu.com/

你可能感兴趣的文章
阿里云“瞄上”医疗大数据 分级诊疗仍有痛点
查看>>
Intracom Telecom助力CSP,WiFi与NFV的完美邂逅
查看>>
马赛克真的能跟安防扯上关系? 我不信
查看>>
三星加大芯片生产投资 拟在明年重夺苹果A12订单
查看>>
《Web测试囧事》——2.2 页面字段依赖导致表单提交时出错
查看>>
中国IPv6用户仅千分之三,落后于印度和越南
查看>>
Qt之图形(渐变填充)
查看>>
深度操作系统 15 Alpha2 —— 带你领略不一样的深度
查看>>
为神马说写程序是很艰难的
查看>>
《DNS与BIND(第5版)》——4.9 增加更多区域
查看>>
谁是抛弃 WinXP 速度最快的国家?
查看>>
jquery插件的编写
查看>>
AngularJS 1.3 提升了 HTML 表单
查看>>
《拥抱机器人时代——Servo杂志中文精华合集》——导读
查看>>
Terraform 0.9.8 发布,基础架构管理工具
查看>>
《Exchange Server 2010 SP1/SP2管理实践》一1.3 本书中域控制器的概念
查看>>
1、solr包结构介绍,solrCore的安装配置,solr部署到Tomcat,多solrCore配置,配置中文分词器,界面功能介绍,Schema.xml的基本使用,数据导入...
查看>>
CentOS7更改时区
查看>>
2013 年开源中国 10 大热门 Java 开源项目
查看>>
《威胁建模:设计和交付更安全的软件》——2.5 小结
查看>>