将AVAudioPlayer保持在内存中

时间:2016-06-20 17:33:20

标签: ios swift audio avaudioplayer

如果用户点击按钮,我会使用AVAudioPlayer播放咔嗒声。

因为水龙头和声音之间存在延迟,我在viewDidAppear中播放一次声音,音量= 0

我发现如果用户在一段时间内点击按钮会立即播放声音,但在一段时间之后,在这种情况下,点击和声音之间也会有延迟。

似乎在第一种情况下声音来自初始播放的缓存,而在第二种情况下,应用必须再次加载声音。

因此,现在我每2秒播放一次音量= 0的声音,当用户实际按下按钮时,声音会立即显现。

我的问题是有更好的方法吗?

我的目标是在应用程序的整个生命周期内将声音保留在缓存中。

谢谢,

2 个答案:

答案 0 :(得分:0)

如果将指针保存到AVAudioPlayer,则声音将保留在内存中,不会出现其他延迟。 第一次延迟是由声音加载引起的,因此viewDidAppear中的第一次播放是正确的。

答案 1 :(得分:0)

为避免音频滞后,请使用AVAudioPlayer的 .prepareToPlay()方法。

Apple's Documentation on Prepare To Play

调用此方法可预加载缓冲区并获取音频硬件 播放所需的时间,从而最大程度地减少了调用 play()方法和声音输出的开始。

如果将 player 声明为AVAudioPlayer,则可以调用 player.prepareToPlay()以避免音频滞后。示例代码:

struct AudioPlayerManager {

    var player: AVAudioPlayer? = AVAudioPlayer()

    mutating func setupPlayer(soundName: String, soundType: SoundType) {

    if let soundURL = Bundle.main.url(forResource: soundName, withExtension: soundType.rawValue) {
        do {
            player = try AVAudioPlayer(contentsOf: soundURL)
            player?.prepareToPlay()
        }
        catch  {
            print(error.localizedDescription)
        }
    } else {
        print("Sound file was missing, name is misspelled or wrong case.")
    }
}

然后可以以最小的延迟调用play():

player?.play()