iOS AVPlayer 视频缓存

        最近的项目中用到了视频播放的缓存技术,通俗的讲就是视频边下载边播放 已经下载的部分需要缓存起来,下次播放或者快进、快退或者无网络时到播放到缓存的部分可以直接播放不用下载。 

      找了一下相关的技术发现在iOS中官方支持的比较灵活能够自定义的也就是AVPlayer了,但是它所能支持的格式比不多,还好我的项目中够用了。当然还有其他的方式,比如Ijkplayer 但是它本身比不支持缓存,需要自己去添加,相比之下的难度大了不少。不过AVPlayer 也有先天的不足,后面会讲到。

在使用AVPlayer 之前我在网上找了很多的资料,可惜没有找到一个可以处理缓存碎片的方法。只能是自己去写一个了。缓存的难点在于碎片化,不是连续的中间需要去请求数据。要顺序操作下来。

最初我实际操作了一段时间发现只要完成下载后的数据 跟碎片数据段的融合,和对碎片数据段的读区两个算法这个方案就解决了,现在回头看看真是too young too simple ,后面AVPlayer 播放不流畅的坑耗费了我更多的时间。

当然 上面提到的两套算法是核心,关于如何对AVPlayer 使用缓存,不是本文介绍的重点请先熟悉它的流程。 首先如果没有缓存那就直接创建了比较简单。 把loader 下发的request 根据 它请求的区间段 利用前面提到的算法,返回一个 数组,里面是 @{start,end,isNull} 字典 数据的区间段,表明数据段的开始,截止,和是否储存,

然后加入到一个队列中(NSOperation),每一个数据段都创建一个NSOperation ,在NSOperation 中对已经下载的部分把数据取出来直接返回给request。对于没有下载的去下载,下载完成后用算法对碎片数据进行融合。

以上就是最基本的流程,比较让人头疼的是AVPlayer 的特性,比如视频已经是完整时,它下发的request 请求的是整个视频的数据,然后一次性把这些数据返回给它,会让播放器卡住 不再播放。可能是因为数据量比较大。AVPlayer 对播放器的状态 提示不是很清楚,而且很有限。

 好了先写这些   这是我项目的地址  感觉有用的记得给个星!

https://github.com/taohailong/AVPlayerCache.git

用pod添加

pod 'AVPlayerCacheLibrary', :git => 'https://github.com/taohailong/AVPlayerCache.git'

你可能感兴趣的:(iOS AVPlayer 视频缓存)