大数跨境
0
0

「实战分享」iOS视频边下边播

「实战分享」iOS视频边下边播 网信科技
2019-05-10
1
导读:作者:网信科技智慧政务产品部——陆非凡年前接到了视频要能边下边播这样的需求,我分析了一下需求具体应该是这样:

作者:网信科技智慧政务产品部——陆非凡


年前接到了视频要能边下边播这样的需求,我分析了一下需求具体应该是这样:

  1. 支持正常播放器的一切功能,包括暂停、播放和拖拽。

  2. 如果视频加载完成且完整,将视频文件保存到本地cache,下一次播放本地cache中的视频,不再请求网络数据。

  3. 如果视频没有加载完(半路关闭或者拖拽)就不用保存到本地cache。

 

我努力思索翻阅文档决定这样实现

  1. 需要在视频播放器和服务器之间添加一层类似代理的机制,视频播放器不再直接访问服务器,而是访问代理对象,代理对象去访问服务器获得数据,之后返回给视频播放器,同时代理对象根据一定的策略缓存数据。

  2. AVURLAsset中的resourceLoader可以实现这个机制,resourceLoader的delegate就是上述的代理对象。

  3. 视频播放器在开始播放之前首先检测是本地cache中是否有此视频,如果没有才通过代理获得数据,如果有,则直接播放本地cache中的视频即可。

 

(具体流程图)


视频播放器处理流程:

  1. 当开始播放视频时,通过视频url判断本地cache中是否已经缓存当前视频,如果有,则直接播放本地cache中视频。

  2. 如果本地cache中没有视频,则视频播放器向代理请求数据。

  3. 载视频时展示正在加载的提示(hud)。

  4. 如果可以正常播放视频,则去掉加载提示,播放视频,如果加载失败,去掉加载提示并显示失败提示。

  5. 播放过程中如果由于网络过慢或拖拽原因导致没有播放数据时,要展示加载提示,跳转到上一步。

 

 (视频播放器)

 

视频播放代理处理流程:

1. 当播放器需要预先缓存一些数据的时候,不让播放器直接向服务器发起请求,而是向代理发起缓存请求。

2. 代理根据播放器的缓存请求的请求内容,向服务器发起请求。

3. 服务器返回代理所需的数据。

4. 代理把服务器返回的数据写进本地的缓存文件中。

5. 当需要播放某段声音的时候,向代理发出播放请求索要这段音频文件。

6. 代理从本地的缓存文件中找到播放器播放请求所需片段,返回给播放器。

7. 播放器拿到数据播放。

8. 当整首歌都缓存完成以后,代理需要把缓存文件拷贝一份,改个名字,这个文件就是我们所需要的本地持久化文件。

9. 下次播放器再播放歌曲的时候,先判断下本地有木有这个名字的文件,有则播放本地文件,没有则向代理要数据。



resourceLoader的难点处理



(resourceLoader的难点)


播放器发出的数据请求从这里开始,我们保存从这里发出的所有请求存放到数组,自己来处理这些请求,当一个请求完成后,对请求发出finishLoading消息,并从数组中移除。正常状态下,当播放器发出下一个请求的时候,会把上一个请求给finish。


下面这个方法发出的请求说明播放器自己关闭了这个请求,我们不需要再对这个请求进行处理,系统每次结束一个旧的请求,便必然会发出一个或多个新的请求,除了播放器已经获得整个视频完整的数据,这时候就不会再发起请求。


 

下面这个方法是对播放器发出的请求进行填充数据

 

 

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

 

 

resourceLoader的难点基本上就是上面这点了,解决了resourceLoader再配合Avplayer就可以实现边下边播了,播放器得样式可以使用AVPlayer进行自定义。

IT综合服务商

智慧旅游解决方案专家




【声明】内容源于网络
0
0
网信科技
苏州网信信息科技股份有限公司成立于2007年,公司总部设立在江苏省苏州市,目前拥有近百名员工。公司主要从事智慧城市规划设计与实施,包括智慧城市、数字企业、信息安全、信创服务、大数据、云计算、元宇宙等业务方向。
内容 403
粉丝 0
网信科技 苏州网信信息科技股份有限公司成立于2007年,公司总部设立在江苏省苏州市,目前拥有近百名员工。公司主要从事智慧城市规划设计与实施,包括智慧城市、数字企业、信息安全、信创服务、大数据、云计算、元宇宙等业务方向。
总阅读297
粉丝0
内容403