3

我正在尝试快速向我的 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)

但我不确定它为什么会崩溃。关于可能导致这种情况的任何想法?

4

1 回答 1

1

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

要观察's 的loadedTimeRanges属性,您可以简单地执行以下操作:playercurrentItem

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

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

observation = nil
于 2020-10-13T10:14:23.067 回答