我试图以各种方式播放声音:首先我尝试使用SpriteKit的动作:
sprite.runAction(SKAction.playSoundFileNamed("explosion.mp3", waitForCompletion: false))
我还尝试将这段代码分成两部分:在init方法中,我初始化动作,稍后再执行。但即使我刚刚初始化SKAction,应用程序崩溃了:
self.soundAction = SKAction.playSoundFileNamed("explosion.mp3", waitForCompletion: true)
我也试过过AVFoundation。这段代码在init方法中:
let explosionURL = NSBundle.mainBundle().URLForResource("explosion", withExtension: "mp3")
var error:NSError?
let data = NSData(contentsOfURL: explosionURL!)
explosionSoundPlayer = AVAudioPlayer(data: data, fileTypeHint: AVFileTypeMPEGLayer3, error: &error)
if explosionSoundPlayer != nil {
explosionSoundPlayer?.prepareToPlay()
} else {
println(error?.localizedDescription)
}
我不得不使用NSData对象,因为它失败了一个URL。这种方式也失败了,但至少它给了我一个更有意义的错误描述:
可选("操作无法完成。(OSStatus错误-39。)")
答案 0 :(得分:1)
我刚刚测试了AVAudioPlayer,它在两个方面都适用于我(使用NSData或NSUrl)。检查以下代码:
class GameScene: SKScene {
var audioPlayer : AVAudioPlayer?
var soundAction = SKAction.playSoundFileNamed("sound.wav", waitForCompletion: true)
override func didMoveToView(view:SKView) {
let explosionURL = NSBundle.mainBundle().URLForResource("music", withExtension: "mp3")
var error:NSError?
let data = NSData(contentsOfURL: explosionURL!)
audioPlayer = AVAudioPlayer(data: data, fileTypeHint: AVFileTypeMPEGLayer3, error: &error)
if audioPlayer != nil {
audioPlayer?.prepareToPlay()
} else {
println(error?.localizedDescription)
}
/*
var soundUrl = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("music", ofType: "mp3")!)
println(soundUrl)
var error:NSError?
audioPlayer = AVAudioPlayer(contentsOfURL: soundUrl, error: &error)
audioPlayer?.prepareToPlay()
*/
}
}
你可以播放这样的声音(例如在touchesBegan方法中):
//audioPlayer?.play()
self.runAction(self.soundAction)
尝试复制&粘贴此代码(只需更改声音名称和扩展名),看看是否仍然出现错误。 NSData部分与您的示例相同。
我猜你已经知道了,但是提到你应该如何在你的项目中添加声音文件并不会受到伤害:
如果仍然无法工作,我会在" Build Phases" - > "复制捆绑资源"看看" explosion.mp3"存在。如果不是,请使用+按钮(添加项目将在悬停时显示)并添加。
<强>提示:强>
请注意,建议不要将mp3文件用于短音,因为mp3是压缩的,需要硬件解码。解码需要cpu时间。此外,只能使用硬件解码器播放一个mp3文件。如果你一次播放多个mp3,那些将用软件解码,这很慢。来自文档:
使用硬件辅助解码时,设备只能播放 一次支持的格式之一的单个实例。对于 例如,如果您正在使用硬件播放立体声MP3声音 编解码器,第二个同步MP3声音将使用软件解码。 同样,您无法同时播放AAC和ALAC声音 使用硬件。如果iPod应用程序正在播放AAC或MP3声音 在后台,它声称硬件编解码器;你的申请 然后使用软件解码播放AAC,ALAC和MP3音频。
播放短音的更好选择是.wav和.caf格式。