基于AVAssetResourceLoader的AVPlayer的缓存实现

2016-11-15 王建伟 iOS开发

AVAssetResourceLoader的作用:让我们自行掌握AVPlayer数据的加载,包括获取AVPlayer需要的数据的信息,以及科研决定传递多少数据给AVPlayer。

AVAssetResourceLoader在AVPlayer中的位置如下:

实现核心

使用AVAssetResourceLoader需要实现AVAssetResourceLoaderDelegate的方法:

要求加载资源的代理方法,这时我们需要保存loadingRequest并对其所指定的数据进行读取或下载操作,当数据读取或下载完成,我们可以对loadingRequest进行完成操作。

取消加载资源的代理方法,这时我们需要取消loadingRequest所指定的数据的读取或下载操作。

实现策略

通过AVAssetResourceLoader实现缓存的策略有多种,没有绝对的优与劣,只要符合我们的实际需求就可以了。

1、开始播放,同时开始下载完整的文件,当文件下载完成时,保存到缓存文件夹中;

2、当seek时

(1)如果seek到已下载到的部分,直接seek成功;(如下载进度60%,seek进度50%)

(2)如果seek到未下载到的部分,则开始新的下载(如下载进度60%,seek进度70%)

PS1:此时文件下载的范围是70%-100%

PS2:之前已下载的部分就被删除了

PS3:如果有别的seek操作则重复步骤2,如果此时再seek到进度40%,则会开始新的下载(范围40%-100%)

3、当开始新的下载之后,由于文件不完整,下载完成之后不会保存到缓存文件夹中;

4、下次再播放同一歌曲时,如果在缓存文件夹中存在,则直接播放缓存文件;

实现流程

流程示意图:

1、通过自定义scheme来创建avplayer,并给AVURLAsset指定代理(SUPlayer对象)

2、代理实现AVAssetResourceLoader的代理方法(SUResourceLoader对象)

(3)如果是seek之后的loadingRequest,判断请求开始的位置,如果已经缓冲到,则直接读取数据

3.4如果还没缓冲到,则重新请求

4、数据请求的处理(newTaskWithLoadingRequest方法

(1)先判断是否已经有下载任务,如果有,则先取消该任务

(2)建立新的请求,设置代理

5、数据响应的处理(processRequestList方法)

对requestList里面的loadingRequest填充响应数据,如果已完全响应,则将其从requestList中移除

填充响应数据的过程如下:

(1)填写 contentInformationRequest的信息,注意contentLength需要填写下载的文件的总长度,contentType需要转换

(2)计算可以响应的数据长度,注意数据读取的起始位置是当前avplayer当前播放的位置,结束位置是loadingRequest的结束位置或者目前文件下载到的位置

(3)读取数据并填充到loadingRequest

(4) 如果完全响应了所需要的数据,则完成loadingRequest,注意判断的依据是 响应数据结束的位置 >= loadingRequest结束的位置

(2)建立新的连接,如果是seek后的请求,则指定其请求内容的范围

(3)当收到数据时,将数据写入临时文件,更新下载进度,同时通知代理处理requestList

(4)当下载完成时,如果满足缓存的条件,则将临时文件拷贝到缓存文件夹中

网站备案号:京ICP备11043289号-1 北京市公安局网络备案 海1101084571
版权所有 北京育灵童科技发展有限公司 Copyright © 2002-2018 www.elight.cn, All Rights Reserved