Я использую 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 по этой ошибке:
- Значение перечисления:
case decoderTemporarilyUnavailable = -11839
- Ссылка на эту ошибку: https://developer.apple.com/reference/avfoundation/averror.code/1388106-decodertemporariesunavailable
Кажется, у 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)
}
}