视频流文件的边播放边下载

       对于视频流文件的缓存,可能大多数人想到的是使用本地代理服务器的方式,这种方式原理很简单,但是缺点也是显而易见的,需要些写一个本地代理服务器或则直接使用第三方库httpSever。但是使用httpSever作为本地代理服务器,下载一个视频任务不大,但是多个视频任务之间相互切换,此时httpSever提供的数据就很不稳定。

      问了解决上面的问题,我采用iOS7以后系统提供的方法去实现视频的边播放边下载。在这里先申明,对于视频流文件的本地缓存,并不是开辟一个新的子线程去下载,而是使用直接把播放的数据流保存到本地。从而,我们用一遍流量达到了既观看视频有缓存数据的目的。

    对于AVPlayer相信大家都比较熟悉,但我还是用简单的几句话来阐述一下他的工作原理,我们使用AVPlayer播放视频的时候,会给AVPlayer设置一个URL等参数,这个时候AVPlayer会向URL所在的服务器发送数据请求,在请求参数中会包含一个NSRange的参数(NSRange是一个结构体,offset偏移量和lenght长度),这个参数表明了此次请求所需要的数据和数据量。然而服务器会更具NSRange返回相应的数据。当然这只是一个大致的工作流程,具体到怎么发送的请求,怎么与服务器建立的连接,数据怎么返回的,这不是本篇博客所要讲述的重点,因此博主就不在这里详细论述了(ps:主要是因为博主是个屌丝也没有搞懂)。

实现方案


视频流文件的边播放边下载_第1张图片

结合上面的大致原理图,我们来谈一谈各个模块的处理流程。

视频播放器

      当使用AVPlayer进行视频播放的时候,根据设定的URL去判断沙盒中是否存在资源(如何查找资源是否存在,这个是数据库方面的内容我就不多说了),如果存在我们直接播放本地视频即可,如果不存在AVPlayer此时像代理服务器发送数据请求。当然在视频加载如法播放过程中我们可以加上相应的提示。

代理对象

      当接收到AVPlayer的数据请求信息的时候,判断是否已经向服务器发送了请求,如果没有直接发送下载整个视频文件的请求。

      如果代理已经和服务器建立链接,则判断当前的AVPlayer发送的请求中offset是否大于当前已经缓存的文件的总长度,如果大于则取消当前与服务器的请求,并从offset开始到文件尾向服务器发起请求(ps:由于播放器向后拖拽,并且超过了已缓存的数据时才会出现)

      如果当前的AVPlayer发送的请求的offset小于已经缓存的文件的总长度,同时大于代理向服务器请求的offset,说明有一部分已经缓存的数据可以传给播放器,则将这部分数据返回给播放器(ps:由于播放器向前拖拽,请求的数据已经缓存过才会出现)

      如果当前的AVPlayer发送的请求的offset小于代理向服务器请求的offset,则取消当前与服务器的请求,并从offset开始到文件尾向服务器发起请求(ps:由于播放器向前拖拽,并且超过了已缓存的数据时才会出现)

      如果代理对象向服务器发送过第二次建立连接请求,这个时候缓存数据可能是不连续的,就没有必要将数据持久化到沙盒中。

      如果服务器返回其他错误,则代理通知播放器网络错误。

[相关代码]

[欢迎交流]

你可能感兴趣的:(视频流文件的边播放边下载)