HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输。目前 HLS 协议被广泛的应用于视频点播和直播领域。
HLS 跟 DASH 协议的原理非常类似。通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件,然后提供一个配套的媒体列表文件,提供给客户端,让客户端顺序地拉取这些媒体文件播放,来实现看上去是在播放一条流的效果。由于传输层协议只需要标准的 HTTP 协议,HLS 可以方便的透过防火墙或者代理服务器,而且可以很方便的利用 CDN 进行分发加速,并且客户端实现起来也很方便。
HLS 把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。
HLS 协议由三部分组成:
关于 HLS 的详细介绍可参考:draft-pantos-http-live-streaming
在 HTML5 页面上使用 HLS 非常简单:
<video src="example.m3u8" controls></video>
或者:
<video controls><source src="example.m3u8"></source></video>
HLS 的 m3u8 文件,是一个 TS 的列表,也就是告诉浏览器可以播放这些 TS 文件:
#EXTM3U#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:64#EXT-X-TARGETDURATION:12#EXTINF:11.550livestream-64.ts#EXTINF:5.250livestream-65.ts#EXTINF:7.700livestream-66.ts#EXTINF:6.850livestream-67.ts
有几个关键的参数,这些参数在 SRS 的配置文件中都有配置项:
EXT-X-TARGETDURATION
:所有切片的最大时长。有些 Apple 设备这个参数不正确会无法播放。SRS 会自动计算出 ts 文件的最大时长,然后更新 m3u8 时会自动更新这个值。用户不必自己配置。EXTINF
:ts 切片的实际时长,SRS 提供配置项 hls_fragment
,但实际上的 ts 时长还受 gop 影响。 ts 文件的数目:SRS 可配置 hls_window,指定 m3u8 中保存多少个切片,SRS 会自动清理旧的切片。livestream-67.ts
:SRS 会自动维护 ts 切片的文件名,在编码器重推之后,这个编号会继续增长,保证流的连续性。直到 SRS 重启,这个编号才重置为 0。譬如,每个 ts 切片为 10 秒,窗口为 60 秒,那么 m3u8 中会保存 6 个 ts 切片。
每一个 .m3u8
文件,分别对应若干个 ts 文件,这些 ts 文件才是真正存放视频的数据,m3u8 文件只是存放了一些 ts 文件的配置信息和相关路径,当视频播放时,.m3u8
是动态改变的,video
标签会解析这个文件,并找到对应的 ts 文件来播放,所以一般为了加快速度,.m3u8
放在 Web 服务器上,ts 文件放在 CDN 上。
.m3u8
文件,其实就是以 UTF-8 编码的 m3u
文件,这个文件本身不能播放,只是存放了播放信息的文本文件。
HLS 的架构分为三部分:Server、CDN 和 Client,即服务器、分发组件和客户端。
下面是 HLS 整体架构图:
服务器端将视频数据流编码、封装和切割为连续的、时长很短的 MPEG-TS 格式的文件,通常一个 ts 分片大概是 10s;并提供一个配套的媒体列表文件(m3u8 文件)。
视频封装格式:MPEG-TS。
编码:视频编码为 H.264,音频编码为 AAC, MP3, AC-3 或者 EC-3 格式。
HLS 也支持纯音频格式,通常是 MPEG 基本音频文件(MP4 封装的 AAC 格式)。
由标准的网络服务器组成,接收客户端的请求和分发所有的资源包括 m3u8
列表文件和 ts
分片文件。
客户端先通过下载 m3u8
文件,再通过 m3u8
文件的索引地址顺序地拉取 ts
媒体文件播放。对于直播,它的索引文件一直处于动态变化的,你需要不断的更新索引文件 playlist
然后移除旧的索引文件。
HLS 协议规定:
HLS 的工作流程如下图(来源苹果官网)所示: