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