如果用户点击按钮,我会使用AVAudioPlayer播放咔嗒声。
因为水龙头和声音之间存在延迟,我在viewDidAppear中播放一次声音,音量= 0
我发现如果用户在一段时间内点击按钮会立即播放声音,但在一段时间之后,在这种情况下,点击和声音之间也会有延迟。
似乎在第一种情况下声音来自初始播放的缓存,而在第二种情况下,应用必须再次加载声音。
因此,现在我每2秒播放一次音量= 0的声音,当用户实际按下按钮时,声音会立即显现。
我的问题是有更好的方法吗?
我的目标是在应用程序的整个生命周期内将声音保留在缓存中。
谢谢,
答案 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()