检查AVFoundation何时可以获得资源

JEL*_*JEL 10 avfoundation ios avplayer swift avplayeritem

我正在使用AVFoundation和创建AVPlayer但是会出现一些错误,如下所示.

这些是2个错误:

2017-01-06 15:51:19.974693 DemoApp [11855:3855225]视频播放器状态失败:播放器项错误=错误域= AVFoundationErrorDomain代码= -11839"无法解码"UserInfo = {NSUnderlyingError = 0x174253ef0 {错误域= NSOSStatusErrorDomain代码= -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)")
    } 
}
Run Code Online (Sandbox Code Playgroud)

Apple针对此错误的文档:

似乎苹果AVPlayer对整个系统可以创造的数量有限制; 这意味着所有应用都共享这些资源.我想检查这个,以便我可以在我的应用程序中做出适当的回应.

有没有办法检查这些资源何时可用?就像解码器何时可用?

更新1

下面是我正在做的事情的片段.在iPhone 6s上,似乎AVPlayer可以同时创建和播放16的限制.在这个应用程序中,每次应用程序启动并开始播放所有这些时,下面调用的函数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)
    }
}
Run Code Online (Sandbox Code Playgroud)

k06*_*06a 0

您应该同时限制AVPlayer与 s 关联的实例AVPlayerItem。只需将玩家当前的项目替换nil为屏幕上不可见的玩家:

player.replaceCurrentItemWithPlayerItem(nil)
Run Code Online (Sandbox Code Playgroud)

看起来除了尝试播放并收到此错误之外,没有其他方法可以检查资源是否可用。