同时播放两种声音

Ala*_*ter 28 c# audio simultaneous playback winforms

有没有办法同时播放两种声音?

我知道SoundPlayer无法做到这一点.我无法使用,SoundEffect因为我相信它只是XNA的一部分.

两个必需的声音将在未知和随机时间调用.声音播放后需要进行控制.即,声音必须能够在完成播放之前停止.

Jer*_*eir 32

参考PresentationCoreWindowsBase和试...

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();
Run Code Online (Sandbox Code Playgroud)

编辑 我收到了一个downvote可能是因为乍一看这看起来它会在第一个完成后播放第二个声音.它没有,它们是由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();
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/system.windows.media.mediaplayer.stop.aspx 该类还具有停止播放所需的控件

  • 出于兴趣,我尝试使用新的 Thread 代码,该代码可以运行,但没有任何效果……尽管使用第一个代码块可以正常工作。音频是否必须发生在主线程中? (2认同)

fea*_*thj 6

即使您创建了两个实例,"MediaPlayer"对象也不会让您一次播放两个声音.您需要引入本机Windows API"mciSendString".

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

    public Form1()
    {
        InitializeComponent();

        mciSendString(@"open C:\Users\Jono\Desktop\applause.wav type waveaudio alias applause", null, 0, IntPtr.Zero);
        mciSendString(@"play applause", null, 0, IntPtr.Zero);

        mciSendString(@"open C:\Users\Jono\Desktop\foghorn.wav type waveaudio alias foghorn", null, 0, IntPtr.Zero);
        mciSendString(@"play foghorn", null, 0, IntPtr.Zero);

    }
Run Code Online (Sandbox Code Playgroud)