Ios AVAudioPlayer声音未播放

Ios AVAudioPlayer声音未播放,ios,sprite-kit,swift2,ios9,xcode7,Ios,Sprite Kit,Swift2,Ios9,Xcode7,在iOS 8/Xcode 6中,我有一个包含音效的函数。在多次更改代码后,它在iOS 9中不再工作。这就是我尝试过的: 原件: let bangSoundEffect = SKAction.playSoundFileNamed("Bang.mp3", waitForCompletion: false) runAction(bangSoundEffect) 其他尝试: self.runAction(SKAction.playSoundFileNamed("Bang.mp3", w

在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
如果let url=Bundle.main.url(
forResource:“Bang”,带扩展名:“mp3”){
做{
试试BackgroundMusicLayer=AVAudioPlayer(contentsOf:url)
背景音乐播放器!.play()
}捕获{}
}
归零

2.
AVAudioPlayer
超出范围

play()
完成并返回之前,保留
backgroundMusicLayer
的变量不得超出范围。这通常通过使用类变量来实现:

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

let outOfScopeDelay=0.5
做{
var audioPlayer:AVAudioPlayer!//变量的作用域不正确
试试audioPlayer=AVAudioPlayer(contentsOf:audioRecorder.url)
audioPlayer.play()
线程睡眠(forTimeInterval:outOfScopeDelay)
}捕获{}

► 在上找到此解决方案,并在上找到其他详细信息。

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

使用WAVs 在为游戏制作短音效时,一般的经验法则是使用
WAV
,除非你真的觉得需要修剪脂肪

顶级游戏追求一流的制作质量,因此它们录制和制作未压缩的资产
24位
/
48kHz
。稍有雄心壮志的游戏可能会录制和制作
16
/
44.1
,这是
CD
高质量音频的官方标准

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

尝试以下方法:

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

在iOS 9下,在子线程中播放音频不再安全。

我已经提供了造成问题的全部功能:不在模拟器中测试?它在实际设备上根本不起作用。这很难说。通常在视频游戏中,对于这类声音,您希望避免任何有损压缩格式,因为它们需要时间o解码。你为什么不试着把“砰”的声音变成WAV呢?我从来没有见过一款视频游戏用MP3播放短音。我很确定苹果可以用硬件加速一个音轨的解码,但同时可能会遇到多个音轨的问题(WAV文件不需要解码)。如果这没有帮助,那么问题出在其他地方,可能SK在某些情况下会终止声音。如果代码对其他声音有效,那么我会查看资源本身。删除它并重新添加,确保将项目复制到目标组的文件夹中。有意思的是,您能提供一个指向支持此功能的文档的链接吗?谢谢问题是苹果真的对他们的问题很害羞,所以我们都只是根据经验尝试解决这个问题,没有关于这个问题的文档。我不同意。可以在后台播放。你只需要保持
AVAudioPlayer
引用足够长的时间就可以完成声音。我同意@switarchitect。AVAudioPlayer的播放方法是异步的,但在后台线程中似乎可以正常工作。我不是OP,但我添加了赏金…我从外部web服务获取mp3作为NSData,因此偶尔获取损坏的文件不是不可能的。我没有切换格式的选项。有没有想过这与错误消息“错误:177:0.012s(735 736)后超时;mMajorChangePending=0”?我对这个答案投了赞成票。即使文件格式不是问题,正确的调试方法是用一个例子来尝试这个方法。据我所知,这个具体的错误没有记录在任何地方,但它似乎与使用任何API播放声音的行为有关。我认为必须探索不同的方法,这是一个错误视频游戏编程中的一个明显的错误(声音引擎有有限的频道,而且苹果公司有一个很好的限制:音频解码一次只限于一个音轨)。这只会捕获错误,而不会识别原因,对吗?我正在寻找错误的解释“错误:177:0.012s后超时(735 736);mMajorChangePending=0“以及如何防止它,而不仅仅是捕获它。谢谢!您是否已验证没有错误地对AVAudioPlayer进行范围限定?请参阅