同时播放两个声音

时间:2011-06-04 23:27:41

标签: c# winforms audio playback simultaneous

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

我知道SoundPlayer无法做到这一点。 我无法使用SoundEffect因为我认为它只是XNA的一部分。

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

6 个答案:

答案 0 :(得分:30)

参考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();

修改 我收到了一个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();

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

答案 1 :(得分: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);

    }

答案 2 :(得分:1)

在此http://msdn.microsoft.com/en-us/library/aa909766.aspx检查PlaySound方法及其标记SND_ASYNC

答案 3 :(得分:0)

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

http://msdn.microsoft.com/en-us/library/ff842408.aspx

然后播放这样的声音文件...

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,单声道或立体声)格式

答案 4 :(得分:0)

来自http://alvas.net/alvas.audio,samples.aspx#sample7http://alvas.net/alvas.audio,samples.aspx#sample6

Player pl = new Player();
byte[] arr = File.ReadAllBytes(@"in.wav");
pl.Play(arr);
Player pl2 = new Player();
pl2.FileName = "123.mp3";
pl2.Play();

或在播放How to mix to mix two audio file..

之前混合音频数据
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();
}

答案 5 :(得分:0)

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

这是有效的方法:

确保添加对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();

        }