0

我正在做一个项目,当某些动作发生时应该播放声音(.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 一起使用,并且此类在视图模型中实例化。

4

0 回答 0