检查 AVFoundation 中资源的可用性

9

我正在使用AVFoundation并创建AVPlayer,但是遇到了以下错误。

这是两个错误:

2017-01-06 15:51:19.974693 DemoApp[11855:3855225] 视频播放器状态失败:player item error = Error Domain=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] 视频播放器状态失败:player error = (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)")
    } 
}

这个错误的苹果文档:

看起来,苹果对整个系统可以创建多少个AVPlayer有限制,这意味着所有应用程序共享这些资源。我想检查这个限制,以便在我的应用程序中做出适当的回应。

是否有一种方法可以检查何时可用这些资源?比如解码器何时可用?

更新1

以下是我正在做的代码片段。在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)
    }
}

你能否提供更多关于你想要实现什么的信息吗?你正在创建多个AVPlayer吗?这个问题是在什么情况下出现的? - manishg
我需要看一下你写的使用AVPlayer的代码。 - Oren Edrich
@manishg 我更新了我的问题,请查看 更新1 - JEL
@OrenEdrich,我更新了我的问题,请查看 Update 1 - JEL
感谢您更新这个内容 - 您帮助我解决了自己的问题! - brendan
1个回答

0

你应该限制同时关联 AVPlayerItemAVPlayer 实例数量。对于不在屏幕上可见的播放器,只需将其当前项目替换为 nil

player.replaceCurrentItemWithPlayerItem(nil)

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


谢谢您的回复!有没有任何文件说明我们不能检查资源?我正在尝试了解您是如何确定这一点的 - 谢谢 - JEL
我更新了我的问题,请查看更新1 - 如果这是正确的方法,请告诉我。 - JEL

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