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.
下的子线程中播放音频不再安全
在 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.
下的子线程中播放音频不再安全