【问题标题】:How do I play two sounds one after the other in a Windows Forms application?如何在 Windows 窗体应用程序中一个接一个地播放两种声音?
【发布时间】:2011-10-16 14:12:59
【问题描述】:
我想一个接一个地播放两种声音以响应按钮单击。当第一个声音结束时,第二个声音应该开始播放。
我的问题是每次单击按钮时这两种声音都是不同的,我不知道它们的长度以便使用Thread.Sleep。但我不希望这些声音相互叠加。
【问题讨论】:
标签:
c#
winforms
audio
playback
【解决方案1】:
听起来你在使用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 开始可用,所以你应该拥有它。
【解决方案2】:
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();
}
【解决方案3】:
在 Shadow Wizards 示例中,不必每次都制作新的声音播放器。
这也有效:
player.SoundLocation = "path/to/media";
player.PlaySync();
player.SoundLocation = "path/to/media2";
player.PlaySync();
【解决方案4】:
使用 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;
}