如何在Windows窗体应用程序中依次播放两种声音?

时间:2011-10-16 14:12:59

标签: c# winforms audio playback

我想一个接一个地播放两个声音,以响应按钮点击。当第一个声音结束时,第二个声音应该开始播放。

我的问题是,每次点击按钮时,这两个声音都不同,我不知道它们的长度,以便使用Thread.Sleep。但我不希望这些声音在彼此之上发挥作用。

4 个答案:

答案 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;
 }