【问题标题】:Adding observer to AVPlayer causes a crash with no printout in console将观察者添加到 AVPlayer 会导致崩溃,控制台中没有打印输出
【发布时间】:2021-01-27 07:25:07
【问题描述】:

我正在尝试向我的 AVPlayer 快速添加一个观察者,以允许在视频开始播放时读取以控制我的播放器上的其他功能。当我运行以下代码时:

func setUpPlayer() {
     if let url = URL(string: urlString) {
        player = AVPlayer(url: url)
        let playerLayer = AVPlayerLayer(player: player)
        self.layer.addSublayer(playerLayer)
        playerLayer.frame = self.frame
        player?.play()
        player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)
        }
    }
    
    
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "currentItem.loadedTimeRanges" {
           print(change)
        }
    }

我的应用程序崩溃,控制台中没有任何解释。我找到了导致它的代码行:

player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)

但我不确定它为什么会崩溃。关于可能导致此问题的任何想法?

【问题讨论】:

  • 真的没有打印出来吗?控制台可能会被隐藏,按 Command + Shift + Y 并单击右下角的框
  • @aheze 不幸的是,没有打印出崩溃的原因,我的所有其他打印语句都在运行,当我在特定线路 player?.addObserver 上中断时,它在那里中断并出现错误但什么也没有在该代码行右侧的控制台中打印它,就像出现其他构建错误一样。这就是为什么我很困惑为什么控制台中什么都没有打印,或者为什么它甚至会抛出这样的错误。

标签: swift avplayer observers ios14 keypaths


【解决方案1】:

你可以尝试使用swift 4以来KVO的新方法。

要观察playercurrentItemloadedTimeRanges 属性,您可以这样做:

observation = player?.currentItem?.observe(
    \.loadedTimeRanges,
    options: .new
) { (item: AVPlayerItem, value: NSKeyValueObservedChange<[NSValue]>) in
    print("loadedTimeRanges: \(value.newValue ?? [])")
}

只要您想观察该属性,就保留返回的observation 引用。要手动停止观察,只需将observation 引用设置为nil

observation = nil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多