作者:网信科技智慧政务产品部——陆非凡
年前接到了视频要能边下边播这样的需求,我分析了一下需求具体应该是这样:
支持正常播放器的一切功能,包括暂停、播放和拖拽。
如果视频加载完成且完整,将视频文件保存到本地cache,下一次播放本地cache中的视频,不再请求网络数据。
如果视频没有加载完(半路关闭或者拖拽)就不用保存到本地cache。
我努力思索翻阅文档决定这样实现:
需要在视频播放器和服务器之间添加一层类似代理的机制,视频播放器不再直接访问服务器,而是访问代理对象,代理对象去访问服务器获得数据,之后返回给视频播放器,同时代理对象根据一定的策略缓存数据。
AVURLAsset中的resourceLoader可以实现这个机制,resourceLoader的delegate就是上述的代理对象。
视频播放器在开始播放之前首先检测是本地cache中是否有此视频,如果没有才通过代理获得数据,如果有,则直接播放本地cache中的视频即可。

(具体流程图)
视频播放器处理流程:
当开始播放视频时,通过视频url判断本地cache中是否已经缓存当前视频,如果有,则直接播放本地cache中视频。
如果本地cache中没有视频,则视频播放器向代理请求数据。
加载视频时展示正在加载的提示(hud)。
如果可以正常播放视频,则去掉加载提示,播放视频,如果加载失败,去掉加载提示并显示失败提示。
在播放过程中如果由于网络过慢或拖拽原因导致没有播放数据时,要展示加载提示,跳转到上一步。

(视频播放器)
视频播放代理处理流程:
1. 当播放器需要预先缓存一些数据的时候,不让播放器直接向服务器发起请求,而是向代理发起缓存请求。
2. 代理根据播放器的缓存请求的请求内容,向服务器发起请求。
3. 服务器返回代理所需的数据。
4. 代理把服务器返回的数据写进本地的缓存文件中。
5. 当需要播放某段声音的时候,向代理发出播放请求索要这段音频文件。
6. 代理从本地的缓存文件中找到播放器播放请求所需片段,返回给播放器。
7. 播放器拿到数据播放。
8. 当整首歌都缓存完成以后,代理需要把缓存文件拷贝一份,改个名字,这个文件就是我们所需要的本地持久化文件。
9. 下次播放器再播放歌曲的时候,先判断下本地有木有这个名字的文件,有则播放本地文件,没有则向代理要数据。
resourceLoader的难点处理

(resourceLoader的难点)
播放器发出的数据请求从这里开始,我们保存从这里发出的所有请求存放到数组,自己来处理这些请求,当一个请求完成后,对请求发出finishLoading消息,并从数组中移除。正常状态下,当播放器发出下一个请求的时候,会把上一个请求给finish。
下面这个方法发出的请求说明播放器自己关闭了这个请求,我们不需要再对这个请求进行处理,系统每次结束一个旧的请求,便必然会发出一个或多个新的请求,除了播放器已经获得整个视频完整的数据,这时候就不会再发起请求。
下面这个方法是对播放器发出的请求进行填充数据

这是对存放所有的请求的数组进行处理

resourceLoader的难点基本上就是上面这点了,解决了resourceLoader再配合Avplayer就可以实现边下边播了,播放器得样式可以使用AVPlayer进行自定义。
IT综合服务商
智慧旅游解决方案专家

