C# 同时播放两种声音

C# 同时播放两种声音,c#,winforms,audio,playback,simultaneous,C#,Winforms,Audio,Playback,Simultaneous,有办法同时播放两种声音吗 我知道,SoundPlayer不能这样做。 我不能使用SoundEffect,因为我相信这只是XNA的一部分 将在未知和随机时间调用这两个必需的声音。声音播放后需要加以控制。i、 例如,声音必须能够在结束播放之前停止。请参考PresentationCore和WindowsBase,然后尝试此 var p1 = new System.Windows.Media.MediaPlayer(); p1.Open(new System.Uri(@"C:\windows\media

有办法同时播放两种声音吗

我知道,
SoundPlayer
不能这样做。 我不能使用
SoundEffect
,因为我相信这只是XNA的一部分


将在未知和随机时间调用这两个必需的声音。声音播放后需要加以控制。i、 例如,声音必须能够在结束播放之前停止。

请参考
PresentationCore
WindowsBase
,然后尝试此

var p1 = new System.Windows.Media.MediaPlayer();
p1.Open(new System.Uri(@"C:\windows\media\tada.wav"));
p1.Play();

// this sleep is here just so you can distinguish the two sounds playing simultaneously
System.Threading.Thread.Sleep(500);

var p2 = new System.Windows.Media.MediaPlayer();
p2.Open(new System.Uri(@"C:\windows\media\tada.wav"));
p2.Play();
编辑 我收到了否决票,可能是因为乍一看,第一个声音结束后,它会播放第二个声音。事实并非如此,它们是由windows异步播放的。睡眠是存在的,所以如果你逐字测试这段代码,你可以听到声音一起播放,没有延迟就不会被注意到,因为它们是相同的声音

这段代码演示了两个声音在不同的线程上相互叠加播放,这有点毫无意义,因为播放不会阻塞

new System.Threading.Thread(() => {
        var c = new System.Windows.Media.MediaPlayer();
        c.Open(new System.Uri(@"C:\windows\media\tada.wav"));
        c.Play();
    }).Start();

System.Threading.Thread.Sleep(500);

new System.Threading.Thread(() => {
        var c = new System.Windows.Media.MediaPlayer();
        c.Open(new System.Uri(@"C:\windows\media\tada.wav"));
        c.Play();
    }).Start();
该类还具有停止播放所需的控件。

即使创建了两个实例,“MediaPlayer”对象也不允许您同时播放两个声音。您需要引入本机windows API“mciSendString”


检查此处的
PlaySound
方法及其标志
SND_ASYNC

解决方案: 你好 我正在开发一个WP8应用程序,我需要同时播放多个声音,上面提到的解决方案对我不起作用,所以我使用了XNA框架。这里是链接

然后像这样播放你的声音文件

SoundEffect Sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri("Assets/Sounds/wav/sound.wav", UriKind.Relative)).Stream);
Sound.Play();
用于循环

SoundEffectInstance Sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri("Assets/Sounds/wav/sound.wav", UriKind.Relative)).Stream).CreateInstance();
Sound.IsLooped = true;
Sound.Play();
注意:文件必须采用“.wav”(PCM,8或16位,8KHz至48KHz,单声道或立体声)格式

或在播放前混合音频数据


被接受的答案对我不起作用

以下是有效的方法:

确保添加对PresentationCore和WindowsBase DLL的引用

     private void Form1_Load(object sender, EventArgs e)
     {

            System.Media.SoundPlayer player = new System.Media.SoundPlayer(@"C:\Users\me\source\repos\TacticalIslandSurvival\sounds\blazer rail.wav");
            player.PlayLooping();
     }

        private void button1_MouseEnter(object sender, EventArgs e)
        {            
            var p1 = new System.Windows.Media.MediaPlayer();
            p1.Open(new System.Uri(@"C:\Users\me\source\repos\TacticalIslandSurvival\sounds\click.wav"));
            p1.Play();

        }

什么环境?ASP.NET/web?WinForms?WPF桌面?Silverlight?嗨,这是用于windows窗体应用程序的!PlaySound不能同时播放两种声音,即使您使用了async标志。你可以让两个独立的线程同步调用PlaySound来实现这一点。你只需将它调用到一行中的次,当使用该标志时,该方法将立即退出,第二个将启动。出于兴趣,我尝试使用新的线程代码,该代码运行,但没有播放。。。即使使用第一个代码块它也可以正常工作。音频必须发生在主线程中吗?这个答案可能与更新有关。特别是现在我们有了TPL
任务
@lex,确保MediaPlayer在播放前/播放时没有被丢弃。这就是我的原因。
Player pl = new Player();
byte[] arr = File.ReadAllBytes(@"in.wav");
pl.Play(arr);
Player pl2 = new Player();
pl2.FileName = "123.mp3";
pl2.Play();
private void Mix(string outfile, string infile1, string infile2, int shiftSec)
{
    WaveReader wr1 = new WaveReader(File.OpenRead(infile1));
    WaveReader wr2 = new WaveReader(File.OpenRead(infile2));
    IntPtr format1 = wr1.ReadFormat();
    WaveFormat wf = AudioCompressionManager.GetWaveFormat(format1);
    WaveWriter ww = new WaveWriter(File.Create(outfile), AudioCompressionManager.FormatBytes(format1));
    byte[] data0 = wr1.ReadData(0, shiftSec);
    byte[] data1 = wr1.ReadData(shiftSec);
    byte[] data2 = wr2.ReadData();
    byte[] mixData = AudioCompressionManager.Mix(format1, data2, data1);
    ww.WriteData(data0);
    ww.WriteData(mixData);
    ww.Close();
    wr2.Close();
    wr1.Close();
}
     private void Form1_Load(object sender, EventArgs e)
     {

            System.Media.SoundPlayer player = new System.Media.SoundPlayer(@"C:\Users\me\source\repos\TacticalIslandSurvival\sounds\blazer rail.wav");
            player.PlayLooping();
     }

        private void button1_MouseEnter(object sender, EventArgs e)
        {            
            var p1 = new System.Windows.Media.MediaPlayer();
            p1.Open(new System.Uri(@"C:\Users\me\source\repos\TacticalIslandSurvival\sounds\click.wav"));
            p1.Play();

        }