1

我用 C# 用 Win Forms 应用程序制作了一种俄罗斯方块游戏。我希望程序在游戏过程中循环播放一个 .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();

问题是:当第二个声音被触发时,第一个(主要)声音停止了。我认为这是一个线程问题,但我不知道如何解决这个问题。

谢谢你,菲利波

4

2 回答 2

0

不,这不是线程问题!SoundPlayer 只支持同时播放一种音频。

如果您需要多声音,则必须使用以下技术之一:

WPF/ MediaPlayer = System.Windows.Media.MediaPlayer(); 打开然后播放

DirectX/DirectSound

XNA/音效

于 2016-06-08T18:18:50.953 回答
0

我一直在为同样的问题而苦苦挣扎......

简短的回答是你不能。在任何给定进程中,系统将只允许一个通道连接到声音接口。因此,当您开始一个新声音时,前一个声音会终止。

有许多解决方法主要使用 Direct-X 或 Media-Player。但是,我发现这些解决方案都不是简单或强大的,因为您依赖于用户机器来安装正确的东西。

但是,我找到了一个快速简单的解决方案。

我在我的应用程序中添加了一个特殊的“挂钩”,这样当我使用适当的命令行参数运行它时,它所做的就是同步播放特定的声音并退出。然后,我使用进程对象以适当的参数启动应用程序的另一个实例……嘿,presto……多种声音。

如果您的应用程序配置为自动成为单个实例,则需要禁用它并用一些代码替换它以检测另一个实例并退出。

另一种选择是在您的应用程序包中添加一个小型 exe,它只执行声音部分。

我知道这听起来不是很“纯粹”,但实际上,你真正想要对代码做的只是启动一个临时后台进程来播放声音。该进程是 Windows 本机功能还是您自己制作的功能并不重要。

于 2017-02-01T15:38:34.560 回答