0 引言

本文主要是对apple官网上的echnical Note TN2288-Example Playlist Files for use with HTTP Live Streaming一文的整理,加上rfc8216 section 8的部分内容。

本文的目标在于整理不同类型的HLS

m3u8格式,对其表征的多媒体数据做必要说明。希望读者读完本文能够基本知道目前HLS所支持的m3u8格式。至于对应字段的详细含义,建议参考rfc8216或其他资料。

言归正传,HLS通过一系列小文件来发送音视频等多媒体数据,通常该分片长度为10s。一个索引文件,也称为playlist(中译名为播放列表),通常提供对这一系列分片文件的描述信息,通常使用.m3u8作为其后缀;对于mp3格式的playlist则使用.m3u作为后缀。该索引文件将被客户端获取,客户端解析之后可得到对应的待请求序列的信息。

1 不同HLS playlist示例文件

本文将给出10种不同的playlist,包括内容如下:

1.点播(VOD,Video On Demand)playlist

2.Event playlist

3.直播playlist(滑动窗口)

4.byte-range playlist

5.包含密钥的playlist

6.内嵌广告的playlist

7.master playlist

8.包含alternate media的playlist

9.I-frame playlist

10.包含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@0
media.ts#EXTINF:9.009,
#EXT-X-BYTERANGE:82112@752321
media.ts#EXTINF:3.003,
#EXT-X-BYTERANGE:69864
media.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属性,以实现关联。
该形式的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中的AUDIO、VIDEO、SUBTITLES关联在一起。
可以通过alternate media实现多码率、多音频、多字幕、多视角的HLS推流。

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@376
segment1.ts
#EXTINF:3.56,
#EXT-X-BYTERANGE:7144@47000
segment1.ts#EXTINF:3.82,
#EXT-X-BYTERANGE:10340@1880
segment2.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解析会有较大帮助。

HLS playlist典型示例相关推荐

  1. 计算机典型的操作系统有,计算机操作系统典型示例.doc

    计算机操作系统典型示例 计算机操作系统例题及解析之五 [例1]什么是文件?什么是文件系统? 答:文件是在逻辑上具有完整意义的信息集合,它有一个名字作标识.文件具有三个基本特征:文件的内容为一组相关信息 ...

  2. 云原生数据库整体架构和典型示例

    导读: ·云原生数据库起源于Amazon,随之受到国内厂商的广泛关注.以华为云.阿里云.腾讯云等为代表的头部厂商投入大量资源进行研发.仅三年左右的时间,市场已经形成较为成熟的云原生数据库应用模式并应用 ...

  3. FusionCharts图表右键菜单的各种典型示例

    2019独角兽企业重金招聘Python工程师标准>>> 对于FusionCharts图表控件的右键菜单,我想用过FusionCharts图表控件的朋友都不会觉得陌生,因为我们很多功能 ...

  4. JUnit与Mockito单元测试典型示例

    单元测试的重要性无需赘述,但单元测试也会遇到困难,其中之一就是如何创建依赖.试想我们常见的server端分层架构,数据访问层Dao,业务层,以及Web层,想要单元测试业务层,我们需要依赖Dao层提供数 ...

  5. TestNG 自动化测试入门教程--典型示例

    TestNG介绍 TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit,   功能都差不多, 只是功能更加强大,使用也更方便 Java中已经有一个JUnit的测试框架了.  Tes ...

  6. 技术博客|第15期:流媒体传输协议简介 - HLS协议

    在Hulu及Disney+流媒体平台上,自适应流媒体传输技术被广泛使用,它可以根据用户的网络情况相应地调整视频码率,为用户带来良好的观看体验.为了实现这一点,视频将被编码成不同码率的版本,并且在每个版 ...

  7. HLS详解(看这个就够了)

    HLS详解(看这个就够了) HLS概述 官方定义 优劣性 优点: 缺点: 格式解析 HLS文件 playlist(m3u8)介绍 HLS playlist(m3u8)格式详解 播放模式 点播VOD L ...

  8. VideoJS+HLS视频加密播放

    前言 前段时间遇到一个播放视频的项目,为了防止登录的用户下载项目的视频,所以需要对视频加密,即使用户下载也不能播放:因为前端采用videojs,最后确认方案是将mp4转m3u8文件格式,来实现视频文件 ...

  9. 流媒体分发之HLS(HTTP Live Streaming)

    流媒体分发之HLS 什么是流媒体 采用流媒体技术的优势有哪些 流媒体的分发协议 RTMP与HLS RTMP HLS RTMP与HLS的对比 HLS文件分片 ffmpeg分片 M3U8文件 M3U8文件 ...

最新文章

  1. 802.15.4的超帧
  2. 一张图搞定Android学习路线
  3. Delphi StringGrid控件的属性及使用说明
  4. 二、【绪论】算法和算法评价
  5. 服务器建立共享后无法写入文件,Win7 局域网共享问题,XP访问Win7复制或写入一会文件之后出现无法访问,您没有权限,或者说服务器空间不足...
  6. html中的瀑布流是什么
  7. windows服务器新建管理员用户_用户和组管理
  8. [外挂4] 用CE查找棋盘基址
  9. 扫雷游戏网页版_梦幻西游出网页版,王者出新英雄阿古朵,谁在杀死国产游戏的创新...
  10. 李宏毅机器学习2022-hw2
  11. 广州黄埔香雪地铁口总价35万一套。
  12. centos yum安装tracert_centos6.3如何打开tracert
  13. mfc动态改变clip风格_欧式古典家具风格的演变历程
  14. 锂电池放空后充不进电_锂电池放置太久无法充电 血的教训!
  15. 南邮CTF-RE-Py交易
  16. r语言中的或怎么表示什么不同_R语言 基本语法
  17. pcie数据反_理解PCIE链路反转和极性反转
  18. 2的30次方用计算机怎么按,计算机基础试题2
  19. VS2017中配置QT5.12开发环境
  20. 计算机基础——5.2 图像与图形

热门文章

  1. HTML用户登录页面里面login.js代码
  2. HDU2086 A1 = ?【水题】
  3. UVA10625 GNU = GNU'sNotUnix【字符统计】
  4. Bailian4104 单词翻转(POJ NOI0107-27)【堆栈+字符流】
  5. 辨异 —— 概率与统计
  6. χ² 分布到 F 分布到 ANOVA
  7. 除法运算、商、余数与取模
  8. java下载的文件不完整_JAVA 解决FTP下载文件不完整问题
  9. java负数用什么类型定义_(转) Java中的负数及基本类型的转型详解
  10. 零基础学python难吗-零基础学Python难吗,或者有什么其他数据加工软件推荐?