[时间: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. html 的实践

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. AE插入音乐

    将音乐文件(如MP3文件)直接拖拽到工程里就可以. 然后添加到合成里. 点击内容预览 ,就自动播放了. 在合成窗口里面,我们可以对于音频文件进行拖动,以及裁剪等操作,但是需要注意的是AE里面不能预览声 ...

  3. BZOJ.5338.[TJOI2018]xor(可持久化Trie)

    BZOJ LOJ 洛谷 惊了,18年了还有省选出模板题吗= = 做这题就是练模板的,我就知道我忘的差不多了 询问一就用以DFS序为前缀得到的可持久化Trie做,询问二很经典的树上差分. 注意求询问二的 ...

  4. BZOJ.4558.[JLOI2016]方(计数 容斥)

    BZOJ 洛谷 图基本来自这儿. 看到这种计数问题考虑容斥.\(Ans=\) 没有限制的正方形个数 - 以\(i\)为顶点的正方形个数 + 以\(i,j\)为顶点的正方形个数 - 以\(i,j,k\) ...

  5. PHP中让json_encode不自动转义斜杠“/”的方法

    最近将使用爬虫爬取的链接保存到 mysql 数据库中时,发现我将链接使用 json_encode 保存时候,在数据库中却显示了转义字符,我并不需要这转义的,看起来不清晰而且占用存储空间. 后来发现在默 ...

  6. JDK 1.8 新特性

    default 函数式接口 待总结

  7. 纯CSS实现展开列表

    效果预览 以下为源码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  8. python数据类型内置方法 字符串和列表

    1.字符串 内置方法操作# a = 'qqssf'#1. print(a[-1:]) #按索引取,正向从0开始,反向从-1开始# print(len(a)) #取长度# a = 'qqssf'# 2. ...

  9. JavaScript之中Array用法的一些技巧总结

    1.创建一个全部为0,长度为100的数组(ES6) Array(10).fill(0) 2.创建一个长度为100的数组,其中保存0 ~ 99 let array = Array(100).fill(0 ...

  10. java第一次课

    package java第一周学习2; 达达20173435 信1705-2 import java.text.SimpleDateFormat; import java.util.Date; pub ...