HLS协议提出的原因
-
HLS(HTTP Live Streaming)协议是由苹果提出的基于流媒体的网络传输协议。
-
RTMP(实时消息传输协议,1935端口)协议存在的一些问题。比如RTMP协议不使用标准的HTTP接口传输数据,所以在一些特殊的网络环境下可能被防火墙屏蔽掉。但是HLS由于使用的HTTP协议传输数据,不会遇到被防火墙屏蔽的情况(该不会有防火墙连80接口都不放过吧)。
-
RTMP是一种有状态协议,很难对视频服务器进行平滑扩展,因为需要为每一个播放视频流的客户端维护状态。而HLS基于无状态协议(HTTP),客户端只是按照顺序使用下载存储在服务器的普通TS文件,做负载均衡如同普通的HTTP文件服务器的负载均衡一样简单。
-
HLS协议本身实现了码率自适应,不同带宽的设备可以自动切换到最适合自己码率的视频播放。
HLS的整体架构
-
视频与音频被设备采集到的之后传输给服务器处理
-
服务器先对,音频、视频,进行编码,视频使用h.264(现在也开始支持其他的格式),音频为mp3、acc、ac-3。
-
然后对编码后的文件打包为mpeg-2格式。
-
然后对编码后的文件进行分割,分割完会产生两种文件,一个是.m3u8、一个是.ts,文件。在文件分割这一步,还有一个重要功能,就是对文件进行加密,常用AES加密算法。
-
分发服务器,只要是web服务器就可以。分发服务器,负责存储被分割的文件形成的.ts文件以及索引文件.m3u8文件。
-
然后通过http协议与客户端通信。
客户端获取流程图
-
客户端先获取一级索引文件(.m3u8),这一级文件的作用是,存储不同码率(分辨率)的相同内容的文件,如果文件只有一种码率,那么没有一级索引。
-
二级文件里面存储着一个文件被分为多个.ts文件的信息,有时长(秒为单位)、起始ts文件的索引值、每个ts文件的索引值(相邻之间+1),如果有加密的话,会与密匙获取地址。
-
未加密的文件,按照约定的规则顺序播放每一个文件片段即可。加密文件在获取密匙后,对ts文件进行解密,然后播放即可。
-
.ts文件有一个特性,每一小节可以独立播放。不用像mp4文件有一个moov目录记录里,整个视频文件的播放信息,必须先获取到这条信息才可以播放文件。
-
HLS协议自适应播放原理
-
只有一种码率文件的不足在于,在网络上不稳定时会卡顿。有自适应技术的使用,能够通过降低码率,来是视屏更加流畅。
-
自适应播放的的意思是,对于不同的网络环境,设备通过与服务器之间的交互,为保证其流畅的播放前提下,自动切换视频的清晰度,以达到流畅播放的目的。
-
在码率自动切换的方面,都讲的不清楚。我个人认为是客户端,请求的时候,更具自己的网络环境,调整所要下载的文件的码率。
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=700000 http://example.com/low.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1300000 http://example.com/mid.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2300000 http://example.com/hi.m3u8
-
上方是一个一级索引中的一部分,,一共有三种码率。
在播放hls视频的时候, 当设置了码率自适应之后, 在每次下载完一个切片的时候,会依据上个切片的下载速度(80%)来决定是否要切换码率, 如果当前下载速度分别为: 1M :其80%速度为 800K, 低于1300K, 那么会下载700K的码率 2M :其80%速度为 1600K, 高于1300k低于2300k, 会下载1300K的码率 3M :其80%速度为 2400K, 高于2300k, 会下载2300K的码率
-
这样在网络不稳定时应该体验不好,但是网络不好体验怎么会好呢
-
-
除了上述视频的多码率之外,hls协议还支持多音轨。这样的好处使得存储空间得到节省,常见的MP4文件不支持多音轨。
HLS协议使用
点播(vod)
-
点播,相当于文件的大小时间,已经可以确定。所以在使用hls协议,进行点播服务时,我们可以得到所有文件.ts文件的地址。在播放时,只用考虑自身网络环境,对码率进行选择就可以了。
-
一次下载好索引文件就好,不用反复请求
直播(Live)
-
直播时文件在实时产生,所以我们需要频繁的获取索引文件,以得到最新的.ts文件。它的索引文件一直处于动态变化的,播放的时候需要不断下载二级index文件,以获得最新生成的ts文件播放视频。如果一个二级index文件的末尾没有#EXT-X-ENDLIST标志,说明它是一个Live视频流。
-
在苹果的文档中,有说明延迟在30s左右。因为苹果规定一个ts片段,有10s。一个m3u8文件中有3个片段,所以你看到这个视频时,已经是30s之后。可以通过减少切片时间与每个二级索引中ts文件的数目,使得实时性更好。但是这样会增加客户端请求资源的数目,增大服务器的压力。当网速慢时,会造成更多的缓冲。
对比
客户端在播放VOD模式的视频时其实只需要下载一次一级index文件和二级index文件就可以得到所有ts文件的下载地址,除非客户端进行比特率切换,否则无需再下载任何index文件,只需顺序下载ts文件并播放就可以了。但是Live模式下略有不同,因为播放的同时,新ts文件也在被生成中,所以客户端实际上是下载一次二级index文件,然后下载ts文件,再下载二级index文件(这个时候这个二级index文件已经被重写,记录了新生成的ts文件的下载地址),再下载新ts文件,如此反复进行播放。
标签
- 自己找吧有很多
观点
- 由于与HLS协议有竞争关系的协议为RTMP协议,但是苹果、谷歌不支持。而且由于h5对hls的支持,我觉得hls发展会更好,但是高延迟是硬伤。但是用的人多了,延迟问题肯定会被解决,或者大公司耍流氓,让用户升级设备,加网速,换光纤。