什么是HLS协议?
HLS 全称是 HTTP Live Streaming, 是一个由 Apple 公司实现的基于 HTTP 的媒体流传输协议。他跟DASH 协议的原理非常类似。通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件, 然后提供一个配套的媒体列表文件, 提供给客户端, 让客户端顺序地拉取这些媒体文件播放, 来实现看上去是在播放一条流的效果。简单讲就是把整个ts流分成一个个小的、基于 HTTP 的文件来下载,每次只下载一些。它的传输内容包括两部份, 一是 M3U8 描述文件, 二是 TS 媒体文件。
由于传输层协议只需要标准的 HTTP 协议, HLS 可以方便的透过防火墙或者代理服务器, 而且可以很方便的利用 CDN 进行分发加速, 并且客户端实现起来也很方便。
HLS 目前广泛地应用于点播和直播领域.
HLS框架介绍

整体流程
首先将要直播的视频送到编码器中,编码器分别对视频和音频进行编码,然后输出到一个MPEG-2格式的ts传输流中。
分段器将ts流分段,产生一系列等间隔的媒体片段,这些媒体片段一般很小并且保存成后缀为.ts的文件,同时生成一个指向这些媒体文件的索引文件(
.M3U8文件)。客户端读取索引文件,然后按顺序请求下载索引文件中列出的媒体文件。下载后是一个ts文件。需要进行解压获得对应的媒体数据并解码后进行播放。

Server
服务器组件负责获取的媒体输入流 , 然后Media编码后 MPEG-4(H.264 video 和 AAC audio)格式然后封装成MPEG-2 (MPEG-2 transport stream)的传输流中。
传输流会经过stream segmenter, 这里的工作是MPEG-2传输流会被分散为小片段然后保存为一个或多个系列的 .ts 格式的媒体文件。这个过程需要借助编码工具来完成,比如 Apple stream segmenter。
服务端可以采用硬件编码和软件编码两种形式,其功能都是按照上文描述的规则对现有的媒体文件进行切片并使用索引文件进行管理。
Media encoder (媒体编码) :
媒体编码器获取到音视频设备的实时信号,将其编码后压缩用于传输。而编码格式必须配置为客户端所支持的格式,比如H.264视频和HE-AAC音频。当前,支持用于视频的MPEG-2传输流和纯音频的MPEG 基本流。编器通过本地网络将MPEG-2传输流分发出去,送到流切片器(Streamsegmenter)那里。标准传输流和压缩传输流无法混合使用。
Stream segmenter (流切片器)
流切片器(通常是一个软件,一个SDK)会通过本地网络从上面的媒体编码器中读取数据,然后将着这些数据一组相等时间间隔的小媒体文件。虽然每一个片段都是一个单独的文件,但是他们的来源是一个连续的流,切完照样可以无缝重构回去。切片器在切片同时会创建一个索引文件(Index
file),索引文件会包含这些切片文件的引用。每当一个切片文件生成后,索引文件都会进行更新。索引用于追踪切片文件的有效性和定位切片文件的位置。切片器同时也可以对你的媒体片段进行加密并且创建一个密钥文件作为整个过程的一部分。文件切片器
如果已经有编码后的文件(而不是编码流),可以使用文件切片器,通过它对编码后的媒体文件进行MPEG-2流的封装并且将它们分割为等长度的小片段。切片器允许使用已经存在的音视频库用于HLS 服务。它和流切片器的功能相似,但是处理的源从流替换流为了文件。
媒体片段文件(上面切出来的小片段)
媒体片段是由切片器生成的,基于编码后的媒体源,并且是由一系列的 .ts(如果是纯音频则不是.ts格式)格式的文件组成,其中包含了你想通过MPEG-2传送流携带的H.264视频 和 AAC/MP3/AC-3 音频。对于纯音频的播,切片器可以生产MPEG 基础音频流,其中包含了ADTS头的AAC、MP3、或者AC3等音频。
索引文件(.M3U8文件)
索引文件由切片器附带生成,保存为 .m3u8格式。
索引文件是一个文本文件,简单来说就是一个记录了ts文件地址的播放列表,它包含了各自独立的行,行可以是一个URI,空行,或者以字符#开头。空行将会被忽略。空格只能作为一行中不同元素间的分隔。
一个URI 表示一个媒体文件或是变种播放列表文件,URI可以是相对的,一个相对的URI必须被包含该URI的播放列表文件中的URI所解析。
以注释字符#开头的行可能是注释或者标签,标签以#EXT开头,其他所有行都应该被忽略。
1
2
3
4
5
6
7
8
9
10#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.ts1
2
3
4
5
6
7
8#EXTM3U:每个M3U8文件第一行必须是这个tag。
#EXT-X-VERSION: 指定版本
#EXT-X-TARGETDURATION:指定最大的媒体段时间长度(秒)
#EXT-X-MEDIA-SEQUENCE:指明了出现在播放列表文件中的第一个URI的序列号
#EXTINF:描述单个媒体文件的长度。后面为媒体文件,如./0.ts
#EXT-X-KEY:METHOD=<method> [,URI = “<uri>”] [,IV = <iv>] 加密方法
#EXT-X-ALLOW-CACHE:<YES|NO> 是否能缓存下载的媒体文件用来重播
EXT-X-ENDLIST 标签表示没有更多媒体文件将会加入到播放列表中嵌套索引文件
1
2
3
4
5#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.m3u8HLS 通过URI指向的一个Playlist来表示一个媒体流。
一个 Playlist可以是一个MediaPlaylist 或者 MasterPlaylist, 使用 UTF-8编码的文本文件,包含一些URI跟描述性的tags。
一个 MediaPlaylist 包含一个 MediaSegments 列表,当顺序播放时,能播放整个完整的流。
要想播放这个 Playlist,客户端需要首先下载他,然后播放里面的每一个MediaSegment。
更加复杂的情况是,Playlist 是一个 MasterPlaylist, 包含一个 VariantStream 集合, 通常每个VariantStream 里面是同一个流的多个不同版本(如:分辨率,码率不同)。

Distribution
媒体流索引文件与对应的媒体文件存放在分发模块Distribution 中,分发模块Distribution是一个标准的Web 服务器,通过标准的HTTP访问,客户端Client可以获取到媒体流的索引文件,并通过索引文件逐个获取媒体流的分块ts文件。
相对于其他移动平台上使用的基于UDP协议的RTSP媒体数据流播放方案,分发模块Distribution仅仅使用HTTP连接传输所有的数据,使其多媒体数据流能够最广泛的穿越各种边缘网络的网关、路由器、网络代理设备。此外,分发模块Distribution可以和各种数字内容分发的前端机器合作,提供缓存、媒体数据的分布式存储等。
Client
客户端开始时会去抓取索引文件(.m3u8/.m3u),其中用URL来标记不同的流。索引文件可以指定可用媒体文件的位置,解密的密钥,以及任何可以切换的流。对于选中的流,客户端会有序的下载每一个可获得的文件。每一个文件都包含流中的连环碎片。一旦下载到足够量的数据,客户端会开始向用户展示重新装配好的媒体资源。客户端负责抓取任何解密密钥,认证或者展示一个用于认证的界面,之后再解密需要的文件。这个过程会一直持续知道出现
结束标记 #EXT-X-ENDLIST。如果结束标记不出现,该索引就是用于持续广播的。客户端会定期的加载一些新的索引文件。客户端会从新更新的索引文件中去查找加密密钥并且将关联的URL加入到请求队列中去。
HLS播发流程

内容加密
如果内容需要加密,你可以在索引文件中找到密钥的相关信息。如果索引文件中包含了一个密钥文件的信息,那接下来的媒体文件就必须使用密钥解密后才能解密打开了。
加密的配置模式通常包含三种:
- 模式一:允许你在磁盘上制定一个密钥文件路径,切片器会在索引文件中插入存在的密钥文件的URL。所有的媒体文件都使用该密钥进行加密。
- 模式二:切片器会生成一个随机密钥文件,将它保存在指定的路径,并在索引文件中引用它。所有的媒体文件都会使用这个随机密钥进行加密。
- 模式三:每n个片段生成一个随机密钥文件,并保存到指定的位置,在索引中引用它。这个模式的密钥处于轮流加密状态。每一组n个片段文件会使用不同的密钥加密。
会话模式
点播
点播VOD的特点就是可以获取到一个静态的索引文件,其中包含一套完整的资源文件地址。这种模式允许客户端访问全部节目。VOD点播拥有先进的下载技术,包括加密认证技术和动态切换文件传输速率的功能(通常用于不同分辨率视频之间的切换)。
直播
Live会话就是实时事件的录制展示。它的索引文件一直处于动态变化的,你需要不断的更新索引文件playlist然后移除旧的索引文件。这种类型通过向索引文件添加媒体地址可以很容易的转化为VOD类型。转化时如果你的索引文件中包含EXT-X-PLAYLIST-TYPE标签,你需要将值从EVENT改为 VOD。
具体步骤:
- 移除一个文件播放列表中靠前的(认为已播放的)文件;
- 不断更新EXT-X-MEDIA-SEQUENCE标签,以步长为1进行递增;
延时问题:HLS的分段策略,基本上推荐是10秒一个分片,通常来说,为了缓存等方面的原因,在索引文件中会保留最新的三个分片地址,以类似“滑动窗口”的形式,进行更新。所以延迟至少就是30秒。
HLS优缺点
优势
- 客户端支持简单,只需要支持HTTP请求即可,HTTP 协议无状态,只需要按顺序下载媒体片段即可;
- 使用 HTTP 协议网络兼容性好,HTTP 数据包也可以方便地通过防火墙或者代理服务器,CDN 支持良好;
- Apple的全系列产品支持,由于HLS是苹果提出的,所以在Apple的全系列产品包括iphone,ipad,safari 都不需要安装任何插件就可以原生支持播放 HLS,现在,Android 也加入了对 HLS的支持;
- 自带多码率自适应,Apple 在提出 HLS 时,就已经考虑了码流自适应的问题。
劣势
- 相比 RTMP 这类长连接协议,延时较高,难以用到互动直播场景;
- 对于点播服务来说,由于TS切片通常较小,海量碎片在文件分发,一致性缓存,存储等方面都有较大挑战。