我有一个AVAudioPlayer
属性的类。我在一个方法中设置声音文件的URL(比如Func A)并创建AVAudioPlayer
实例并用另一种方法播放声音(比如Func B)。声音很好。
但是,如果我在Func A中创建AVAudioPlayer
,我在其中设置声音文件的URL并在Func B中播放声音,声音会间歇性地播放。
声音是一种声音效果,只要按下按钮就会播放。可以反复按下按钮,声音效果应该重复播放。
我已尝试在application(_:didFinishLaunchingWithOptions:)
课程的AppDelegate
中自定义(并激活)该应用的音频会话,但这似乎没有帮助。
我不明白为什么这两种方法会有不同的结果。我希望使用后一种方法避免每次播放声音时实例化AVAudioPlayer
(记住它可以重复播放)。
另外,对于重复播放的声音效果,每次播放声音时调用prepareToPlay
都有什么好处?
接近A(间歇性地播放声音):
import AVFoundation
...
class myClass: UIViewController, SCNSceneRendererDelegate
{
var audioPlayer: AVAudioPlayer!
var sound: URL?
let soundFile: String
...
func LoadSound() {
sound = Bundle.main.url(forResource: soundFile, withExtension: "mp3")
if let _sound = sound {
do {
try audioPlayer = AVAudioPlayer(contentsOf: _sound)
catch {
...
}
} else {
...
}
} // end of func LoadSound
...
func playSoundFX() {
audioPlayer.play()
}
...
}
方法B(声音很好):
import AVFoundation
...
class myClass: UIViewController, SCNSceneRendererDelegate
{
var audioPlayer: AVAudioPlayer!
var sound: URL?
let soundFile: String
...
func LoadSound() {
sound = Bundle.main.url(forResource: soundFile, withExtension: "mp3")
}
...
func playSoundFX() {
if let _sound = sound {
do {
try audioPlayer = AVAudioPlayer(contentsOf: _sound)
audioPlayer.play()
catch {
...
}
} else {
...
}
}
...
}