播放声音播放使用多个声音(Play multiple sounds using SoundPlaye

2019-06-18 12:14发布

我正在做取样程序,其中从1到9的每个键会做出不同的声音。 一切工作正常,但是当我按下两个(或更多)的声音在同一时间,第二个“杀”的第一个。

我打从.WAV文件的声音,通过SoundPlayer 。 我该如何解决这个问题?

Answer 1:

你需要使用DirectX(DirectSound的),或者被设计为允许多个声音的播放,同时一些类似的API。



Answer 2:

有一个在C#或VB.Net播放多个声音在一次一个简单的方法。 你将不得不调用mciSendString() API函数来播放每个.wav文件。 你甚至不会需要做的多线程,除非你是循环播放。 这里是一个完整的工作示例MusicPlayer创建使用类mciSendString()

// Sound api functions
[DllImport("winmm.dll")]
static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);

在上面的函数,关键是第一参数命令。 只要您拨打一个单独的命令名称的两个功能,它们将分别播放/同步。 这是我在我的C#程序一个做的:

private void PlayWorker()
{
    StringBuilder sb = new StringBuilder();
    mciSendString("open \"" + FileName + "\" alias " + this.TrackName, sb, 0, IntPtr.Zero);
    mciSendString("play " + this.TrackName, sb, 0, IntPtr.Zero);
    IsBeingPlayed = true;
}

编辑:添加链接到工作的例子。



Answer 3:

你可以这样做:

SoundPlayer支持WAV流。 你可以

  • MIX样你玩“的手”和,
  • 假(从什么地方得到的WAV头,它并不复杂)。

而提供这种流作为参数的SoundPlayer的构造 。

这样你就不必使用复杂的莫名其妙的DirectSound库,而且还有混合(多种声音一次)。



Answer 4:

我猜,在按键时的事件(或任何你正在使用)您使用的需要,以WAV文件的路径构造函数创建SoundPlayer类的新实例,然后调用它的播放方法。 在理论上,这应该不会造成您所遇到的“单声道”的效果,因为Windows已经被能够同时播放多个WAV文件自Windows 98。我认为你所听到的(根据我自己的使用这个类)是不是当第二开始,但实际上,从整体播放暂停为WAV文件产生毛刺是从磁盘加载的第一个声音的截止。

相反,每个按键加载了声音播放的新实例中,尝试创建类范围的声音播放的对象,并在窗体的Load事件磁盘预加载它们的阵列。 按下该键时,然后,只需调用每个声音播放的播放方法。 这可能会解决您的问题,但我认为你仍然会得到偶尔的毛刺这种方式。



Answer 5:

using System.Windows.Media

Function void Play(string audioPath)
{
MediaPlayer myPlayer = new MediaPlayer();
myPlayer.Open(new System.Uri(audioPath));
myPlayer.Play();
}

Play(Application.StartupPath + "\\Track1.wav");
Play(Application.StartupPath + "\\Track2.wav");

这个代码可以同时播放两个音频文件,在第二音频通话track2.wav不会打扰的游戏track1.wav



文章来源: Play multiple sounds using SoundPlayer
标签: c# .net audio wav