AVAudioPlayer根据我创建AVAudioPlayer实例的位置播放声音

时间:2018-05-23 01:49:21

标签: ios swift avaudioplayer

我有一个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 {
            ...
        }
    }
    ...
}

0 个答案:

没有答案