Swift iOS — как получить доступ к ошибке из AVPlayerItemStatus?

Я использую AVPlayer для воспроизведения URL-адреса видео. Я следовал коду Apple для воспроизведения видео и обработки ошибок:

Внутри раздела с надписью Ответить на изменение состояния есть оператор switch, который имеет регистр .failed, а закомментированный код говорит: // Player item failed. See error. Я запускал это пару раз, ставя точку останова. там.

введите описание изображения здесь

Проблема в том, что я не вижу ничего похожего на переменную с типом 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.
        }
    }
}

person Lance Samaria    schedule 13.03.2018    source источник


Ответы (1)


если статус .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).")
}

Надеюсь это поможет.

person PPL    schedule 13.03.2018
comment
Спасибо, я дам вам знать, как это работает завтра и свяжусь с вами - person Lance Samaria; 13.03.2018
comment
@LanceSamaria Это моя цель, не могли бы вы проверить и хотя бы проголосовать? - person PPL; 13.03.2018
comment
@LanceSamaria проверено? - person PPL; 13.03.2018
comment
Спасибо еще раз за помощь! - person Lance Samaria; 13.03.2018