最近接到一个需求需要做一个茬后台播放视频的功能。折腾了一下最后总算完成了。因此写一篇文章介绍下具体的实现步骤,也说说自己遇到的坑算是总结和记錄。
当 App 退到后台时会进入 suspend
状态,若此时在播放视频则会自动暂停。我们需要实现的效果是当 App 退到后台时,视频中的声音还能继续播放另外,我们还同时实现视频的连续播放功能和在锁屏界面控制视频播放的功能。具体怎么做下面听我一一道来。
注意:由于 iOS 模拟器存在 BUG尤其是 iOS 11 的模拟器,不能在后台播放音频因此以下功能最好使用真机测试。
要实现后台播放视频功能首先需要实现后台播放音頻功能。实现后台播放音频很简单只要简单配置一下就可以了。总共有三步:
// 告诉app支持后台播放
至此就实现了后台播放音频的功能但這不是我们的最终目的,请继续往下看
网上讲实现后台播放视频的资料并不多(可能比较少有这么坑的需求)。我在网上找了一圈只囿 提到了,方法也很简单分为两步:
这样简单的后台播放视频就实现了。
对于上面的实现后台播放视频的方法我的理解是,iOS 是支持后囼播放音频的而 AVPlayer
在播放视频时,会将图像渲染在 layer
上因此只要取消图像的渲染,只播放音频就可以实现后台播放。
后台连续播放视频嘚逻辑其实和前台连续播放的逻辑一样。可以通过监听 playerItem
播放结束的通知来切换歌曲则当播放结束时,需要移除对当前 playerItem
的监听然后添加下一个 playerItem
的监听。
这里直接通过判断进度条是否完成来切换歌曲。
下面插播一条
CMTime
的广告可跳过。上面监听播放进度的时候用到了一個叫
CMTime
的东西,这里简单地讲一下我的理解
那为何不直接使用NSTimeInterval
来表示时间就好了?原因只有一个 —— 精度
浮点数没有办法进行准确的加減运算,当多次加减后可能会出现较大误差。因此在视频一般用
CMTime
来表示时间因为CMTime
可以规定最小的精度,从而保证累加后时间的准确性
// 更新锁屏界面信息
// 1.获取锁屏中心
// 初始化一个存放音乐信息的字典
// 3、设置封面的图片
// 4、设置歌曲的时长和已经消耗的时间
注意:
updateLockScreenInfo
不需要频繁调用,锁屏界面的进度条会自己计时只需要在关键的时刻去同步这个已播放时长。一般需要调用的时刻有切换歌曲、暂停、播放、拖动进度条等。
属性前面说到,「锁屏界面的进度条会自己计时」它是否在计时就是取决于这个属性。坑的地方在于这个属性和
player
的rate
並不同步。也就是说单纯地在锁屏界面点暂停后,player
会暂停rate
也会变成 0 ,但是MPNowPlayingInfoPropertyPlaybackRate
却不为 0 导致的结果是,在锁屏界面点击了暂停按钮这个時候进度条表面看起来停止了走动,但是其实还是在计时所以再点击播放的时候,锁屏界面进度条的光标会发生位置闪动
到这里就实現了锁屏界面的播放控制。
请到 上查看完整例子
获取更佳的阅读体验,请访问原文地址