C# 如何使用WPF同时播放两个声音文件?

C# 如何使用WPF同时播放两个声音文件?,c#,wpf,pixelsense,C#,Wpf,Pixelsense,我使用SoundPlayer在WPF程序中播放音效。但是,我发现,当两个声音效果同时播放时,新的声音效果将取代旧的声音效果(即,新的声音效果将终止旧的声音效果,并自行播放),但我想要的是即使播放新的声音效果,也能继续播放旧的声音效果 SoundPlayer wowSound = new SoundPlayer("soundEffect/Wow.wav"); SoundPlayer countingSound = new SoundPlayer("soundEffect/funny.wav");

我使用
SoundPlayer
在WPF程序中播放音效。但是,我发现,当两个声音效果同时播放时,新的声音效果将取代旧的声音效果(即,新的声音效果将终止旧的声音效果,并自行播放),但我想要的是即使播放新的声音效果,也能继续播放旧的声音效果

SoundPlayer wowSound = new SoundPlayer("soundEffect/Wow.wav");

SoundPlayer countingSound = new SoundPlayer("soundEffect/funny.wav");

wowSound.Play(); // play like background music

countingSound.Play();  // from click to generate the sound effect

您可以使用
SoundPlayer.PlaySync()
,它使用用户界面线程播放
.wav
文件,以便首先播放
wowSound
。然后,
countingSound
将在
wowSound
完成播放后播放

示例

SoundPlayer wowSound = new SoundPlayer(@"soundEffect/Wow.wav"); //Initialize a new SoundPlayer of name wowSound
SoundPlayer countingSound = new SoundPlayer(@"soundEffect/funny.wav"); //Initialize a new SoundPlayer of name wowSound
wowSound.PlaySync(); //Play soundEffect/Wow.wav synchronously
countingSound.PlaySync();  //Play soundEffect/funny.wav synchronously 
MediaPlayer wowSound = new MediaPlayer(); //Initialize a new instance of MediaPlayer of name wowSound
wowSound.Open(new Uri(@"soundEffect/Wow.wav")); //Open the file for a media playback
wowSound.Play(); //Play the media

MediaPlayer countingSound = new MediaPlayer(); //Initialize a new instance of MediaPlayer of name countingSound
countingSound.Open(new Uri(@"soundEffect/funny.wav")); //Open the file for a media playback
countingSound.Play(); //Play the media
注意:您不能使用
SoundPlayer
同时播放多个声音,因为它不支持同时播放声音。如果您想同时播放两个或多个声音,
System.Windows.Media.MediaPlayer
将是一个更好的选择

示例

SoundPlayer wowSound = new SoundPlayer(@"soundEffect/Wow.wav"); //Initialize a new SoundPlayer of name wowSound
SoundPlayer countingSound = new SoundPlayer(@"soundEffect/funny.wav"); //Initialize a new SoundPlayer of name wowSound
wowSound.PlaySync(); //Play soundEffect/Wow.wav synchronously
countingSound.PlaySync();  //Play soundEffect/funny.wav synchronously 
MediaPlayer wowSound = new MediaPlayer(); //Initialize a new instance of MediaPlayer of name wowSound
wowSound.Open(new Uri(@"soundEffect/Wow.wav")); //Open the file for a media playback
wowSound.Play(); //Play the media

MediaPlayer countingSound = new MediaPlayer(); //Initialize a new instance of MediaPlayer of name countingSound
countingSound.Open(new Uri(@"soundEffect/funny.wav")); //Open the file for a media playback
countingSound.Play(); //Play the media
编辑:


Picrofo是对的,不能这样做,但似乎你可以通过MS DirectShow的包装来实现这一点…

在WPF和C中使用内置播放器一段时间后,我发现它们太缺乏功能,所以我改为使用NAudio

它要求您编写更多的代码,但一旦您发现需求发生了变化(它们总是这样),并且内置媒体播放器不再适用,您就会很高兴


源代码附带了一些示例,您可以在这里、codeplex网站和谷歌搜索中找到更多关于堆栈溢出的帮助。

。。我看过这个,但没有试过。这是因为你喜欢聚会吗?我试过PlaySync()方法,但我发现新的只是在旧的方法之后播放。我想同时玩这两种游戏。您可能认为wowSound.Play()的播放方式与背景音乐和countingSound.Play()的播放方式类似。@Alanlau如果您想同时播放这两种声音,我想您可以尝试
Play()
。祝你有一个愉快的一天:)Picrofo,我也希望有一个愉快的一天,但是我发现Play()方法只会让新的代替旧的。换言之,新版本将终止旧版本并自行播放。@Alanlau抱歉误解,我已经更新了我的答案。我希望你能尽快解决你的问题。祝你今天愉快:)@Alanlau我很高兴能帮上忙。节日快乐!:)我真的认为,即使您尝试运行一个新的
线程来播放wave文件,这也不会起作用
SoundPlayer
使用本机WINAPI函数播放wave文件,不幸的是,它不支持同时播放声音。祝你今天愉快:)