Swift 3 - 在闪屏上播放声音时出错
Swift 3 - Error while playing sound on splashscreen
我在 Xcode 8,Swift 3.
我正在尝试编写代码以在应用程序启动后立即播放声音。我将它放入函数中(在 AppDelegate 中):
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {}
所以这是我的代码:
var opening_sound = AVAudioPlayer()
及之后:
let Nt = URL(fileURLWithPath: Bundle.main.path(forResource: "opp", ofType: "mp3")!)
do {
opening_sound = try AVAudioPlayer(contentsOf: Nt)
opening_sound.prepareToPlay()
} catch {print("Error")}
opening_sound.play()
我当然导入AVFundation了。
当 运行ning 我进入控制台 "Error" 然后在行 opening_sound.play()
我得到“线程 1: EXC_BAD_ACCESS (code=1, address= 0x48 ).
我尝试 运行激活僵尸对象但没有答案。
编辑:
感谢您的回答。回复@silicon_valley :
我得到的错误是操作无法完成。 (操作系统状态错误 1685348671。)
我刚刚也有 : objc[31817]: Class _NSZombie___NSArrayM 都实现了 ?? (0x618000047c80) 和 ?? (0x618000047cb0)。将使用两者之一。哪一个是未定义的。允许僵尸。
我试过你说的@Pierce 但它不起作用,因为 AVAudioplayer 不能是可选值。如果我写 ... = AVAudioplayer?
,我可以在 AVAudioplayer?()
和 "Cannot invoke initialiser for type 'AVAudioPlayer?' with no argument" 之间进行选择。或者如果我写 AVAudioPlayer?.self
之后的代码 运行 不正确。
所以,假设我可以将 opening_sound 作为可选值启动:
if let Nt = Nt {
self.opening_sound = try? AVAudioPlayer(contentsOf: Nt)
}
不起作用,代码也是如此。
我认为问题出在处理主线程上,但我看不到。当然 "opp.mp3" 在主包中。
编辑:感谢@Pierce 的回答(抱歉,我没有正确阅读)我得到了这个:
var opening_sound: AVAudioPlayer?
...
let Nt: URL? = URL(fileURLWithPath: (Bundle.main.path(forResource: "opp", ofType: "mp3"))!)
if let Nt = Nt {
self.opening_sound = try? AVAudioPlayer(contentsOf: Nt)
}
playOpeningSound()
...
func playOpeningSound() {
if let opening_sound = opening_sound {
if opening_sound.isPlaying {
opening_sound.pause()
}
opening_sound.currentTime = 0
DispatchQueue.global().async {
opening_sound.play()
}
}
而且我没有错误。但是没有声音出来...!
感谢您的帮助 !
我发现播放歌曲的最佳方式是异步播放。 prepareToPlay
对我来说似乎从来没有正常工作过,它也没有解决第一次播放 UI 时导致暂停的问题。尝试与此类似的操作:
实例化AVAudioPlayer,使opening_sound
可选
var opening_sound: AVAudioPlayer?
let Nt:URL? = URL(fileURLWithPath: Bundle.main.path(forResource: "opp", ofType: "mp3")!)
if let Nt = Nt {
do {
self.opening_sound = try AVAudioPlayer(contentsOf: Nt)
} catch {
print(error)
}
}
playOpeningSound()
播放声音方法:
func playOpeningSound() {
if let opening_sound = opening_sound {
if opening_sound.isPlaying {
opening_sound.pause()
}
opening_sound.currentTime = 0
DispatchQueue.global().async {
opening_sound.play()
print("Sound should be playing")
}
}
}
我在 Xcode 8,Swift 3.
我正在尝试编写代码以在应用程序启动后立即播放声音。我将它放入函数中(在 AppDelegate 中):
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {}
所以这是我的代码:
var opening_sound = AVAudioPlayer()
及之后:
let Nt = URL(fileURLWithPath: Bundle.main.path(forResource: "opp", ofType: "mp3")!)
do {
opening_sound = try AVAudioPlayer(contentsOf: Nt)
opening_sound.prepareToPlay()
} catch {print("Error")}
opening_sound.play()
我当然导入AVFundation了。
当 运行ning 我进入控制台 "Error" 然后在行 opening_sound.play()
我得到“线程 1: EXC_BAD_ACCESS (code=1, address= 0x48 ).
我尝试 运行激活僵尸对象但没有答案。
编辑: 感谢您的回答。回复@silicon_valley :
我得到的错误是操作无法完成。 (操作系统状态错误 1685348671。)
我刚刚也有 : objc[31817]: Class _NSZombie___NSArrayM 都实现了 ?? (0x618000047c80) 和 ?? (0x618000047cb0)。将使用两者之一。哪一个是未定义的。允许僵尸。
我试过你说的@Pierce 但它不起作用,因为 AVAudioplayer 不能是可选值。如果我写 ... = AVAudioplayer?
,我可以在 AVAudioplayer?()
和 "Cannot invoke initialiser for type 'AVAudioPlayer?' with no argument" 之间进行选择。或者如果我写 AVAudioPlayer?.self
之后的代码 运行 不正确。
所以,假设我可以将 opening_sound 作为可选值启动:
if let Nt = Nt {
self.opening_sound = try? AVAudioPlayer(contentsOf: Nt)
}
不起作用,代码也是如此。
我认为问题出在处理主线程上,但我看不到。当然 "opp.mp3" 在主包中。
编辑:感谢@Pierce 的回答(抱歉,我没有正确阅读)我得到了这个:
var opening_sound: AVAudioPlayer?
...
let Nt: URL? = URL(fileURLWithPath: (Bundle.main.path(forResource: "opp", ofType: "mp3"))!)
if let Nt = Nt {
self.opening_sound = try? AVAudioPlayer(contentsOf: Nt)
}
playOpeningSound()
...
func playOpeningSound() {
if let opening_sound = opening_sound {
if opening_sound.isPlaying {
opening_sound.pause()
}
opening_sound.currentTime = 0
DispatchQueue.global().async {
opening_sound.play()
}
}
而且我没有错误。但是没有声音出来...! 感谢您的帮助 !
我发现播放歌曲的最佳方式是异步播放。 prepareToPlay
对我来说似乎从来没有正常工作过,它也没有解决第一次播放 UI 时导致暂停的问题。尝试与此类似的操作:
实例化AVAudioPlayer,使opening_sound
可选
var opening_sound: AVAudioPlayer?
let Nt:URL? = URL(fileURLWithPath: Bundle.main.path(forResource: "opp", ofType: "mp3")!)
if let Nt = Nt {
do {
self.opening_sound = try AVAudioPlayer(contentsOf: Nt)
} catch {
print(error)
}
}
playOpeningSound()
播放声音方法:
func playOpeningSound() {
if let opening_sound = opening_sound {
if opening_sound.isPlaying {
opening_sound.pause()
}
opening_sound.currentTime = 0
DispatchQueue.global().async {
opening_sound.play()
print("Sound should be playing")
}
}
}