MP4大文件虚拟HLS分片技术,避免服务器大量文件碎片

MP4大文件虚拟HLS分片技术,避免点播服务器的文件碎片

本文主要介绍了经过虚拟分片技术,把MP4文件,映射为HLS协议中的一个个小的TS分片文件,实现了在不实际切分MP4文件的状况下,经过HLS协议播放MP4文件,从而避免了对MP4进行点播,尤为是大的MP4文件,须要长时间缓冲MP4头部数据的问题,同时能够解决对MP4文件进行切分,会在服务器制造出大量的文件碎片的不利状况。并且本技术,几乎能够不须要对流媒体服务器(HTTP服务)作修改。html

背景

  • HLS全称Http Live Streaming是当前普遍使用的直播和点播技术,最先是苹果公司实现的,跟MPEG-DASH同样是基于HTTP协议传输,可嵌入HTML5标签中播放,如今已经被移动平台的浏览器普遍支持,在pc上也能够经过js和MSE(Media Source Extensions)来实现。HLS的特色是分片文件小,加载很快,使用TS容器,格式简单,经过HTTP传输,基本不须要考虑防火墙问题,因此很快就被推广开了。
  • MP4你们就更熟悉了,就是由一个个box组成的媒体文件容器,就很少说了。须要指出的一点是,MP4基本上是能够分为普通MP4和FragmentMP4来,后者主要特征包含许多moof box把mp4文件分割为许多能够单独解码的单元,更适合与流媒体场景下的数据传输,我最先见到它的应用,是在微软早年推出的“SilverLight + Smooth Streaming”技术中(微软已弃坑?)。FMP4的应用也在逐渐发展中,不过比TS有一点不太好的地方是它格式有点复杂了,关于FMP4相关的技术我以后写文章介绍。

对于你们常常见到和使用到的普通MP4来讲,做为电影、电视文件的存储容器,是很好的,不过对于流媒体点播来讲,最大的缺点就是它的媒体信息和关键帧索引都集中存放在moov box中,而致使越大的文件,moov box越大,对播放器来讲,获取不到moov box,根本无从解码,因此就致使MP4文件点播,须要缓冲好久,加载头部数据。固然常看法决方案,就是文件切分,把大的MP4文件,切为小一点的MP4文件,这样每块的MP4的加载就会快不少,这个也是不少视频网站的解决方式,这样的切分也还好,分片数量不算不少。然而到了HLS时代,为了支持HLS协议,就须要把大的MP4文件,都转换为了更小的HLS-TS分片文件,这就出现问题了,服务器太多碎片同样的TS文件,难以管理,也影响性能。怎么解决呢?那就是虚拟HLS分片技术。浏览器

技术分析

1. 虚拟分片逻辑

一个常见的mp4文件结构以下图所见。其中最重要的便是MoovBox,记录了后续全部音频帧和视频帧的解码信息、时间戳、位置等很是关键的数据,图里称作索引数据,而在视频帧中,关键帧是最重要的节点,播放器会在关键帧位置对整个图像进行刷新,能够认为是图像解码的起点。服务器

虚拟HLS分片,顾名思义,就是不实际切片,只记录实际MP4文件和须要切分的TS分片直接的数据对应关系,而后在播放器实际请求播放的时候,经过对应关系,把相应的音频视频数据,在内存中拼装为TS文件。好比,对上述MP4文件,请求0~2秒的数据,那么就须要经过对应记录,找到0~2秒的数据,组合成MPEG-TS格式,生成HLS分片文件。固然,切分的过程须要注意,就是分片起点必须是视频关键帧的节点,不然生成文件就没法正常解码。性能

2. 设计方案

根据以前分析的描述分片逻辑,就能够根据moov box中罗列的音频和视频帧索引,把整个mp4文件,根据关键帧为界限,进行虚拟分片的划分,每一个分段就对应一个ts文件,并把这种对应关系写入到索引文件(我这里定义为xxx.index文件)。整个方案的示意图以下,图里描述的很清楚了网站

上图中Sample1 Sample2 ... 指代的是音频和视频帧,这里没有作区分,不影响理解。设计

简单说明一下:视频

xxx.mp4是要点播的原始文件,xxx.m3u8是给HLS播放器使用的播放地址文件,里面罗列了全部的ts分片地址,(对m3u8和HLS更具体介绍能够看我另外一片文章“HTTP Live Streaming直播(iOS直播)技术分析与实现”)。xxx.index是根据虚拟分片的状况,生成的描述文件,或者说索引文件,内部记录每一个TS分片(索引文件里被记录为segment)在真实MP4文件中的分布地址。这样,xxx.mp4,xxx.m3u8和xxx.index,共同组成了本方案的所有相关文件。实际应用过程当中,客户端或者服务器端根据m3u8文件和index文件的内容,很容易就计算出HLS播放器请求的TS分片所对应的实际数据位置,从而拼装数据,实现HLS点播流。htm

3. 流程

下图的流程展现了从HLS播放器请求m3u8地址开始,到HLS播放器获取到第一个TS分片文件为止的逻辑过程。这里面除了服务器端和播放器端,还有一个我定义的“适配端”,这个适配端主要作的工做就是根据index文件和m3u8文件,计算出真实数据位置,而后向服务器发送Range请求,并将服务器返回的数据,组成TS分片文件,再回传给HLS播放器。这个适配端是整个流程的关键之处。blog

适配端能够放在服务器上,也能够放在客户端上。若是放在客户端,那服务器端就几乎不须要任何改动,就能够实现虚拟HLS分片技术。若是整合到服务器端,那客户端也基本不须要什么改动。索引

实现

  1. 首先是对mp4文件进行处理,生成对应的index文件和m3u8文件

进行切片,并计算index文件中segment和ts对应关系的过程以下:

  1. 而后是编写适配端,为请求的TS分片组合数据

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

haibindev.cnblogs.com,合做请联系QQ。(转载请注明做者和出处~)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

相关文章
相关标签/搜索