在 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

iOS AVPlayer seektotime 锁定在某些点

iOS 4.0 音量衰减

在 iOS 中获取 AVPlayer 的音量

使用 AVPlayer 在 iOS 中音频流期间的播放速度

带有 AVPlayer 的音频流