我正在做一个项目,当某些动作发生时应该播放声音(.wav 文件)。这些文件位于项目/位置的子文件夹中的本地驱动器上。
为了一个接一个地同步播放声音,我有以下课程:
public class Player
{
private readonly BlockingCollection<Sound> _queue;
public Player()
{
_queue = new BlockingCollection<Sound>();
Task.Factory.StartNew(Play);
}
public void PlaySound(Sound sound)
{
_queue.Add(sound);
}
private void Play()
{
foreach (var sound in _queue.GetConsumingEnumerable())
{
var filename = GetFile(sound);
using (var player = new System.Media.SoundPlayer(filename))
{
player.PlaySync();
}
}
}
}
我有时遇到的问题是,PlaySync 方法会运行超过一分钟,直到播放声音。声音文件的持续时间为 0.2 秒。这只发生在第一次调用该方法时。我尝试将文件加载到内存中并调用 SoundPlayer 类的 Load/LoadAsync 方法。这对局势没有影响。PlaySync 调用有时需要一分钟以上。
我也尝试了 System.Windows.Media.MediaPlayer 类,但在我看来,这个类只能异步播放声音,我需要同步声音。此类上的 MediaEnded 之类的事件永远不会被调用。
我现在尝试了很多天来找到解决这个问题的方法,但没有找到任何东西。有人可以帮我吗?
我将 WPF 与 MVVM 框架 Prism 一起使用,并且此类在视图模型中实例化。