Swift iOS - 如何从 AVPlayerItemStatus 访问错误?
Swift iOS -How to Access Error from AVPlayerItemStatus?
我正在使用 AVPlayer 播放视频 url。我按照Apple's code播放视频和处理错误:
在 Respond to A State Change 部分中,有一个 switch 语句有一个 .failed
case,注释掉的代码说:// 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.
}
}
}
如果状态是 .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).")
}
希望对您有所帮助。
我正在使用 AVPlayer 播放视频 url。我按照Apple's code播放视频和处理错误:
在 Respond to A State Change 部分中,有一个 switch 语句有一个 .failed
case,注释掉的代码说:// 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.
}
}
}
如果状态是 .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).")
}
希望对您有所帮助。