iOS开发-AVPlayer的缓存问题

背景

互联网产品有个大家聊得非常多的词语“用户体验”,怎么提升用户体验是一个app最需要突破的问题。对于一个视频播放器来说,缓存是一把双刃剑,加入缓存可以减少用户再次打开时的等待时间(菊花转得确实让人挺烦的)。but,加入缓存也是16G用户的一个痛点,随便一个几分钟的视屏就是10-20M,所以很有可能因为缓存占用太多内存而被用户卸载掉~

实现方案

视屏缓存其实有很多种方案都可以实现,并且,苹果也提供了非常友好的api供我们使用。
1. 使用AVURLAsset中的代理方法: resourceLoader: shouldWaitForLoadingOfRequestedResource:loadingRequest
2. 搭建本地webServer服务,通过AVPlayer向本地webServer服务器请求数据,如果本地没有数据,webServer服务器再发起网络请求,否则,直接返回本地数据。

方案一:

如果你们项目里面只需要播放mp4等一些常见的格式视频的话,这个方案是非常合适的,经过我的测试,这个方法只能获取到一次网络请求,而这些常见格式的视频都是单文件形式的,也就是说只会有一次网络请求,so,可以完成。
但是非常不幸的是,我们的项目中使用的是m3u8格式的视频,这个格式的视频不是单一的文件,而是分段的,第一次网络请求获取到的数据只是一个视频分段描述文件。

方案二:

既然第一个方案不行,那总得想个办法来解决吧。于是乎各种百度、谷歌、stackflow。一顿狂搜之后,公司放春节假了~
其实这个方案也并不复杂,大致实现就是我前面说的那样的。

具体做法

重点说下方案二吧,方案二需要使用GCDWebServer(https://github.com/swisspol/GCDWebServer)这个库,用来搭建本地服务器。

  1. 拼凑路径

    因为我们需要请求本地服务器,所以视频的路径就不是网络路径了。这里我采取的方法是把网络路径作为参数,加在本地路径后面,然后在用本地路径去请求本地服务器数据。

    比如说你的网络视频地址为:www.aaa.com/list.m3u8
    那么拼成新的地址则为:localhost:8080/list.m3u8?realUrl=www.aaa.com/list.m3u8

    把真实网络地址写在上面是为了后面请求网络数据。

  2. 判断是否已经缓存


自己写的BUG,哭着也要改好!





本文已在版权印备案,如需转载请访问版权印。