Swift iOS - 如何从AVPlayerItemStatus访问错误?

8
我正在使用AVPlayer来播放一个视频链接。我遵循了苹果公司的代码 来播放视频并处理错误:
在名为 Respond to A State Change 的部分中,有一个switch语句,其中有一个.failed情况,并且注释掉的代码说:// Player item failed. See error. 我已经通过在那里设置断点来运行了几次。

enter image description here

问题在于我没有看到任何像 NSError 类型的变量,这会给我提供一个选项来实际打印出错误是什么。如何找出 .failed 错误是什么?
观察播放器状态:
let url: URL = // Asset URL
var asset: AVAsset!
var player: AVPlayer!
var playerItem: AVPlayerItem!

// Key-value observing context
private var playerItemContext = 0

let requiredAssetKeys = [
    "playable",
    "hasProtectedContent"
]

func prepareToPlay() {
    // Create the asset to play
    asset = AVAsset(url: url)

    // Create a new AVPlayerItem with the asset and an
    // array of asset keys to be automatically loaded
    playerItem = AVPlayerItem(asset: asset,
                              automaticallyLoadedAssetKeys: requiredAssetKeys)

    // Register as an observer of the player item's status property
    playerItem.addObserver(self,
                           forKeyPath: #keyPath(AVPlayerItem.status),
                           options: [.old, .new],
                           context: &playerItemContext)

    // Associate the player item with the player
    player = AVPlayer(playerItem: playerItem)
}

响应状态变化

override func observeValue(forKeyPath keyPath: String?,
                           of object: Any?,
                           change: [NSKeyValueChangeKey : Any]?,
                           context: UnsafeMutableRawPointer?) {

    // Only handle observations for the playerItemContext
    guard context == &playerItemContext else {
        super.observeValue(forKeyPath: keyPath,
                           of: object,
                           change: change,
                           context: context)
        return
    }

    if keyPath == #keyPath(AVPlayerItem.status) {
        let status: AVPlayerItemStatus
        if let statusNumber = change?[.newKey] as? NSNumber {
            status = AVPlayerItemStatus(rawValue: statusNumber.intValue)!
        } else {
            status = .unknown
        }

        // Switch over status value
        switch status {
        case .readyToPlay:
            // Player item is ready to play.
        case .failed:
            // Player item failed. See error.
        case .unknown:
            // Player item is not yet ready.
        }
    }
}
1个回答

9

如果状态是.failed,那么你可以像这样从AVPlayer本身访问错误。

    switch status {
    case .readyToPlay:
        // Player item is ready to play.
    case .failed:
        handleErrorWithMessage(player.currentItem?.error?.localizedDescription, error:player.currentItem?.error)
    case .unknown:
        // Player item is not yet ready.
    }

请查看下方函数。
func handleErrorWithMessage(_ message: String?, error: Error? = nil) {
    print("Error occured with message: \(message), error: \(error).")
}

希望这可以帮助到您。

谢谢,我会在明天告诉您它的表现,并与您联系。 - Lance Samaria
@LanceSamaria 这是我的目标,你能否请检查并至少点个赞? - PPL
@LanceSamaria 检查过了吗? - PPL
再次感谢您的帮助! - Lance Samaria

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