同时播放两个声音

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

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

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

参考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可能是因为乍一看,这看起来会发挥第一个完成后的第二个声音。 它不是,它们是由asynchronous播放的窗口。 睡眠在那里,所以如果你逐字testing这个代码,你可以听到声音在一起播放,它不会有明显的延迟,因为它们是相同的声音。

这段代码演示了两个声音在不同的线程之上播放,这是没有意义的,因为播放不会阻塞

 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该类也有控制你需要停止播放;

即使您创build了两个实例,“MediaPlayer”对象也不会让您一次播放两个声音。 您将需要引入本机窗口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); } 

在这里检查PlaySound方法http://msdn.microsoft.com/en-us/library/aa909766.aspx ,及其标志SND_ASYNC

解决scheme:嗨,我正在开发一个WP8应用程序,我需要多个声音同时播放,上面提到的解决scheme并不适合我,所以我使用了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,单声道或立体声)格式

http://alvas.net/alvas.audio,samples.aspx#sample7和http://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(); 

或在播放前混合audio数据如何混合混音两个audio文件

 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(); }