【问题标题】:In iOS AVPlayer, addPeriodicTimeObserverForInterval seems to be missing在 iOS AVPlayer 中,似乎缺少 addPeriodicTimeObserverForInterval
【发布时间】:2016-11-07 18:43:59
【问题描述】:

我正在尝试设置AVPlayer.addPeriodicTimeObserverForInterval()。有人用过成功吗?

我正在使用 Xcode 8.1、Swift 3

【问题讨论】:

    标签: ios swift xcode avplayer


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 2019-11-24
      • 2017-01-03
      相关资源
      最近更新 更多