加载到内存中的音频文件在播放前有 500 毫秒的延迟
Audio file loaded into memory has 500ms delay before playing
在我的游戏中,我使用 this article on fire-and-forget sound with NAudio 中的提示和代码,使用提供的 AudioPlaybackEngine
、CachedSound
和 CachedSoundSampleProvider
类从光盘中获取音频文件并将其样本加载到内存中的 float[]
中,通过将其混合到始终播放的 MixingSampleProvider
.
中进行播放
现在,当我的测试玩家精灵在空中跳跃时,这段代码被用来播放跳跃声音:
private CachedSound jumpSound;
...
jumpSound = new CachedSound(ContentPackageManager.GetAbsoluteFilePath("nsmbwiiJump"));
...
AudioPlaybackEngine.Instance.PlaySound(jumpSound);
但是,无论我是从磁盘还是从内存播放,声音都会在 500 毫秒左右的延迟后播放 - 并且延迟是相同的。这里出了什么问题?
由于 WaveOut
在幕后使用的缓冲持续时间,存在一些延迟。基本上,您正在播放一个缓冲区,同时填充另一个缓冲区。所以你落后于至少一个缓冲区的持续时间。 NAudio 允许您在初始化 WaveOut
设备之前配置缓冲区持续时间和缓冲区数量。然而,你走得越低,丢失的机会就越大,这听起来像是音频中的故障。
在我的游戏中,我使用 this article on fire-and-forget sound with NAudio 中的提示和代码,使用提供的 AudioPlaybackEngine
、CachedSound
和 CachedSoundSampleProvider
类从光盘中获取音频文件并将其样本加载到内存中的 float[]
中,通过将其混合到始终播放的 MixingSampleProvider
.
现在,当我的测试玩家精灵在空中跳跃时,这段代码被用来播放跳跃声音:
private CachedSound jumpSound;
...
jumpSound = new CachedSound(ContentPackageManager.GetAbsoluteFilePath("nsmbwiiJump"));
...
AudioPlaybackEngine.Instance.PlaySound(jumpSound);
但是,无论我是从磁盘还是从内存播放,声音都会在 500 毫秒左右的延迟后播放 - 并且延迟是相同的。这里出了什么问题?
由于 WaveOut
在幕后使用的缓冲持续时间,存在一些延迟。基本上,您正在播放一个缓冲区,同时填充另一个缓冲区。所以你落后于至少一个缓冲区的持续时间。 NAudio 允许您在初始化 WaveOut
设备之前配置缓冲区持续时间和缓冲区数量。然而,你走得越低,丢失的机会就越大,这听起来像是音频中的故障。