HLS 是什么

HLS (HTTP Live Streaming) 是 Apple 提出的直播流协议,它诞生于2009年,一个意在颠覆流媒体产业的新协议。它的工作原理是把一段视频流切分成一个个的小块,并基于 HTTP 的文件来下载。当媒体流正在播放时,客户端可以根据当前网络环境,方便地在不同的码率流中做切换,以实现更好的观影体验。下图是苹果官方给出的大体流程图:

HLS 如何播放

HLS提供一个m3u8地址,可以很方便地实现播放:

<video controls autoplay>
	<source
	src="http://livenging.alicdn.com/mediaplatform/f80a98ee-c9d2-4e2d-b81e-fa80dd7ccd08_merge.m3u8"
	type="application/vnd.apple.mpegurl"
	/>
	<p class="warning">Your browser does not support HTML5 video.</p>
</video>
  • 其他不兼容的浏览器里想播放 HLS,可以使用开源的 hls.js,更多详细信息可以参考本手册的章节《hls.js

HLS协议

HLS 由两部分构成:

  • .m3u8 文件:以 UTF-8 编码的 m3u 文件,这个文件本身不能播放,只是存放了播放信息的文本文件
  • .ts 视频文件:每一个 m3u8 文件,分别对应若干个 ts 文件,这些 ts 文件才是真正存放视频的数据

m3u8 文件只是存放了一些 ts 文件的配置信息和相关路径,当视频播放时,m3u8 是动态改变的,video 标签会解析这个文件,并找到对应的 ts 文件来播放,所以一般为了加快速度,m3u8 放在 Web 服务器上,ts 文件放在 CDN 上。视频的编码格式为 H264,音频编码格式为 MP3、AAC 或者 AC-3。

更多关于 m3u8 和 ts 格式的介绍,可以参考本手册的章节《TS, M3U8

HLS和RTMP对比

  • RTMP 可以用在推流和拉流,但 HLS 只能用在拉流端。比如以RTMP协议推流、HLS协议拉流的方案大致流程如下

  • HLS 延时比 RTMP 高

RTMP 延时在1-3s,而 HLS 延时在5-20s,主要依赖切片的情况。HLS 的延时包含了 TCP 握手、ffmpeg 切片及磁盘写入、m3u8 文件下载与解析、ts 文件下载与解析等多个步骤。其中最长的耗时在于媒体服务等待数据进行切片,比如单个 ts 文件时长为10s,那么在直播的环境里媒体服务器要等到这 10 秒的数据推上来,才可以切片,即使切片处理及网络耗时不计,拉流端看到的数据也是10秒之前的内容。

可以缩短列表的长度和单个 ts 文件的大小来降低延迟,极致来说可以缩减列表长度为 1,并且 ts 的时长为 1s,但是这样会造成请求次数增加,增大服务器压力,当网速慢时会造成更多的缓冲。因为延时较高,生产环境里一般用HLS来做直播时移和回放