视频播放器
1、UI需求
- 小窗口播放
- 全屏播放
- 支持旋屏
- 手势点击后播放进度条的显示隐藏
2、Video 相关
- 支持边下边播(缓存)
- 缓存已经播放过的近期视频
- playback
- 基本操作(resume, pause, reset, rate control等)
- 播放的时间及进度条跟随播放进度自行调整
- 手动拖动播放
- 可以拖动到未下载完的位置吗?
- 声音控制
本播放器。 要支持边下边播的实现
方法1:缓存采用HttpServer方案
本地起一个HTTP Server,AVPlayer通过本地的URL播放,即可做到边下载边播放。
方法2:基于AVAssetResourceLoder封装的缓存SDK
CJVideoCache的SDK,是用的另外一套机制实现的。CJPlayerManager提供了清除缓存文件的接口。
两种方案比较:
httpServer支持iOS5以上,而系统AVAssetResourceLoder方案不支持,但是AVAssetResourceLoder是比较好的方案
- 替换视频资源URL的scheme为系统无法识别的scheme, 得到一个伪造的url.
- 使用伪造的url初始化AVURLAsset, 并指定AVURLAsset的resourceLoader属性的委托.
- 通过resourceLoader的委托方法对视频资源数据的请求进行拦截,根据截获到resourceLoader的请求的offset和length, 首先检查本地是否存在缓存数据,如果已存在,则直接从缓存文件中读取缓存数据,并返回给resourceLoader的请求;
- 否则计算未缓存的文件块,然后发起网络请求,通过http的range方式向服务器请求相应的视频资源数据. 网络请求每次返回的数据,先追加缓存到一个nsdata中(目的在于减少文件IO),如果nsdata的长度大于一个分片长度,则写入缓存文件,并更新缓存描述文件,标记对应的片段已缓存,然后通知拦截器读取缓存数据,返回给resourceLoader的pending请求.
备注:缓存文件采用分片方式进行缓存,每个分片为10k, 具体大小可以调整。且该组件只适用于AVPlayer播放视频.
- iOS版本要求: >= 7.0
- 服务端要求: N/A
以POD形式导入SDK项目
pod 'CJMediaPlayer', :tag => '1.0.0'
- N/A
- VideoViewController.*
[self.playerView setVideoURL:[NSURL URLWithString:@"http://xxx.mp4"]
coverImage:nil
needCache:NO
maskType:PlayerMaskViewNormal];
- 自定义UI部分 详细的自定义见CJPlayerMaskView.h中的接口和注释
1.生成伪URL(替换视频资源的scheme为自定义的scheme),并用其创建AVURLAsset:
NSURL *url = [NSURL URLWithString:@"http://mvvideo2.meitudata.com/56f103d8d2cf51799.mp4"];
NSURL *fakeUrl = [MTAVUtil fakeUrl:url];
AVURLAsset *videoURLAsset = [AVURLAsset URLAssetWithURL:fakeUrl options:nil];
2 创建CJAVAssetResourceLoaderManager缓存实例,并将其设置给AVURLAsset的resourceLoader属性的委托(注意这里的缓存实例必须是强制拥有的)
CJAVAssetResourceLoaderManager *loaderManager = [[CJAVAssetResourceLoaderManager alloc] init];
[videoURLAsset.resourceLoader setDelegate:loaderManager
queue:dispatch_get_main_queue()];
3 附加:如果有视频播放的切换时,记得要调用CJAVAssetResourceLoaderManager的clean方法,清理一下,例如:
[self.loaderManager clean];
备注:全局只需一个CJAVAssetResourceLoaderManager的实例即可,播放切换时 必须先clean一下.
- 缓存问题 - 播放10s内的视频文件时,可能会出现刚开始黑屏的现象,貌似边下边播对于超短视频,其实已经要下载完才开始播放了
- 同一时刻只支持一个视频下载
- 耗电问题 - 长时间维持一个local http server,不过具体的能耗我也没有测量过
- 播放器现在采用了状态机机制,容易出现bug等问题,后续这一块需要寻找更好的方案替换掉
- 播放器在不同场景下容易出现比较多的bug,如多个播放器在一个tableview中,在SDK调试时容易出现问题
- 如果发现SDK不能满足产品需求,建议先与组件维护联系人反馈,协商处理方案。
- 如果发现SDK的bugs,也可以先行沟通,确认没有在修的情况下,可以通过个人分支修复,发起Pull Request来让维护同学review后合并到发布分支,跟着下一个SDK tag版本发布。
iOS dvlproad ([email protected])
- 暂无
[0.0.1] 2016.04.09 提取组件,构造podspec,并修改Readme