Pregunta AVAudioPlayer produce retraso a pesar de prepareToPlay () en Swift


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

Incluso utilicé una variable (soundReady) para verificar si el sonido está preparado antes de reproducirlo. También vuelvo a preparar el sonido cuando termina de tocar (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 (incluso, pero no limitado a: solo prepararme una vez, prepararme justo después de jugar, no usar una variable, sino solo prepararToPlay ()).

Información Adicional:

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

18
2017-08-26 10:32


origen


Respuestas:


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

Es un buen ejemplo: https://stackoverflow.com/a/25070476/586204.

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

14
2018-05-06 06:47



Solo agregue una versión de Swift 3 de la solución de @brilliantairic.

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

4
2017-10-03 12:31