【发布时间】:2017-02-11 18:09:10
【问题描述】:
我在游戏中播放声音时遇到了一个令人烦恼的问题,但似乎无法通过 AVAudioPlayer 获得任何输出。最初这是作为一个类设置的,但是当它不起作用时,我尝试对声音输出进行硬编码,以检查那里是否存在问题。它仍然不起作用,我尝试了几个不同的文件来排除有问题的音频文件或格式。正在检索 URL,但 audioPlayer 似乎只是没有输出声音。
我已经阅读了一些关于类似问题的帖子,并修改了系统声音设置,但这并没有什么不同。有人建议模拟器在某些情况下无法输出声音,但我不认为这是这种情况。
let myFile = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("gong", ofType: "wav")!)
print ("URL data: \(myFile)")
do{
let audioPlayer = try AVAudioPlayer(contentsOfURL:myFile)
audioPlayer.prepareToPlay()
audioPlayer.play()
}catch {
print("Error playing sound")
}
不过这玩得很好:
self.runAction(SKAction.playSoundFileNamed("gong", waitForCompletion: false))
我需要 AVAudioPlayer 的功能,因为我希望能够在循环播放时开始停止并控制声音的音量。我正在使用 XCode 7.3.1 和 Swift 2.2。
有什么想法吗?
非常感谢, 千瓦
【问题讨论】:
-
你导入了 AVFoundation 对吗?
-
是的。我想我解决了。我需要在一个持久的范围内的 AVAudioPlayer 上创建一个实例,因此它不会被自动垃圾收集删除。另外,我认为prepareToPlay命令在执行播放命令之前没有时间将文件加载到内存中,并且播放器也超出范围并且在退出调用它的代码块时几乎立即被收集。结果:没有机会播放。我将创建一个类,在 init() 阶段使用 prepareToPlay 将所有声音预加载到内存中,以便可以调用它们立即播放。谢谢
-
这就是我要说的,我从未使用过
prepareToPlay方法,而且我被告知通常没有必要。 -
这是必要的——当它加载到内存中时你会得到相当长的延迟(0.5 - 1 秒),这会停止所有其他进程。它在游戏中非常不和谐。
-
发生这种情况的原因是因为
AVAudioPlayer的play()方法实际上是异步的——所以你应该异步调用它。很多人没有意识到这一点。请查看我发布的解释性答案。
标签: swift sprite-kit swift2