HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输。目前HLS协议被普遍的应用于视频点播和直播领域。vim
经过将整条流切割成一个小的能够经过 HTTP 下载的媒体文件, 而后提供一个配套的媒体列表文件, 提供给客户端, 让客户端顺序地拉取这些媒体文件播放, 来实现看上去是在播放一条流的效果.因为传输层协议只须要标准的 HTTP 协议, HLS 能够方便的透过防火墙或者代理服务器, 并且能够很方便的利用 CDN 进行分发加速, 而且客户端实现起来也很方便.缓存
HLS的架构分为三部分:Server,CDN,Client 。即服务器、分发组件和客户端。服务器
下面是 HLS 总体架构图:网络
服务器用于接收媒体输入流,对它们进行编码,封装成适合于分发的格式,而后准备进行分发。架构
分发组件为标准的 Web 服务器。它们用于接收客户端请求,传递处理过的媒体,把资源和客户端联系起来。app
客户端软件决定请求何种合适的媒体,下载这些资源,而后把它们从新组装成用户能够观看的连续流。iphone
HLS格式的视频,只有安卓4.0以上才支持,目前基本4.0一下的机子基本能够考虑不兼容了,因此为了减小工做量,这里继续使用MediaPlayer来进行播放。
HLS格式的视频,经过一个m3u8文件,而后里面包含若干个TS文件片断,这里有个苹果的官方的一个例子:
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
里面的内容为:优化
#EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:10, no desc fileSequence0.ts #EXTINF:10, no desc fileSequence1.ts #EXTINF:10, no desc fileSequence2.ts #EXTINF:10, no desc fileSequence3.ts #EXTINF:10, no desc fileSequence4.ts #EXTINF:10, no desc fileSequence5.ts #EXTINF:10, no desc fileSequence6.ts #EXTINF:10, no desc fileSequence7.ts
咱们能够看到里面他又一个一个ts视频片断,这个一个一个视频片断就是咱们须要的播放,那么他是如何被播放器识别播放的呢。
其实上面的这些关键的字段都是约定好的,MediaPlayer会去按照规定好的字段去解析这个m3u8文件,而后拼接成最终的播放地址进行播放。编码
实现这种未加密的缓存仍是比较好实现的,大概能够分为这几步:
1.咱们首先按照特定的格式去解析这m3u8文件。
2.按照解析出来的ts文件按照咱们知道的规则组拼起来,其下载这些ts文件,存放在手机的sd卡
3.咱们须要在本地搭建一个本地http服务器,咱们以前本打算搭建一个https,可是因为生成的证书是本身生成致使播放器不去访问本地的服务器。
4.本地服务器咱们经过过滤特定的接口名字,来实现根据不一样ts名字返回不一样的视频文件(这里最好生成和原始的ts文件的名字同样)
5.咱们如何知道播放器播完一段视频呢,由于他是一段一段播放的,因此这里就须要咱们在本地生成一份本地指向咱们本地服务器的m3u8文件,直接播放加密
看下加密的m3u8文件的格式:
#EXTM3U #EXT-X-VERSION:3 #EXT-X-KEY:METHOD=AES-128,URI="http://xxxxxx:5555//test/1102/test/segments.key" #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-ALLOW-CACHE:YES #EXT-X-TARGETDURATION:19 #EXTINF:13.966667, http://xxxxxx:5555/test/1102/test/segments0.ts #EXTINF:10.000000, http://xxxxxx:5555/test/1102/test/segments1.ts #EXTINF:10.000000, http://xxxxxx:5555/test/1102/test/segments2.ts #EXTINF:10.000000, http://xxxxxx.cn:5555/test/1102/test/segments3.ts #EXTINF:10.000000, http://xxxxxxn.cn:5555/test/1102/test/segments4.ts #EXTINF:7.033333, http://xxxxxx:5555/test/1102/test/segments5.ts #EXTINF:10.000000,
咱们看到了多了个字段EXT-X-KEY,这个也是m3u8给规定好的加密字段,若是包含这个字段播放器就会先去请求这个key,而后拿这个这个key去访问加密的TS视频就能够播放了。 其实看到这咱们就因该有思路怎么去作,加密的缓存播放了。
实现播放加密缓存的思路:
1.咱们首先按照特定的格式去解析这m3u8文件。
2.按照解析出来的ts文件按照咱们知道的规则组拼起来,其下载这些ts文件,存放在手机的sd卡,这些下载下来的TS视频文件是播放不了的,再把正确的key下载下来。
3.咱们须要在本地搭建一个本地http服务器,咱们以前本打算搭建一个https,可是因为生成的证书是本身生成致使播放器不去访问本地的服务器。
4.本地服务器咱们经过过滤特定的接口名字,来实现根据不一样ts名字返回不一样的视频文件(这里最好生成和原始的ts文件的名字同样)
因为客户端每次请求 TS 或 M3U8 有可能一个新的链接请求, 没法有效的标识客户端, 一旦出现问题, 基本没法有效的定位问题。 通常工业级的服务器都会对传统的 HLS 作一些改进,常见优化是对每一个M3U8文件增长Session来标识一条 HLS 链接。 无论经过哪一种方式, 最终咱们都能经过一个惟一的 id 来标识一条流, 这样在排查问题时就能够根据这个 id 来定位播放过程当中的问题.