尽pipeprepareToPlay()在Swift中AVAudioPlayer产生滞后

播放一个非常短的声音(〜0.5s)会在Swift中编写的SpriteKit iOS游戏中产生一个呃逆(就像一个延迟)。 在其他问题中,我读了我应该prepareToPlay()声音,我做了。

我甚至用一个variables( soundReady )来检查在播放之前是否准备好声音。 每当播放完成时,我也会重新准备声音( audioPlayerDidFinishPlaying() )。 以下是代码的相关部分:

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

我不知道我在这个问题上出了什么问题。 我觉得我已经尝试了一切(包括但不限于:只准备一次,播放后准备,不使用variables,而只是prepareToPlay())。

附加信息:

  • 声音毫不迟疑地播放。
  • 最后一次完成后声音的播放速度似乎不会影响延迟。

我遇到了同样的问题,并在backgroundQueue中播放声音。

这是一个很好的例子: https : //stackoverflow.com/a/25070476/586204 。

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

只需从@brilliantairic添加一个Swift 3版本的解决scheme即可。

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