花了两周时间,总算把项目的短视频播放功能开发完了,总结一下项目里遇到的几个问题。
1. AVPlayer无缝切换播放
开始我的思路是UITableViewCell+AVPlayer实现,每个cell上都有一个播放器,使用AVPlayerManager的单例管理所有的播放器。
缺点:当滑动的慢的时候还好,快速滑动时,AVPlayer不停的创建,回收,性能消耗过多,滑动很多个视频之后,有时会出现视频播放时卡顿的现象。同时,使用单例管理播放器的时候容易不小心造成内存泄露。
解决方案:UIViewController+AVPlayer实现,当前控制器上只有一个播放器,播放器的生命周期由Controller管理,使用self.currentIndex确定当前播放的是哪个视频。没有播放视频的cell上显示coverView占位图(占位图如果是视频的第一帧,切换之后播放视频时,用户几乎无感知,体验极好),播放时将playerView添加至coverView上。
2. 短视频占位图高度高于视频问题
跟产品确认后,发现他们用的占位图不一定是视频第一帧,如果占位图高于视频,那么视频播放时就需要隐藏coverView占位图,滑动之后,之前的coverView又需要重新显示。
解决方案:cell上新增一个containerView,先添加coverView。containerView添加playerView时隐藏coverView,滑动之后隐藏的cell重新显示coverView。
3. 短视频预加载功能实现
根据self.currentIndex,预加载之后3个视频的最小缓冲量(转码时保证视频的第一帧是I帧,那么一个I帧的数据加上当前视频格式的元数据,这些就是我们起播视频所需要的最小缓冲量)。同时,预加载时保证正在播放的短视频能顺畅的播放,边下边播任务优先级高于预加载任务,在没有边下边播任务时才能执行预加载任务,并且当有新的边下边播任务时应当停止当前的预加载任务,首要执行边下边播任务。