第一篇自己的文章... 有点不知道怎么开始。
如果你只是来拿代码的,那给你地址IdiotAVPlayer
项目的名字叫IdiotAVplayer,但是大家别误会,Idiot不是说大家是蠢人,说的是俺自己,因为自己也看了不少大神们的开源项目,觉得他们的技术很牛✘,所以就把自己的库命名为Idiot开头。
还是先给大家看看效果吧,免得不是大家想要的东西,浪费大家的宝贵时间。
本来想给大家看视频的,但是简书只支持腾讯和优酷,想看视频的点这里。
再来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就是基于这么个方案)。
原理图