流媒体之HLS——综述

[时间:2018-01] [状态:Open]
[关键词:流媒体,stream,HLS]

0 HLS背景及初衷

HLS是由苹果公司发起的流媒体网络传输协议,可参考rfc8261 HTTP Live Streaming。它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。
HLS只请求基本的HTTP报文,与实时传输协议(RTP)不同,HLS可以穿过任何允许HTTP数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。

在网上已经有很多关于HLS的资料,本文主要按照我的理解整理下HLS流媒体协议基础知识。

0.1 HLS协议格式要求

  • 视频的封装格式TS
  • 保存ts索引的m3u8文件
  • 视频的编码格式:H264 (只要MPEG-TS支持,基本都可以,只是有些格式不是免费的;音频类似)
  • 音频的编码格式:AAC、MP3、AC-3

0.2 HLS优势

  • 使用标准HTTP传输数据,具有较好的网络穿透及防屏蔽性,更易于内容分发网络传输。
  • HLS协议本身是支持码率自适应的,客户端可以根据实际网络状况切换到合适的码率播放。
  • HLS内容发布服务更简单,对系统设备要求较低,更容易实现负载均衡,并且HLS是无状态协议的HTTP,客户端只需要下载即可。

0.3 HLS劣势

  • 延时较大,尤其是在直播的情况下,很难做到10s以内的延时(不排除网上各种改进版本及算法)。
  • 内容生成时对编码端性能要求较高。

1 HLS系统及基本架构

HLS支持直播或者点播,同时支持加密和认证。从概念上来说,HTTP通常包括三部分:服务器端、发布端、客户端。

1.1 HLS服务器端

服务器端主要负责将输入的媒体数据进行编码、封装,并将封装之后的文件切片,以满足发布端的要求。其输出可以是音视频原始数据,也可以是编码之后的数据,也可以是封装好的TS数据。这也输入最终会通过分片工具切分成发布端需要的格式。这里涉及三部分:

多媒体编码器 (Media Encoder)

多媒体编码器主要把采集自音视频设备的实时信号编码,封装。编码中必须选择客户端支持的格式,比如h264视频+aac音频。目前HLS支持的封装格式是MPEG-TS或者MPEG基本流(MPEG-ES,仅支持纯音频)。编码完成之后,编码器可以把封装之后的格式通过本地网络或者其他机制传递给分片工具(segmenter)。

分片工具(segmenter)

按照输入源的不同,通常分为流分片器、文件分片器。
顾名思义,二者主要区别在于输入的文件格式上:流分片器输出的是从本地网络滴入的MPEG-TS流,而文件分片器处理的是封装好的TS文件。它们的工作原理类似:将MPEG-TS切分成一系列等时长的媒体文件,但保证这些小的分片是可以无缝重建的,播放时音视频是连续的。
分片工具还会创建索引文件(.M3U8),其中包含指向单独媒体文件的索引信息。每当分片器完成一个新的媒体文件,它将更新索引文件。该索引用于记录媒体文件的位置及可访问性。在此过程中,分片工具可以加密每个分片,并为其创建密钥文件。
下文会详细介绍.M3U8的格式。

1.2 HLS分发端

HLS分发端较为简单,只要使用标准的网络服务器即可。它们负责接受客户端请求,并将处理好的多媒体文件和资源发送给客户端。如果并发量较大,可能需要边缘网络或其他内容分发网络。
分发系统是一个web服务器或者web缓存系统,它们能够通过HTTP向客户端发送媒体文件及索引文件。多数情况下,分发内容之前无需额外配置服务器、模块,仅需很少的配置就在web服务器上正常工作。对于详细的配置建议参考Deploying HTTP Live Streaming

1.3 HLS客户端

客户端负责选择合适的请求资源,下载器资源,然后解码显示(整成播放器的功能)。
客户端从获取索引文件开始,通常使用给定的URL来识别该流的信息。这个索引文件一般给出了可用媒体文件、解密密钥和其他可选流的位置。客户端选定流之后,就开始顺序下载每个可用的媒体文件。每个文件中包含特定流的连续分片。只要客户端下载到足够的数据,就可以开始解码数据并显示了。
如果需要,客户端负责读取所有解密密钥、认证或为用户提供用于认证或解密的接口。
客户端可以一直持续这个过程,直到它遇到索引文件中的#EXT-X-ENDLIST标签;若不存在该标签,则表示该索引文件是一个直播源,客户端需要定期更新索引文件,重复上述过程。

较为常用的HLS系统中,使用硬编码器将输入的音频编码为AAC、将输入的视频编码为h264,并将二者复用到MPEG-TS中,之后使用分片工具将其切分为一系列小的ts文件;这些文件将可以放到web服务器上。分片工具同时会创建并维护一个索引文件(HLS中称为.M3U8),其中包含可用媒体文件的列表。索引文件的URL会在web服务器上发布。客户端可以读取该索引文件,然后顺序请求列出的媒体文件,这些分片可以无缝播放。一个典型的系统配置如下图:
HLS-system-overview

HLS也支持纯音频格式,通常是MPEG基本音频文件,比如带有ADTS头的AAC、MP3或者AC-3。
(未完待续)

posted @ 2018-02-28 21:21  Tocy  阅读(6268)  评论(0编辑  收藏  举报