如何在AVPlayer swift中检测错误的链接播放

4

我在项目中使用AVPlayer来播放视频流。我的项目是用Swift语言编写的。

如何检测在AVPlayer中播放错误链接?

我尝试了以下代码:

player.addObserver(self, forKeyPath: "status", options:NSKeyValueObservingOptions(), context: nil)

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if (keyPath == "status") {
            let status: AVPlayerStatus = self.playerViewController.player!.status
            switch (status) {
            case AVPlayerStatus.ReadyToPlay:
                print("---------- ReadyToPlay ----------")
                break
            case AVPlayerStatus.Unknown, AVPlayerStatus.Failed:
                print("---------- FAILED ----------")
                break
            }
        }
    }

但结果总是返回:---------- ReadyToPlay ---------- 有任何提示将会很有帮助。谢谢。

你的代码虽然不太符合惯用语法,但结构看起来是正确的。问题出在哪里? - matt
我尝试了一个错误的链接流,但仍然显示 ---------- ReadyToPlay ---------- :-( - MrSiro
@MrSiro,你找到解决方案了吗?我现在也遇到同样的问题,即使提供了一个损坏的链接给播放器,状态仍然显示为准备播放。 - Aivars
2个回答

2
我已经核实过了。
您可以为您的播放器添加此内容。
player.addObserver(self, forKeyPath: "timeControlStatus", options:[.new, .old], context:nil)
player.addObserver(self, forKeyPath: #keyPath(AVPlayer.currentItem.status), options:[.new, .old], context:nil)


override public func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    
    if keyPath == "timeControlStatus", let change = change, let newValue = change[NSKeyValueChangeKey.newKey] as? Int, let oldValue = change[NSKeyValueChangeKey.oldKey] as? Int {
        let oldStatus = AVPlayer.TimeControlStatus(rawValue: oldValue)
        let newStatus = AVPlayer.TimeControlStatus(rawValue: newValue)
        if newStatus != oldStatus {
            DispatchQueue.main.async {
                if newStatus == .playing || newStatus == .paused {
                    //playing
                } else {
                    //loading video
                }
            }
        }
    }
    
    if keyPath == #keyPath(AVPlayer.currentItem.status) {
        let newStatus: AVPlayerItem.Status
        if let newStatusAsNumber = change?[NSKeyValueChangeKey.newKey] as? NSNumber {
            newStatus = AVPlayerItem.Status(rawValue: newStatusAsNumber.intValue)!
        } else {
            newStatus = .unknown
        }
        if newStatus == .failed {
            // this is just error you want to handle
            print("Error: \(String(describing: self.player?.currentItem?.error?.localizedDescription)), error: \(String(describing: self.player?.currentItem?.error))")
        }
    }
}

希望这能对您有所帮助。


1

嗯,我还没有测试过,但试试这个。

player?.addObserver(self, forKeyPath: "status", options: .new, context: nil)
}



override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if (keyPath == "status") {
        let status: AVPlayerStatus = self.player!.status
        if(status == AVPlayerStatus.readyToPlay){
            print("Ready to play")
        }
        else{
            if( status == AVPlayerStatus.unknown){
                print("failed")
            }

        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接