在 iOS AVPlayer 中,似乎缺少 addPeriodicTimeObserverForInterval
Posted
技术标签:
【中文标题】在 iOS AVPlayer 中,似乎缺少 addPeriodicTimeObserverForInterval【英文标题】:In iOS AVPlayer, addPeriodicTimeObserverForInterval seems to be missing 【发布时间】:2016-11-07 18:43:59 【问题描述】:我正在尝试设置AVPlayer.addPeriodicTimeObserverForInterval()
。有人用过成功吗?
我正在使用 Xcode 8.1、Swift 3
【问题讨论】:
【参考方案1】:接受的答案让人觉得您可以将返回值分配给局部变量并忽略它。但根据doc,实际上重要的是保持对返回值和removeTimeObserver(_ :)
的强引用。
只要您希望播放器调用时间观察器,就必须保持对返回值的强引用。此方法的每次调用都应与相应的调用配对 removeTimeObserver(:) .释放观察者对象而不调用 removeTimeObserver(:) 将导致未定义的行为。
所以我会这样做:
if let ob = self.observer
player.removeTimeObserver(ob)
let interval = CMTimeMake(1, 4) // 0.25 (1/4) seconds
self.observer = player.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main) [weak self] time in
...
【讨论】:
removeTimeObserver 的文档指出,由 addPeriodic... 调用的块有时甚至可以在我们调用 removeTimeObserver 之后调用。我目前无法确保不会发生这种情况,因为我怀疑这会在我删除 VC 时导致一些崩溃,即使我确保在关闭 VC 时删除了时间观察器。 还没有尖叫万岁,对于仍在观看的人来说,我似乎已经解决了我的崩溃问题。在 avplayer 上释放时间观察器后,我还确保从任何对象(包括使用它的视图/层)中释放/删除 avplayer 本身,并且它似乎可以让崩溃远离至少 50 次左右的尝试。过去每 10 次尝试就会发生崩溃。 不知道确切原因,但我怀疑 AVPlayer 稍后会返回调用addPeriodicTimeObserver
指定的块。这通常是视图控制器,就我而言,是视图控制器。如果视图控制器在此之前被解除/释放,无论您是否释放观察者,它都会崩溃。我没有找到另一种方法(玩队列等)【参考方案2】:
查看func addPeriodicTimeObserver(forInterval interval: CMTime, queue: DispatchQueue?, using block: @escaping (CMTime) -> Void) -> Any
在文档中也有例如检查这个代码sn-p
let timeObserverToken = player.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main) [unowned self] time in
引用自here
【讨论】:
以上是关于在 iOS AVPlayer 中,似乎缺少 addPeriodicTimeObserverForInterval的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7 上的 MPNowPlayingInfoCenter AVPlayer