[时间: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也支持纯音频格式,通常是MPEG基本音频文件,比如带有ADTS头的AAC、MP3或者AC-3。
(未完待续)

流媒体之HLS——综述的更多相关文章

  1. 流媒体之HLS——综述(二)

    [时间:2018-03] [状态:Open] [关键词:流媒体,stream,HLS] 本文是上一篇的后续部分,链接如下:HLS协议综述 2 playlist(m3u8)介绍 HLS中的playlis ...

  2. [SRS流媒体]RTMP/HLS 直播服务器simple-rtmp-server安装

    一个采用MIT协议授权的国产的简单的RTMP/HLS 直播服务器,其核心的价值理念在于简单高效. 使用方法: tep 1: build srs tar xf simple-rtmp-server-*. ...

  3. 解决用EasyDarwin开源流媒体服务器做HLS直播时Flash Player卡住的问题

    最近在开发EasyDarwin开源流媒体服务器HLS直播的时候发现一个现象:在PC上用flash player播放HLS和在ios上面播放HLS时,效果明显不同,在ios上播放非常稳定,而在flash ...

  4. AOSP中的HLS协议解析

    [时间:2018-04] [状态:Open] [关键词:流媒体,stream,HLS, AOSP, 源码分析,HttpLiveSource, LiveSession,PlaylistFetcher] ...

  5. 使用ffmpeg搭建HLS直播系统

    [时间:2018-04] [状态:Open] [关键词:流媒体,stream,HLS, ffmpeg,live,直播,点播, nginx, ssegment] 0 引言 本文作为HLS综述的后续文章. ...

  6. HLS playlist典型示例

    [时间:2018-06] [状态:Open] [关键词:流媒体,HLS,m3u8,playlist,variant, alternate] 0 引言 本文主要是对apple官网上的echnical N ...

  7. ffmpeg-hls实现分析

    [时间:2018-05] [状态:Open] [关键词:流媒体,stream,HLS, ffmpeg, demuxer,avformat] 0 引言 本文将关注于FFmpeg中的HLS相关实现,相关代 ...

  8. Vitamio

    前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的And ...

  9. iOS直播直播,头都大了

    随着直播市场的火热,市场大军都逐步进入直播市场 ,腾讯旗下的NOW直播也不例外 先说说直播设计底层 一 .流媒体 1 - 伪流媒体 1.1 扫盲:边下载边播放 1.2 伪流媒体:视频不是实时播放的,先 ...

随机推荐

  1. ubantu中搭建virtualenv+python3.4+flask

    上一篇文章是基于ubantu14.04自带的Python2.7搭建的virtualenv+python+flask(需要特别注意文件夹是中文的问题),今天忙碌了三个小时,在网上大量查阅资料完成了vir ...

  2. 2046 ACM 数学

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2046 思维:与之前有两道题目相似,n可以由n-1和n-2递推过来.f(n)=f(n-1)*1+f(n-2) ...

  3. 潭州课堂25班:Ph201805201 tornado 项目 第四课 增加用户注册登录(课堂笔记)

    tornado 相关说明 在 handlers 中创建个 auth.py 用来做用户登录,在这文件中创建个类,并逐步完善 在 tornado 中创建 login.html 文件,是个登录页面 {% e ...

  4. Victoria的舞会2——图的连通性及连通分量

    [Vijos1022]]Victoria的舞会2 Description Victoria是一位颇有成就的艺术家,他因油画作品<我爱北京天安门>闻名于世界.现在,他为了报答帮助他的同行们, ...

  5. itchat分析微信好友的个性签名

    itchat分析微信好友的个性签名 itchat是一个开源的微信个人号python接口(公众号.企业号接口为itchatmp).使用它可以非常优雅地操纵个人微信号.文档链接 七夕到了,博主也要自娱自乐 ...

  6. Java面试题集锦

    1. String.StringBuffer和StringBuilder的区别. (1)  String:存储数值不可改变的字符串 (2)  StringBuffer:可变字符序列.线程安全.效率低 ...

  7. Java几种常见的编码方式

    几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言 ...

  8. 深入理解JVM(5)——HotSpot垃圾收集器详解

    HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器.根据新生代和老年代各自的特点,我们应该分别为它们选择不同的收集器,以提升垃圾回收效率. ...

  9. jmeter接口测试实例6-注册(参数化)

    Jmeter实例6:注册(参数化) 选中http协议,添加CSV Data set Config 准备参数中要使用到的值,存放到txt中,如果一个里面有多个参数,中间用,号分隔: 选中CSV元件,fi ...

  10. JS_高程5.引用类型(1)Object类型

    引用类型 在ECMASCript中,引用类型是一种数据结构,将数据和功能组织在一起,引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法.(注意:尽管ECMAScript从技术上 ...