我想一个接一个地播放两个声音,以响应按钮点击。当第一个声音结束时,第二个声音应该开始播放。
我的问题是,每次点击按钮时,这两个声音都不同,我不知道它们的长度,以便使用Thread.Sleep
。但我不希望这些声音在彼此之上发挥作用。
答案 0 :(得分:6)
听起来像是在PlaySync
类的SoundPlayer
方法之后......首先将其添加到顶部:
using System.Media;
然后有这样的代码:
SoundPlayer player = new SoundPlayer(@"path to first media file");
player.PlaySync();
player = new SoundPlayer(@"path to second media file");
player.PlaySync();
这个类从.NET 2.0开始就可用,所以你应该拥有它。
答案 1 :(得分:1)
MediaPlayer有MediaEnded事件。在事件处理程序中,只需启动新媒体,它们应该背靠背播放。
protected System.Windows.Media.MediaPlayer pl = new MediaPlayer();
public void StartPlayback(){
pl.Open(new Uri(@"/Path/to/media/file.wav"));
pl.MediaEnded += PlayNext;
pl.Play();
}
private void PlayNext(object sender, EventArgs e){
pl.Open(new Uri(@"/Path/to/media/file.wav"));
pl.Play();
}
答案 2 :(得分:1)
在Shadow Wizards示例中,每次都不需要制作新的声音播放器。 这也有效:
player.SoundLocation = "path/to/media";
player.PlaySync();
player.SoundLocation = "path/to/media2";
player.PlaySync();
答案 3 :(得分:0)
使用NAudio的示例
private List<string> wavlist = new List<string>();
wavlist.Add("c:\\1.wav");
wavlist.Add("c:\\2.wav");
foreach(string file in wavlist)
{
AudioFileReader audio = new AudioFileReader(file);
audio.Volume = 1;
IWavePlayer player = new WaveOut(WaveCallbackInfo.FunctionCallback());
player.Init(audio);
player.Play();
System.Threading.Thread.Sleep(audio.TotalTime);
player.Stop();
player.Dispose();
audio.Dispose();
player = null;
audio = null;
}