gpt4 book ai didi

ios - Swift:AVAudioPlayer 不播放,线程可能出现错误?

转载 作者:行者123 更新时间:2023-11-29 05:46:52 27 4
gpt4 key购买 nike

我目前正在开发一个根据图像/对象的状态播放音频剪辑的应用程序。

目前我收到此错误代码。

线程 1:EXC_BAD_ACCESS(代码=1,地址=0x48)

我猜测当同一线程上已经播放了另一个音频剪辑时尝试在同一线程上播放另一个音频剪辑可能会出错。

但说实话,我不确定,我仍在学习线程和多线程,所以我可能会到达这里。

我在这里缺少什么?如何播放第二个音频剪辑 (turnSaberOffAudio) 而不会收到此错误消息?谢谢!

这就是我点击按钮时发生的情况。

@objc func lightsaberTapped() {
print("lightsaber open!")

if lightsaberModel.isSaberOn == false {
UIView.animate(withDuration: 0.2, animations: {
self.saberImageHeightConstraint.constant = 530
self.saberImageWidthConstraint.constant = 210
self.mainView.layoutIfNeeded()
self.viewDidLayoutSubviews()
}, completion: nil)
lightsaberModel.turnSaberOnAudio.play()
lightsaberModel.isSaberOn = true
} else {
UIView.animate(withDuration: 0.2, animations: {
self.saberImageHeightConstraint.constant = 1
self.saberImageWidthConstraint.constant = 1
self.mainView.layoutIfNeeded()
self.viewDidLayoutSubviews()
}, completion: nil)
lightsaberModel.turnSaberOffAudio.play()
lightsaberModel.isSaberOn = false
}
}

这是包含必要信息的模型。

class Model {

var turnSaberOnAudio: AVAudioPlayer = AVAudioPlayer()
var turnSaberOffAudio: AVAudioPlayer = AVAudioPlayer()
var whichLightsaber = String()
var isSaberOn = Bool()

func turnSaberOn() {
let turnSaberOnPath = Bundle.main.path(forResource: "SaberOn", ofType: "wav")
do {
turnSaberOnAudio = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: turnSaberOnPath!))
}
catch {
print(error)
}
}

func turnSaberOff() {
let turnSaberOffPath = Bundle.main.path(forResource: "SaberOff", ofType: "mp3")
do {
turnSaberOffAudio = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: turnSaberOffPath!))
}
catch {
print(error)
}
}
}

最佳答案

这是你永远不应该做的事情:

var turnSaberOnAudio: AVAudioPlayer = AVAudioPlayer()

空的初始值设定项 AVAudioPlayer()创建一些无用的东西,这不仅无用,而且还会导致崩溃。

并将 var 声明为非可选,您无法区分它是否包含有用的内容。


使用您当前的代码,turnSaberOn()turnSaberOff()调用 play() 时可能不会被调用.

尝试更改您的 Model如:

class Model {

var turnSaberOnAudio: AVAudioPlayer? //<- Never use `AVAudioPlayer()`
var turnSaberOffAudio: AVAudioPlayer? //<- Never use `AVAudioPlayer()`
var whichLightsaber: String = ""
var isSaberOn: Bool = false

init() {
let turnSaberOnUrl = Bundle.main.url(forResource: "SaberOn", withExtension: "wav")!
do {
turnSaberOnAudio = try AVAudioPlayer(contentsOf: turnSaberOnUrl)
turnSaberOnAudio!.prepareToPlay()
print("\(turnSaberOnUrl) loaded")
} catch {
print(error)
}
let turnSaberOffUrl = Bundle.main.url(forResource: "SaberOff", withExtension: "mp3")!
do {
turnSaberOffAudio = try AVAudioPlayer(contentsOf: turnSaberOffUrl)
turnSaberOffAudio!.prepareToPlay()
print("\(turnSaberOffUrl) loaded")
} catch {
print(error)
}

//...
}

//...
}

并像这样使用它:

    @IBAction func lightSaberTapped(_ sender: Any) {
print("lightsaber open!")

if !lightsaberModel.isSaberOn {
//...
lightsaberModel.turnSaberOnAudio?.play()
lightsaberModel.isSaberOn = true
} else {
//...
lightsaberModel.turnSaberOffAudio?.play()
lightsaberModel.isSaberOn = false
}
}

关于ios - Swift:AVAudioPlayer 不播放,线程可能出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56064541/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com