Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将AVAudioPlayer声音保留在内存中_Ios_Swift_Audio_Avaudioplayer - Fatal编程技术网

Ios 将AVAudioPlayer声音保留在内存中

Ios 将AVAudioPlayer声音保留在内存中,ios,swift,audio,avaudioplayer,Ios,Swift,Audio,Avaudioplayer,如果用户点击一个按钮,我使用AVAudioPlayer播放点击声音 因为轻触和声音之间有延迟,我在ViewDidDisplay中播放一次声音,音量=0 我发现,如果用户在一段时间内点击按钮,声音会立即播放,但在一段时间后,点击和声音之间也会有延迟 在第一种情况下,声音似乎来自初始播放的缓存,而在第二种情况下,应用程序必须再次加载声音 因此,现在我每2秒播放一次音量为0的声音,当用户实际点击按钮时,声音立即响起 我的问题是,有没有更好的方法 我的目标是在应用程序的整个生命周期内将声音保存在缓存中

如果用户点击一个按钮,我使用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()