C# 使用SoundPlayer播放多种声音
我正在制作一个采样器程序,从1到9的每个键都会发出不同的声音。 一切正常,但当我同时按下两个(或更多)声音时,第二个声音“杀死”第一个声音C# 使用SoundPlayer播放多种声音,c#,.net,audio,wav,C#,.net,Audio,Wav,我正在制作一个采样器程序,从1到9的每个键都会发出不同的声音。 一切正常,但当我同时按下两个(或更多)声音时,第二个声音“杀死”第一个声音 我正在使用SoundPlayer播放.WAV文件中的声音。如何解决此问题?您需要使用DirectX(DirectSound)或一些类似的API,这些API旨在允许同时播放多个声音。您需要使用DirectX(DirectSound)或者一些类似的API,其设计允许同时播放多个声音。我猜在您的按键事件(或您正在使用的任何事件)中,您正在使用获取WAV文件路径的构
我正在使用
SoundPlayer
播放.WAV文件中的声音。如何解决此问题?您需要使用DirectX(DirectSound)或一些类似的API,这些API旨在允许同时播放多个声音。您需要使用DirectX(DirectSound)或者一些类似的API,其设计允许同时播放多个声音。我猜在您的按键事件(或您正在使用的任何事件)中,您正在使用获取WAV文件路径的构造函数创建SoundPlayer的新实例,然后调用其播放方法。从理论上讲,这不应该导致您遇到的“单声道”效果,因为自Windows 98以来,Windows能够同时播放多个WAV文件。我认为您听到的(基于我自己对这个类的使用)不是第二个声音开始时第一个声音的中断,而是从磁盘加载WAV文件时整个播放暂停导致的故障
尝试创建一个类范围的SoundPlayer对象数组,并在窗体的Load事件中从磁盘预加载它们,而不是在每次按键时加载SoundPlayer的新实例。然后只要在按键时调用每个SoundPlayer的播放方法即可。这可能会解决你的问题,尽管我认为你仍然会偶尔出现小故障 我猜在您的按键事件(或您正在使用的任何事件)中,您正在使用获取WAV文件路径的构造函数创建SoundPlayer的新实例,然后调用其播放方法。从理论上讲,这不应该导致您遇到的“单声道”效果,因为自Windows 98以来,Windows能够同时播放多个WAV文件。我认为您听到的(基于我自己对这个类的使用)不是第二个声音开始时第一个声音的中断,而是从磁盘加载WAV文件时整个播放暂停导致的故障
尝试创建一个类范围的SoundPlayer对象数组,并在窗体的Load事件中从磁盘预加载它们,而不是在每次按键时加载SoundPlayer的新实例。然后只要在按键时调用每个SoundPlayer的播放方法即可。这可能会解决你的问题,尽管我认为你仍然会偶尔出现小故障 在C#或VB.Net中,有一种简单的方法可以同时播放多个声音。您必须调用
mciSendString()
API函数才能播放每个.wav文件。你甚至不必做多线程,除非你是循环播放。是使用mciSendString()
创建的MusicPlayer
类的完整工作示例
在上述功能中,键是第一个参数命令。只要使用单独的命令名调用两个函数,它们将分别/同时播放。这就是我在一个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;
}
编辑:添加了一个工作示例的链接。在C#或VB.Net中,有一种简单的方法可以同时播放多个声音。您必须调用
mciSendString()
API函数才能播放每个.wav文件。你甚至不必做多线程,除非你是循环播放。是使用mciSendString()
创建的MusicPlayer
类的完整工作示例
在上述功能中,键是第一个参数命令。只要使用单独的命令名调用两个函数,它们将分别/同时播放。这就是我在一个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;
}
编辑:添加工作示例的链接。您可以执行以下操作:
SoundPlayer
支持WAV流。你可以
- 混合您“手动”播放的样本
- 假(从某处获取WAV头,这并不复杂)
SoundPlayer
支持WAV流。你可以
- 混合您“手动”播放的样本
- 假(从某处获取WAV头,这并不复杂)
track2.wav
中的调用不会干扰track1.wav
的播放
此代码可以同时播放两个音频文件,第二个音频调用track2.wav将不会干扰track1.wav的播放。您需要通过SharpDX使用xAudio2,它是一个专用于游戏开发的directX组件,您可以在这里找到完整的工作示例:
您需要通过SharpDX使用xAudio2,它是专用于游戏开发的directX组件,您可以在此处找到完整的工作示例:
这是有效的,但前提是您每次都发送一个新的唯一曲目名称,这是设计的吗?如果您尝试在以前使用的trackname上播放另一个声音(即使在第一个声音停止很久之后),它仍然是无声的。@Sire不应该发生这种情况。您确定在播放完成后发送“停止”命令和“关闭”命令吗?您可以参考我的整个MusicLayer实现。请特别注意PlayWorker(),它在播放音频的线程中被调用。感谢您提供完整的代码!我会把这个链接添加到答案中。@Prahlad Yeri:和陛下有同样的问题。声音只会播放一次。一旦声音结束,它应该能够自行停止。我不想知道,即使我知道,
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");