ios audio swift avaudioplayer lag

ios - AVAudioPlayer produce retraso a pesar de prepareToPlay() en Swift



lag (2)

Reproducir un sonido muy corto (~ 0.5s) produce un problema (como un retraso) en mi juego SpriteKit iOS programado en Swift. En otras preguntas, leí que debería prepareToPlay() el sonido, lo que hice.

Incluso utilicé una variable ( soundReady ) para verificar si el sonido está preparado antes de reproducirlo. También re-preparo el sonido cuando termina de reproducirse ( audioPlayerDidFinishPlaying() ). Aquí están las partes relevantes del código:

class GameScene: SKScene, AVAudioPlayerDelegate { var splashSound = NSURL() var audioPlayer = AVAudioPlayer() var soundReady = false override func didMoveToView(view: SKView) { let path = NSBundle.mainBundle().pathForResource("plopSound", ofType: "m4a") splashSound = NSURL(fileURLWithPath: path) audioPlayer = AVAudioPlayer(contentsOfURL: splashSound, error: nil) audioPlayer.delegate = self soundReady = audioPlayer.prepareToPlay() } func playSound(){ if(soundReady){ audioPlayer.play() soundReady = false } } func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool){ //Prepare to play after Sound finished playing soundReady = audioPlayer.prepareToPlay() } }

No tengo idea de dónde me he equivocado en este caso. Siento que lo he intentado todo (incluyendo, pero no limitado a: solo prepararme una vez, prepararme justo después de jugar, no usar una variable, solo prepararPlayar ()).

Información Adicional:

  • El sonido se reproduce sin demora.
  • La velocidad con la que se reproduce el sonido después del último final no parece afectar el retraso.

Me encontré con este mismo problema y reproduje el sonido en la backgroundQueue.

Este es un buen ejemplo: https://.com/a/25070476/586204 .

let qualityOfServiceClass = QOS_CLASS_BACKGROUND let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) dispatch_async(backgroundQueue, { audioPlayer.play() })


Simplemente agregando una versión Swift 3 de la solución de @brilliantairic.

DispatchQueue.global().async { audioPlayer.play() }