HLS 概述
HLS 全称是 HTTP Live Streaming, 是一个由 Apple 公司实现的基于 HTTP 的媒体流传输协议。 他跟 DASH 协议的原理非常类似。通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件,然后提供一个配套的媒体列表文件,提供给客户端,让客户端顺序地拉取这些媒体文件播放, 来实现看上去是在播放一条流的效果。
由于传输层协议只需要标准的 HTTP 协议,HLS 可以方便的透过防火墙或者代理服务器,而且可以很方便的利用 CDN 进行分发加速,并且客户端实现起来也很方便。
HLS 目前广泛地应用于点播和直播领域。
在 HTML5 页面上使用 HLS 非常简单:
直接:
<video src="example.m3u8" controls></video>
或者:
<video controls>
<source src="example.m3u8"></source>
</video>
下面,我将会概括性地介绍 HLS 协议的方方面面(暂时不包括 AES 加密部分的内容), 配合 HLS 的 RFC 食用效果更佳。
HLS 协议详解
上面是 HLS 整体架构图, 可以看出,总共有三个部分:Server,CDN,Client。
其实,HLS 协议的主要内容是关于 M3U8 这个文本协议的,其实生成与解析都非常简单。为了更加直接地说明这一点,我下面举两个简单的例子:
简单的 Media Playlist:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:2680
#EXTINF:7.975,
https://priv.example.com/fileSequence2680.ts
#EXTINF:7.941,
https://priv.example.com/fileSequence2681.ts
#EXTINF:7.975,
https://priv.example.com/fileSequence2682.ts
包含多种比特率的 Master Playlist:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000
http://example.com/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000
http://example.com/hi.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8
-
HLS 通过 URI(RFC3986) 指向的一个 Playlist 来表示一个媒体流。
-
一个 Playlist 可以是一个 Media Playlist 或者 Master Playlist,使用 UTF-8 编码的文本文件,包含一些 URI 跟描述性的 tags。
-
一个 Media Playlist 包含一个 Media Segments 列表,当顺序播放时,能播放整个完整的流。
-
要想播放这个 Playlist,客户端需要首先下载他,然后播放里面的每一个 Media Segment。
<