boss让我写博客,说能装X,我就来了!!!☺️
这篇文章最先发布在简书上,今天先拿过来做开山篇。
额~~文采不好,不知道怎么写
来吧,直接切入正题,给大家看看效果吧,免得不是大家想要的东西,浪费大家的宝贵时间。
本来想给大家看视频的,但是不知道怎么放,哈哈哈。
再来看IdiotAVplayer实现了什么功能吧。
相信大家看完上面的图片,大概就知道IdiotAVplayer实现了怎样的功能了,主要就是在选择时间后(seek操作),之前加载的部分会被保存,下次打开会按需加载。本地有数据就从本地取,没有就从网络取(前提是服务器支持Rang,不然没法获取指定区间的数据)。目前为止,网上最多的关于缓存的文章就是AVAssetResourceLoader,但是绝大多数不能再seek动作之后继续缓存,每次seek之后整个音视频就从seek的时间开始了,seek之前的都作废。那么怎么才能实现一个分片缓存的播放器呢?
目前为止,就我搜索到的开源框架有唱吧团队提供的 KTVHTTPCache(可能还有其他的),是不错。但是它很重,不够轻量。下面引用下唱吧github文章的一段
方案演进
在音视频缓存上,我们一共采用过如下 4 个方案:AVPlayer 纯在线播放。
AVPlayer + AVAssetResourceLoader + 下载模块。
AVPlayer + 一个开源的缓存项目(同样基于 AVAssetResourceLoader + 下载模块)。
AVPlayer + KTVHTTPCache。
方案 1 简单直接,缺点也不必多说。
方案 2 的下载模块设计的比较简单,只能顺序下载,不支持分片。导致只能 Seek 到已下载完的地方,在用户体验上会有较大的缺陷。
方案 3 在功能上已经可以满足需求,但在使用中问题较多,我们在源码基础上做了很多修改来填坑。但稳定性依然不是很理想,上线不长时间就将该功能下掉了。
方案 4 是唱吧现在的线上方案,目前在我们的使用场景中还没有发现问题。除稳定性的提升外,比较大的改进是增加了全路径的 Log 模块。若用户或测试同学遇到问题,只需简单描述并回传 Log,就可以快速定位到原因,大大提高了调试效率。
既然觉得唱吧框架很重,那就去寻求比较轻量级的解决方案。因为我开发的app也是重音视频业务的。造个轮子出来是一劳永逸的事情。
方案一是纯在线,略过。
方案二就是大家熟知的AVPlayer + AVAssetResourceLoader。这里我思考了下,既然通过自己的加载方式把数据返回给了AVAssetResourceLoader,那么就应该有办法保存那些已经下载的数据(IdiotAVPlayer就是基于这么个方案)。
原理图(不会画,将就着看吧)
(有朋友反映,有些视频下载不下来,不知道是不是网络问题,还是视频格式问题,我也不懂啊,后面请教我boss 哈哈😝)
好了,今天先装到这里吧
待续(其实我也不知道有没有后续)