【问题标题】:Keep AVAudioPlayer sound in the memory将 AVAudioPlayer 声音保存在内存中
【发布时间】:2016-06-20 17:33:20
【问题描述】:

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

因为点击和声音之间有延迟,所以我在 viewDidAppear 中播放一次声音,音量 = 0

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

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

因此,现在我每 2 秒播放一次声音,音量 = 0,当用户实际点击按钮时,声音立即响起。

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

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

谢谢,

【问题讨论】:

    标签: ios swift audio avaudioplayer


    【解决方案1】:

    为避免音频延迟,请使用 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()
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        相关资源
        最近更新 更多