我正在使用AVFoundation
并创建AVPlayer
,但收到的错误如下所示。
这是两个错误:
2017-01-06 15:51:19.974693 DemoApp [11855:3855225]视频播放器状态 失败:播放器项错误=错误域= AVFoundationErrorDomain Code = -11839“无法解码”UserInfo = {NSUnderlyingError = 0x174253ef0 {Error Domain = NSOSStatusErrorDomain Code = -12913“(null)”}, NSLocalizedFailureReason =此媒体所需的解码器正忙。 NSLocalizedRecoverySuggestion =停止解码媒体的任何其他操作 然后再试一次。,NSLocalizedDescription =无法解码}
2017-01-06 15:51:19.974783 DemoApp [11855:3855225]视频播放器状态 失败:玩家错误=(null)
我可以像这样打印这两个错误:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
///.. other code ..///
case AVPlayerItemStatusFailed: {
print("Video player Status Failed: player item error = \(self.player.currentItem.error)")
print("Video player Status Failed: player error = \(self.player.error)")
}
}
Apple针对此错误的文档:
case decoderTemporarilyUnavailable = -11839
似乎Apple对整个系统可以创建的AVPlayer
的数量有限制;这意味着所有应用都共享这些资源。我想检查这个,以便我可以在我的应用程序中做出适当的回应。
有没有办法检查这些资源何时可用?喜欢何时可以使用解码器?
以下是我正在做的事情的片段。在iPhone 6s上,似乎可以同时创建和播放16 AVPlayer
的限制。在这个应用程序中,每次应用程序启动并开始播放所有应用程序时,以下称为refreshVideoPlayersAndTable
的函数会创建10个AVPlayer
。当应用程序进入后台时,我通过删除和删除所有视频播放器来释放这些共享资源。
注意:如果我使用另一个同时播放许多视频的应用并因此使用iOS的共享资源,则会发生此错误。没有太多应用程序同时使用10个或更多AVPlayer
个,但有几个。当我使用其他应用程序执行此操作然后立即切换到我的应用程序时,我需要将delay
放在下面以避免任何解码错误。
我的主要目标是检查资源何时可用,而不是使用任意delay
来创建视频播放器。
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
registerNotifications()
}
func applicationWillEnterForeground(notification: Notification) {
/// Hack: Without a delay, it seems that iOS does not have the resources
/// available to refresh the AVPlayer's. We get `decode errors` if we
/// instantiate them without a delay.
delay(1) { [weak self] in
self?.refreshVideoPlayersAndTable()
}
}
func applicationDidEnterBackground(notification: Notification) {
/// Release shared resources - delete and remove all AVPlayer's
removeAllVideoPlayers()
}
func registerNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(MyViewController.applicationDidEnterBackground), name: .UIApplicationDidEnterBackground, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(MyViewController.applicationWillEnterForeground), name: .UIApplicationWillEnterForeground, object: nil)
}
}
答案 0 :(得分:0)
您应该同时限制与AVPlayer
关联的AVPlayerItem
个实例。只需将玩家的当前项目替换为nil
,即可在屏幕上看不到的玩家:
player.replaceCurrentItemWithPlayerItem(nil)
看起来没有其他方法可以检查资源是否可用,而不是尝试播放并收到此错误。