ios swift avplayer avplayeritem

ios - AVPlayer demasiado tiempo y con retraso para estar listo para reproducir y reproducir música del servidor de forma rápida



swift avplayeritem (2)

Intenta usar esto:

player.automaticallyWaitsToMinimizeStalling = false

Intenté almacenar en búfer e inmediatamente reproducir audio de remote url con un lenguaje rápido.

pero el problema es con mucho tiempo para readyToPlay case and play.

por ejemplo, una url de sonido tarda entre 12 y 15 segundos en ejecutarse.

este es mi codigo

var asset: AVAsset! var player: AVPlayer! var playerItem: AVPlayerItem! private var playerItemContext = 0 let requiredAssetKeys = [ "playable","hasProtectedContent"]

let url = URL(string: "http://sound_link.mp3")! asset = AVAsset(url: url) playerItem = AVPlayerItem(asset: asset, automaticallyLoadedAssetKeys: requiredAssetKeys) playerItem.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: [.old, .new], context: &playerItemContext) player = AVPlayer(playerItem: playerItem)

que de acuerdo a esta documentación (ExploringAVFoundation) he hecho eso

y para manejar ese jugador está listo para el jugador para jugar.

override func observeValue(forKeyPath keyPath: String?,of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { guard context == &playerItemContext else { super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) return } if keyPath == #keyPath(AVPlayerItem.status) { let status: AVPlayerItemStatus if let statusNumber = change?[.newKey] as? NSNumber { status = AVPlayerItemStatus(rawValue: statusNumber.intValue)! } else { status = .unknown } // Switch over status value switch status { case .readyToPlay: print("readyToPlay /(status.rawValue)") player.play() // here play remote sound case .failed: print("readyToPlay /(status.rawValue)") case .unknown: print("failed /(status.rawValue)") } } }

y esto se devuelve log:

2017-02-08 13:44:00.626036 [15144:3747850] [aqme] 255: AQDefaultDevice (1): skipping input stream 0 0 0x0 readyToPlay 1 2017-02-08 13:44:02.631182 [15144:3747850] [aqme] 255: AQDefaultDevice (173): skipping input stream 0 0 0x0

en el registro anterior, tome 4 segundos para que aparezca readyToPlay 1 luego tome 10 segundos para reproducir el sonido

la velocidad severa es buena y traté de reproducir el sonido del servidor en Android y el tiempo máximo para almacenar y reproducir el sonido es de aproximadamente 3 segundos (en la aplicación de Android ), pero en el almacenamiento en búfer de IOS y reproducir el sonido totalmente, ¡tome aproximadamente 15 segundos!

Gracias por tu atención


intente crear una instancia de su avPlayerItem con la URL y luego recuperar otros activos en el hilo global, creo que los problemas ocurren porque avPlayer está intentando recuperar los activos en el hilo principal de la interfaz de usuario. Tenía el mismo problema cuando intentaba leer las opciones de subtítulos de avAssets -6 segundos más para cargar la película en mi reproductor.

Así es como resolví mi problema (en Swift 2), espero que ayude:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { let avMediaSelectionGroup : AVMediaSelectionGroup? = self.container.player.currentItem?.asset.mediaSelectionGroupForMediaCharacteristic(AVMediaCharacteristicLegible) dispatch_async(dispatch_get_main_queue(), { if (avMediaSelectionGroup != nil && (avMediaSelectionGroup!.options.count != 0) && avMediaSelectionGroup?.options[0].valueForKey("title") != nil) { // show hide subtitle button } }) })