Подтвердить что ты не робот

Проверьте, доступны ли ресурсы от AVFoundation

Я использую AVFoundation и создаю AVPlayer, но получаю некоторые ошибки, как показано ниже.

Это две ошибки:

2017-01-06 15: 51:19.974693 DemoApp [11855: 3855225] Статус видеопроигрывателя Ошибка: ошибка элемента игрока = Ошибка домена = AVFoundationErrorDomain Код = -11839 "Невозможно декодировать" UserInfo = {NSUnderlyingError = 0x174253ef0 {Ошибка домена = NSOSStatusErrorDomain Code = -12913 "(null)" }, NSLocalizedFailureReason = Требуется декодер, необходимый для этого носителя. NSLocalizedRecoverySuggestion = Остановить любые другие действия, которые декодируют носитель и повторите попытку., NSLocalizedDescription = Невозможно декодировать}

2017-01-06 15: 51:19.974783 DemoApp [11855: 3855225] Статус видеопроигрывателя Ошибка: ошибка игрока = (null)

Я могу напечатать эти 2 ошибки следующим образом:

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 на эту ошибку:

Кажется, у Apple есть предел для того, сколько 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)
    }
}
4b9b3361

Ответ 1

Вы должны ограничить экземпляры AVPlayer, связанные с AVPlayerItem одновременно. Просто замените текущий элемент игрока на nil для игроков, которые не видны на экране:

player.replaceCurrentItemWithPlayerItem(nil)

Похоже, нет другого способа проверить, доступны ли ресурсы, кроме как попытаться воспроизвести и получить эту ошибку.