Compruebe cuándo hay resources disponibles de AVFoundation

Estoy usando AVFoundation y creando AVPlayer , pero AVPlayer algunos errores como se muestra a continuación.

Estos son los 2 errores:

2017-01-06 15: 51: 19.974693 DemoApp [11855: 3855225] Error en el estado del reproductor de video: error del elemento del reproductor = Error en el dominio = AVFoundationErrorDomain Code = -11839 "No se puede descifrar" UserInfo = {NSUnderlyingError = 0x174253ef0 {Error Domain = NSOSStatusErrorDomain Code = -12913 "(null)"}, NSLocalizedFailureReason = El decodificador requerido para este medio está ocupado., NSLocalizedRecoverySuggestion = Detener cualquier otra acción que decodifique los medios y vuelva a intentarlo., NSLocalizedDescription = No puede descifrar}

2017-01-06 15: 51: 19.974783 DemoApp [11855: 3855225] Falló el estado del reproductor de video: error del reproductor = (nulo)

Puedo imprimir estos 2 errores así:

 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)") } } 

La documentation de Apple para este error:

  • Valor de enumeración: case decoderTemporarilyUnavailable = -11839
  • Enlace a este error: https://developer.apple.com/reference/avfoundation/averror.code/1388106-decodertemporarilyunavailable

Parece que Apple tiene un límite de cuántos AVPlayer puede crear todo el sistema; lo que significa que todas las aplicaciones comparten estos resources. Quiero verificar esto para que pueda responder adecuadamente en mi aplicación.

¿Hay alguna forma de verificar cuándo están disponibles estos resources? ¿Como cuándo está disponible el decodificador?

Actualización 1

A continuación se muestra un fragment de lo que estoy haciendo. En un iPhone 6s, parece haber un límite de 16 AVPlayer que se pueden crear y reproducir simultáneamente. En esta aplicación, la function a continuación llamada refreshVideoPlayersAndTable crea 10 AVPlayer cada vez que la aplicación se inicia y comienza a reproducirlos todos. Cuando la aplicación pasa a segundo plano, libero estos resources compartidos eliminando y eliminando todos los reproductores de video.

Nota: este error se produce principalmente si uso otra aplicación que reproduce varios videos simultáneamente y, por lo tanto, está utilizando los resources compartidos de iOS. No hay demasiadas aplicaciones que utilicen 10 o más AVPlayer a la vez, pero hay un par. Cuando uso otra aplicación que lo hace y luego cambie a mi aplicación de inmediato, entonces necesito poner la delay como abajo para evitar cualquier error de deencoding.

Mi objective principal es verificar cuándo están disponibles los resources en lugar de utilizar un delay arbitrario para crear los reproductores de video.

 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 shanetworking 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) } } 

Debe limitar AVPlayer instancias de AVPlayer asociadas con AVPlayerItem s simultáneamente. Simplemente reemplaza el elemento actual del jugador por nil para los jugadores que no estén visibles en la pantalla:

 player.replaceCurrentItemWithPlayerItem(nil) 

Parece que no hay otra forma de comprobar si hay resources disponibles que no sean para intentar jugar y get este error.