HLS概述
HLS是HTTP Live Streaming的简称,是苹果公司提出的基于HTTP的流媒体网络传输协议,它的基本原理也是服务端把文件或媒体流按照不同的码率切分成一个个小片段进行传输,客户端在播放码流时,可以根据自身的带宽及性能限制,在同一视频内容的不同码率的备用源中,选择合适码率的码流进行下载播放。在传输会话开始时,客户端首先需要下载描述不同码流元数据的M3U8索引文件。
官方定义
从概念上讲,HTTP Live Streaming由三个部分组成:服务器组件,分发组件和客户端软件。
在典型配置中,硬件编码器接受音频视频输入,将其编码为HEVC视频和AC-3音频,然后输出片段化的MPEG-4文件或MPEG-2传输流。然后,软件流分段器将流分成一系列简短的媒体文件,这些文件放在Web服务器上。分段器还创建并维护一个包含媒体文件列表的索引文件。索引文件的URL在Web服务器上发布。客户端软件读取索引,然后按顺序请求列出的媒体文件并显示它们,而各段之间没有任何暂停或间隙。
服务器组件(Server Component)
服务器组件负责获取媒体的输入流并对其进行数字编码。它以适合交付的格式封装它们,并准备封装的媒体以进行分发。
对于现场事件,服务器需要媒体编码器(可以是现成的硬件),以及一种将编码的媒体拆分为片段并将其保存为文件的方法,该方法可以是诸如由Microsoft提供的媒体流分段器之类的软件。 Apple或集成第三方解决方案的一部分。
分配组件(Distribution Component)
分发系统是Web服务器或Web缓存系统,可通过HTTP将媒体文件和索引文件传递给客户端。不需要自定义服务器模块即可交付内容,并且通常在Web服务器上只需要很少的配置。要实际部署HTTP Live Streaming,您需要为浏览器或客户端应用程序创建HTML页面以充当接收器。您还需要使用Web服务器,以及将实时流编码为包含HEVC或H.264视频以及AAC或AC-3音频的分段MPEG-4媒体文件的方式。
客户端软件(Client Software)
客户端软件负责确定要请求的适当媒体,下载这些资源,然后重新组合它们,以便可以将媒体连续地呈现给用户。客户端软件包含在iOS 3.0和更高版本中以及安装了Safari 4.0或更高版本的计算机上。
客户端软件首先使用标识流的URL获取索引文件。索引文件又指定可用媒体文件,解密密钥以及任何可用备用流的位置。对于选定的流,客户端按顺序下载每个可用的媒体文件。每个文件包含流的连续段。一旦下载了足够数量的数据,客户端便开始向用户展示重组后的流。
客户端负责获取所有解密密钥,验证或提供允许验证的用户界面以及根据需要解密媒体文件。
此过程将继续进行,直到客户端在索引文件中遇到EXT-X-ENDLIST标记为止。如果不存在EXT-X-ENDLIST标记,则索引文件是正在进行的广播的一部分。在正在进行的广播期间,客户端会定期加载索引文件的新版本。客户端在更新的索引中查找新的媒体文件和加密密钥,并将这些URL添加到其队列中。
项目 | 释义 |
---|---|
Audio/Video inputs | 视频源可以是任意格式,可以是离线文件或实时码流 |
Media encoder | 将视频源中的视频数据转码到目标编码格式(H264)的视频数据 |
stream segmenter | 对编码后的视频进行切片,视频会被转换成HLS格式的视频(即TS和m3u8文件 |
index file | 索引文件,后缀以".m3u8"结尾的文件 |
ts | 缓存内容,后缀以".ts"结尾的文件 |
HTTP | 传输协议 |
优劣性
优点:
- 基于HTTP传输,防止防火墙屏蔽;
- 码率自适应;
- 服务器易于拓展,易于http做负载均衡;
缺点:
- 时延较长(10秒左右),对时延敏感慎用;
- 对服务器内存要求高;
格式解析
项目 | 释义 |
---|---|
网络协议 | HTTP |
封装格式 | MEPG-2 TS |
编码格式 | 视频编码格式为H.264,音频编码格式为MP3、AAC、AC-3或EC-3 |
索引文件 | M3U8 |
HLS文件
项目 | 释义 |
---|---|
index file | 主索引,后缀以".m3u8"结尾的文件 |
Alternate-A index file | 子索引,后缀以".m3u8"结尾的文件 |
ts | 实际缓存内容,后缀以".ts"结尾的文件 |
HLS有两级索引:
- 第一级索引存放的是不同码率的HLS源的M3U8地址,也就是二级索引文件的地址。
- 第二级索引则记录了同一码率下TS切片序列的下载地址。
客户端获取一级M3U8文件后,根据自己的带宽,去下载相应码率的二级索引文件,然后再按二级索引文件的切片顺序下载并播放TS文件序列。
HLS存储目录截图如下:
playlist(m3u8)介绍
HLS中的playlist是一个UTF-8编码的文本文件,其中包含了URL和描述性标签。一个常规的playlist如下所示:
#EXT-X-VERSION:3
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
# Old-style integer duration; avoid for newer clients.
#EXTINF:10,
http://media.example.com/segment0.ts
# New-style floating-point duration; use for modern clients.
#EXTINF:10.0,
http://media.example.com/segment1.ts
#EXTINF:9.5,
http://media.example.com/segment2.ts
#EXT-X-ENDLIST
其中以’#‘打头的行都是标签,HLS标准规定对于标准中未定义的标签,可以直接忽略;也就是说’#'也可以作为注释行。这里说明下上面M3U8文件的构成:
- #EXT-X-VERSION:表示协议的版本号,而且每个M3U8中只能出现一次该标签。对于具体版本号的定义,可以参考标准的第7节。
- #EXTM3U:作为M3U文件的标识符,可以用于文件类型识别,这是必须的字段。
- #EXT-X-TARGETDURATION:表示最长分片的时长,这是必须的字段。
- #EXT-X-MEDIA-SEQUENCE:表示playlist文件中第一个分片的序列号(整数值)。如果M3U8文件中没有该字段,则playlist中第一个分片的序列号必须是0。
- #EXTINF:表示下一个分片的时长。对于每个分片,必须有该字段。 对于#EXT-X-VERSION小于3的情况下,duration必须是整数;其他情况下duration可以是浮点数和整数。title是一个可选字段,仅用于增强可读性。
- #EXT-X-ENDLIST:该字段表示分片结束,不会在playlist文件中添加新的分片。
上面介绍的是最常见的playlist,还有一种playlist,仅包含播放节目列表信息,在HLS中称为master playlist,也是我们上图描述二级索引的结构,其示例如下:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1280000,AVERAGE-BANDWIDTH=1000000, RESOLUTION=720x480
http://example.com/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=2, BANDWIDTH=2560000,AVERAGE-BANDWIDTH=2000000, RESOLUTION=1080x720
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=3, BANDWIDTH=7680000,AVERAGE-BANDWIDTH=6000000, RESOLUTION=1920x1080
http://example.com/high.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=4, BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8
其中包含的标签说明如下:
-
#EXT-X-STREAM-INF:用于标识一个Variant Stream,这是由一系列的Redition组成的。该标签的属性列表中包含了Variant Stream的描述信息。例如:
- BANDWIDTH表示Variant Stream中的峰值比特率,单位bits/s。
- AVERAGE-BANDWIDTH表示Variant Stream中的平均比特率,单位bits/s。
- CODECS包含Variant Stream中音视频编码格式相关的信息,比如上面的"mp4a.40.5"。
- RESOLUTION包含Variant Stream中对应视频流的分辨率。
- FRAME-RATE表示Variant Stream中的视频帧率。
-
M3U8中还有一个标签需要关注下,EXT-X-PLAYLIST-TYPE。该标签只有两个值:EVENT、VOD。EVENT指的是分片工具只能在M3U8末尾添加新的分片的信息,但不能删除老的分片,通常比较适用于直播+录播的情况(既要提供给客户端点播功能,也要对实时场景进行录制,直播完成之后EVENT就自然退化为VOD)。但是对于M3U8中存在#EXT-X-ENDLIST标签时,可以忽略EXT-X-PLAYLIST-TYPE。
-
还有一种情况,如果M3U8中不存在#EXT-X-ENDLIST以及EXT-X-PLAYLIST-TYPE标签,则服务器端可以任意更新playlist内容。
HLS playlist(m3u8)格式详解
可参考:
https://www.cnblogs.com/tocy/p/hls-playlist-example.html
https://blog.csdn.net/weixin_33735077/article/details/86362702
https://blog.csdn.net/weixin_38451161/article/details/101033178
播放模式
点播VOD
特点就是当前时间点可以获取到所有index文件和ts文件,二级index文件中记录了所有ts文件的地址。这种模式允许客户端访问全部内容。上面的例子中就是一个点播模式下的m3u8的结构。
Live 模式
就是实时生成M3u8和ts文件。它的索引文件一直处于动态变化的,播放的时候需要不断下载二级index文件,以获得最新生成的ts文件播放视频。如果一个二级index文件的末尾没有#EXT-X-ENDLIST标志,说明它是一个Live视频流。
客户端在播放VOD模式的视频时其实只需要下载一次一级index文件和二级index文件就可以得到所有ts文件的下载地址,除非客户端进行比特率切换,否则无需再下载任何index文件,只需顺序下载ts文件并播放就可以了。但是Live模式下略有不同,因为播放的同时,新ts文件也在被生成中,所以客户端实际上是下载一次二级index文件,然后下载ts文件,再下载二级index文件(这个时候这个二级index文件已经被重写,记录了新生成的ts文件的下载地址),再下载新ts文件,如此反复进行播放。
参考链接:
https://www.jianshu.com/p/426425cad08a
https://www.jianshu.com/p/32417d8ee5b6
https://www.jianshu.com/p/6de22b88dc73
https://blog.csdn.net/u011857683/article/details/84863250
https://blog.csdn.net/qiandublog/article/details/53434081
https://blog.csdn.net/weixin_38451161/article/details/101033178
https://www.cnblogs.com/tocy/p/hls-playlist-example.html