我正在开展一个项目,当某些动作发生时应播放声音(.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,这个类在viewmodel中实例化。