ios - 尽管在 Swift 中使用 prepareToPlay(),AVAudioPlayer 仍会产生滞后

标签 ios audio swift avaudioplayer lag

在我用 Swift 编写的 SpriteKit iOS 游戏中播放非常短的声音(~0.5 秒)会产生打嗝(类似滞后)。在其他问题中,我读到我应该 prepareToPlay() 声音,我做到了。

我什至使用了一个变量 (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()
   }
}

我不知道我哪里做错了。我觉得我什么都试过了(包括但不限于:只准备一次,玩完就准备,不使用变量,只是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()
})

关于ios - 尽管在 Swift 中使用 prepareToPlay(),AVAudioPlayer 仍会产生滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25503629/

相关文章:

ios - 通过点击单元格内的图像从 UITableViewCell 切换

android - iOS 是否有相当于 Android 音轨的版本?

ios - 在 cocos2d v3 中播放音频

c++ - 哪个库用于视频和音频录制?

swift - 我如何扩展其值就是字典本身的字典?

ios - 如何加速 Xcode 中的 UI 测试用例?

ios - 如何从 iOS 应用程序中的任何位置更改 Root View

ios - 单击按钮并更改其图像时的 UITableView Swift 4

ios - 如何通过xml解析访问图像?

ios - 在 TableView Controller 中的 TableView 上添加模糊 View