Ios 将AVAudioPlayer声音保留在内存中
如果用户点击一个按钮,我使用AVAudioPlayer播放点击声音 因为轻触和声音之间有延迟,我在ViewDidDisplay中播放一次声音,音量=0 我发现,如果用户在一段时间内点击按钮,声音会立即播放,但在一段时间后,点击和声音之间也会有延迟 在第一种情况下,声音似乎来自初始播放的缓存,而在第二种情况下,应用程序必须再次加载声音 因此,现在我每2秒播放一次音量为0的声音,当用户实际点击按钮时,声音立即响起 我的问题是,有没有更好的方法 我的目标是在应用程序的整个生命周期内将声音保存在缓存中Ios 将AVAudioPlayer声音保留在内存中,ios,swift,audio,avaudioplayer,Ios,Swift,Audio,Avaudioplayer,如果用户点击一个按钮,我使用AVAudioPlayer播放点击声音 因为轻触和声音之间有延迟,我在ViewDidDisplay中播放一次声音,音量=0 我发现,如果用户在一段时间内点击按钮,声音会立即播放,但在一段时间后,点击和声音之间也会有延迟 在第一种情况下,声音似乎来自初始播放的缓存,而在第二种情况下,应用程序必须再次加载声音 因此,现在我每2秒播放一次音量为0的声音,当用户实际点击按钮时,声音立即响起 我的问题是,有没有更好的方法 我的目标是在应用程序的整个生命周期内将声音保存在缓存中
谢谢,如果保存指向AVAudioPlayer的指针,则声音将保留在内存中,不会出现其他延迟。
第一次延迟是由声音加载引起的,因此您在ViewDidDisplay中的第一次播放是正确的。如果您保存指向AVAudioPlayer的指针,则您的声音将保留在内存中,不会出现其他延迟。
第一次延迟是由声音加载引起的,因此您在ViewDidDisplay中的第一次播放是正确的。要避免音频延迟,请使用AVAudioPlayer的.prepareToPlay()方法 调用此方法预加载缓冲区并获取音频硬件 播放时需要,这将调用 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()
要避免音频延迟,请使用AVAudioPlayer的.preparetoplayer()方法 调用此方法预加载缓冲区并获取音频硬件 播放时需要,这将调用 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()