在Windows Forms应用程序中,如何播放两个音频文件并使其依次播放?

5
我希望在按钮点击后依次播放两个声音。当第一个声音播放完毕后,第二个声音应该开始播放。
我的问题是每次点击按钮时这两个声音都不同,并且我不知道它们的长度,无法使用Thread.Sleep。但我不希望这些声音重叠播放。

我看到了这个问题,但并没有得到帮助。https://dev59.com/s2025IYBdhLWcg3wEhdb - hamze
4个回答

8
听起来你需要使用SoundPlayer类的PlaySync方法。首先在顶部添加以下内容:
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

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

最好取消订阅事件。 - Hans Passant

1
在Shadow Wizards的例子中,每次都创建一个新的声音播放器并不是必要的。 这个也可以工作:
player.SoundLocation = "path/to/media";
player.PlaySync();
player.SoundLocation = "path/to/media2";
player.PlaySync();

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接