Проверьте, когда ресурсы доступны от AVFoundation

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

Это 2 ошибки:

2017-01-06 15:51:19.974693 DemoApp[11855:3855225] Ошибка статуса видеоплеера: ошибка элемента проигрывателя = 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] Статус видеоплеера Ошибка: ошибка плеера = (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)
    }
}

person JEL    schedule 06.01.2017    source источник
comment
Можете ли вы добавить больше информации о том, чего вы пытаетесь достичь? Вы создаете несколько avplayer? Когда это не удается?   -  person manishg    schedule 08.02.2017
comment
Мне нужно увидеть код, который вы написали, чтобы использовать avplayer.   -  person Oren Edrich    schedule 14.02.2017
comment
@manishg Я обновил свой вопрос, см. Обновление 1   -  person JEL    schedule 14.02.2017
comment
@OrenEdrich Я обновил свой вопрос, см. Обновление 1   -  person JEL    schedule 14.02.2017
comment
Спасибо за обновление - вы помогли мне решить мою собственную проблему!   -  person brendan    schedule 14.08.2017


Ответы (1)


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

player.replaceCurrentItemWithPlayerItem(nil)

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

person k06a    schedule 14.02.2017
comment
Спасибо за ответ! Есть ли какая-либо документация, в которой говорится, что мы не можем проверить наличие ресурсов? Я пытаюсь узнать, как вы это определили - спасибо - person JEL; 14.02.2017
comment
Я обновил свой вопрос, см. Обновление 1 — дайте мне знать, правильный ли это подход - person JEL; 14.02.2017