HLS playlist典型示例
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典型示例相关推荐
- 计算机典型的操作系统有,计算机操作系统典型示例.doc
计算机操作系统典型示例 计算机操作系统例题及解析之五 [例1]什么是文件?什么是文件系统? 答:文件是在逻辑上具有完整意义的信息集合,它有一个名字作标识.文件具有三个基本特征:文件的内容为一组相关信息 ...
- 云原生数据库整体架构和典型示例
导读: ·云原生数据库起源于Amazon,随之受到国内厂商的广泛关注.以华为云.阿里云.腾讯云等为代表的头部厂商投入大量资源进行研发.仅三年左右的时间,市场已经形成较为成熟的云原生数据库应用模式并应用 ...
- FusionCharts图表右键菜单的各种典型示例
2019独角兽企业重金招聘Python工程师标准>>> 对于FusionCharts图表控件的右键菜单,我想用过FusionCharts图表控件的朋友都不会觉得陌生,因为我们很多功能 ...
- JUnit与Mockito单元测试典型示例
单元测试的重要性无需赘述,但单元测试也会遇到困难,其中之一就是如何创建依赖.试想我们常见的server端分层架构,数据访问层Dao,业务层,以及Web层,想要单元测试业务层,我们需要依赖Dao层提供数 ...
- TestNG 自动化测试入门教程--典型示例
TestNG介绍 TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit, 功能都差不多, 只是功能更加强大,使用也更方便 Java中已经有一个JUnit的测试框架了. Tes ...
- 技术博客|第15期:流媒体传输协议简介 - HLS协议
在Hulu及Disney+流媒体平台上,自适应流媒体传输技术被广泛使用,它可以根据用户的网络情况相应地调整视频码率,为用户带来良好的观看体验.为了实现这一点,视频将被编码成不同码率的版本,并且在每个版 ...
- HLS详解(看这个就够了)
HLS详解(看这个就够了) HLS概述 官方定义 优劣性 优点: 缺点: 格式解析 HLS文件 playlist(m3u8)介绍 HLS playlist(m3u8)格式详解 播放模式 点播VOD L ...
- VideoJS+HLS视频加密播放
前言 前段时间遇到一个播放视频的项目,为了防止登录的用户下载项目的视频,所以需要对视频加密,即使用户下载也不能播放:因为前端采用videojs,最后确认方案是将mp4转m3u8文件格式,来实现视频文件 ...
- 流媒体分发之HLS(HTTP Live Streaming)
流媒体分发之HLS 什么是流媒体 采用流媒体技术的优势有哪些 流媒体的分发协议 RTMP与HLS RTMP HLS RTMP与HLS的对比 HLS文件分片 ffmpeg分片 M3U8文件 M3U8文件 ...
最新文章
- 802.15.4的超帧
- 一张图搞定Android学习路线
- Delphi StringGrid控件的属性及使用说明
- 二、【绪论】算法和算法评价
- 服务器建立共享后无法写入文件,Win7 局域网共享问题,XP访问Win7复制或写入一会文件之后出现无法访问,您没有权限,或者说服务器空间不足...
- html中的瀑布流是什么
- windows服务器新建管理员用户_用户和组管理
- [外挂4] 用CE查找棋盘基址
- 扫雷游戏网页版_梦幻西游出网页版,王者出新英雄阿古朵,谁在杀死国产游戏的创新...
- 李宏毅机器学习2022-hw2
- 广州黄埔香雪地铁口总价35万一套。
- centos yum安装tracert_centos6.3如何打开tracert
- mfc动态改变clip风格_欧式古典家具风格的演变历程
- 锂电池放空后充不进电_锂电池放置太久无法充电 血的教训!
- 南邮CTF-RE-Py交易
- r语言中的或怎么表示什么不同_R语言 基本语法
- pcie数据反_理解PCIE链路反转和极性反转
- 2的30次方用计算机怎么按,计算机基础试题2
- VS2017中配置QT5.12开发环境
- 计算机基础——5.2 图像与图形
热门文章
- HTML用户登录页面里面login.js代码
- HDU2086 A1 = ?【水题】
- UVA10625 GNU = GNU'sNotUnix【字符统计】
- Bailian4104 单词翻转(POJ NOI0107-27)【堆栈+字符流】
- 辨异 —— 概率与统计
- χ² 分布到 F 分布到 ANOVA
- 除法运算、商、余数与取模
- java下载的文件不完整_JAVA 解决FTP下载文件不完整问题
- java负数用什么类型定义_(转) Java中的负数及基本类型的转型详解
- 零基础学python难吗-零基础学Python难吗,或者有什么其他数据加工软件推荐?