C# NAudio - 更改音频播放位置仍然播放旧位置的小缓冲区

标签 c# wpf position mp3 naudio

我正在尝试用 C# 和 WPF 以及 NAudio 制作一个基本的 MP3 播放器。我最近添加了一个 slider 来跟踪歌曲中的当前位置,并允许您将其拖动到不同的位置,并且在 Thumb.DragCompleted 上它会将歌曲的位置设置为您拖动它的位置。

这一切都很好,除了当我让它跳到新位置时,它在改变之前仍然播放旧位置 1/5 秒左右。这是最明显的,例如当歌手正在唱“aaa”的时候,你暂停一下,拖到他唱“ooo”的地方,再弹一下,你会听到“aa-ooo”。这只会导致它听起来非常可怕。

所以我想音频播放只剩下一个小的“缓冲区”,它会在继续播放之前坚持播放。有没有办法清除这个缓冲区?还是我设置的位置不对?

我正在使用 WaveOut waveOutDeviceAudioFileReader audioFileReader。该 slider 称为 sldrPlaybackProgress
我已经尝试以两种不同的方式改变歌曲中的位置:

第一种方法:

audioFileReader.CurrentTime = new TimeSpan(0, (int)(Math.Floor(sldrPlaybackProgress.Value / 60)), (int)(Math.Floor(sldrPlaybackProgress.Value % 60))); 

第二种方法:

audioFileReader.Position = (long)(sldrPlaybackProgress.Value * audioFileReader.WaveFormat.AverageBytesPerSecond);

这两个单独或什至两者结合仍然会导致问题持续存在。

最佳答案

当暂停期间发生重新定位时,您应该调用 Stop。这将刷新所有未完成的缓冲区和。 Stop 调用 waveOutStopPause 调用 waveOutPause,这不会清除任何正在进行的播放缓冲区。

关于C# NAudio - 更改音频播放位置仍然播放旧位置的小缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32100620/

相关文章:

c# - 如何提高winform的加载时间?

c# - 无法在 WPF 中设置 DataTrigger

c# - 如何正确地为 XAML 中的数据绑定(bind)添加前缀(或后缀)?

ios - 为 SpriteKit 游戏获取正确的位置/分辨率

c# - Win32com.client.dispatch Python 调用 C# 中的等价物

C# - 如何使用反射调用参数数量可变的静态方法

c# - 避免在泛型类型参数上使用 == 和 != 运算符,但它可以与 null 进行比较吗?

wpf - 如何分离wpf文本框中的背景图像?

Javascript DOM - 将文本元素对齐到中心?

CSS:将图像从图像中的指定位置重复到另一个指定位置