我使用Win Forms应用程序在C#中制作了一种俄罗斯方块游戏。 我希望程序在游戏过程中循环播放.wav文件,而另一个简短的.wav文件只是偶尔但与“主”声音平行。
我在开头宣布:
SoundPlayer sp;
SoundPlayer sp2;
然后在FormLoad事件中:
private void Form1_Load(object sender, EventArgs e)
{
...
sp2 = new SoundPlayer(".../tetris.wav");
sp2.PlayLooping();
...
}
然后,只要一排块消失,我就想发射炸弹声:
sp = new SoundPlayer(".../bomb.wav");
sp.Play();
问题是:当第二个声音被触发时,第一个(主)声音停止。我认为这是一个线程问题,但我不知道如何解决这个问题。
谢谢你,菲利普
答案 0 :(得分:0)
不,这不是一个线程问题! SoundPlayer仅支持同时播放一个音频。
如果您需要多声音,则必须使用以下技术之一:
WPF / MediaPlayer = System.Windows.Media.MediaPlayer();打开然后播放
的DirectX / DirectSound的
XNA / SoundEffect中
答案 1 :(得分:0)
我一直在努力解决同样的问题......
简短的回答是你不能。系统将仅允许在任何给定过程中一个声道到声音接口。因此,当您开始播放新声音时,前一个声音将终止。
有许多解决方法主要使用Direct-X或Media-Player。但是,我发现这些解决方案既不简单也不健壮,因为您依赖于用户计算机来安装正确的东西。
然而,我找到了解决问题的快速而简单的方法。
我添加了一个特殊的" hook"我的应用程序,以便当我使用适当的命令行参数运行它时,它所做的就是同步播放特定声音并退出。然后我使用进程对象用适当的参数启动应用程序的另一个实例..并且嘿presto ..多个声音。
如果您的应用程序配置为自动成为单个实例,则需要将其禁用并用一些代码替换它以检测另一个实例并退出。
另一种方法是在您的应用程序包中添加一个小的exe,它只是简单地执行声音部分。
我知道它听起来不是很纯粹"但是实际上,你真正尝试用你的代码开始一个临时的后台进程来播放声音。如果该过程是Windows本机功能或您自己制作的功能,那么这并不重要。