AVAudioPlayer 声音不播放

AVAudioPlayer sound not playing

在 iOS 8/Xcode 6 我有一个包含声音效果的功能。多次更改代码后,它不再适用于 iOS 9。这是我试过的:

原文:

let bangSoundEffect = SKAction.playSoundFileNamed("Bang.mp3", waitForCompletion: false)
        runAction(bangSoundEffect)

其他尝试:

self.runAction(SKAction.playSoundFileNamed("Bang.mp3", waitForCompletion: false))

另外:

func playRocketExplosionSound(filename: String) {
            let url = NSBundle.mainBundle().URLForResource(
                filename, withExtension: nil)
            if (url == nil) {
                print("Could not find file: \(filename)")
                return }
            var error: NSError? = nil
            do {
                backgroundMusicPlayer =
                    try AVAudioPlayer(contentsOfURL: url!)
            } catch let error1 as NSError {
                error = error1
                backgroundMusicPlayer = nil
            }
            if backgroundMusicPlayer == nil {
                print("Could not create audio player: \(error!)")
                return}
            backgroundMusicPlayer.numberOfLoops = 1
            backgroundMusicPlayer.prepareToPlay()
            backgroundMusicPlayer.play() }



playRocketExplosionSound("Bang.mp3")

我正在拔头发。我在不同的场景中使用相同的代码来获得另一种音效并且效果很好!!出了什么问题? 我注意到声音效果有时会在模拟器中开始播放,但它没有完成并抛出此错误:

2015-09-24 19:12:14.554 APPNAME[4982:270835] 19:12:14.553 ERROR:    177: timed out after 0.012s (735 736); mMajorChangePending=0

它在实际设备上根本不起作用。

问题是什么? :'(

损坏的数据文件 | AVAudioPlayer 超出范围


1.损坏的数据文件

这将确保您已找到文件:

    var backgroundMusicPlayer: AVAudioPlayer? = nil

    if let url = Bundle.main.url(
        forResource: "Bang", withExtension: "mp3") {
        do {
            try backgroundMusicPlayer = AVAudioPlayer(contentsOf: url)
            backgroundMusicPlayer!.play()
        } catch {}
    }
    return nil

2。 AVAudioPlayer 超出范围

play() 和 returns 完成之前,保留 backgroundMusicPlayer 的变量不得超出范围。这通常通过使用 class 变量来实现:

var backgroundMusicPlayer: AVAudioPlayer? = nil

不要这样做: 由于 var audioPlayer 的本地范围,以下声音最多只能播放 outOfScopeDelay

let outOfScopeDelay = 0.5
do {
    var audioPlayer:AVAudioPlayer! // Incorrectly scoped variable
    try audioPlayer = AVAudioPlayer(contentsOf: audioRecorder.url)
    audioPlayer.play()
    Thread.sleep(forTimeInterval: outOfScopeDelay)
} catch {}

► 在 GitHub and additional details on Swift Recipes 上找到此解决方案。

MP3 文件可能有问题

问题很可能与您正在使用的 MP3 文件有关。该代码适用于其他声音,这表明 MP3 文件可能已损坏并且 AVAudioPlayer 解码失败。您可以尝试重新编码此文件,看看问题是否仍然存在。或者,更好的是,将其转换为 WAV.

使用 WAV

为游戏创建短音效时的一般经验法则是使用 WAV 除非你真的觉得你需要 trim 脂肪。

一流的游戏追求一流的制作质量,因此他们录制和制作未压缩的资产 24bit/48kHz。稍逊一筹的作品可能会以 16/44.1 格式录制和制作,这是 CD 质量音频的官方标准。

这至少有两个好处。一是音质更好。第二个,CPU 无需解码文件即可播放。

试试这个:

dispatch_async(dispatch_get_main_queue(), {
                        (self.playRocketExplosionSound("Bang.mp3")
                        })

在 iOS 9.

下的子线程中播放音频不再安全