无法播放声音:应用程序崩溃

时间:2015-09-21 13:23:58

标签: ios swift sprite-kit avfoundation

我试图以各种方式播放声音:首先我尝试使用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。)")

1 个答案:

答案 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格式。