我正在制作一个采样程序,其中从1到9的每个键都会发出不同的声音。一切运作良好,但是当我同时按下两个(或更多)键时,第二个声音会“覆盖”掉第一个声音。
我使用SoundPlayer
从.WAV文件播放声音。我该如何解决这个问题?
您需要使用DirectX(DirectSound)或一些类似的API,这些API旨在允许同时播放多个声音。
在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);
在上述函数中,关键字是第一个参数command。只要使用不同的命令名称调用两个函数,它们就会分别/同时执行。这是我在我的一个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;
}
编辑:添加了一个可工作示例的链接。
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
的播放。
MediaPlayer
中不存在 Load
。但即使没有它,它仍然可以正常工作。2. 在第一个 mPlayer.Play()
后添加另一个 mPlayer.Play()
不会播放音频文件两次,而是一次 - 为什么? - OfirDFunction void Play(string audioPath) { ... myPlayer.Play(); myPlayer.Play(); }
那么Play只会运行一次,而不是两次。为什么? - OfirDSoundPlayer
支持WAV流。你可以:SoundPlayer
构造函数。你需要通过SharpDX使用xAudio2,它是专门用于游戏开发的DirectX组件,你可以在这里找到一个完整的工作示例: https://github.com/sharpdx/SharpDX-Samples/tree/master/Desktop/XAudio2/PlaySound