使用SoundPlayer在音乐结束后执行某些操作
本文关键字:执行 操作 结束 SoundPlayer 音乐 使用 | 更新日期: 2023-09-27 18:25:42
我需要在异步加载的音乐文件完成后做一些事情。比方说,我希望程序退出或其他什么。现在我该如何在音乐结束后完成它呢?
private void button1_Click(object sender, EventArgs e)
{
player.SoundLocation = @"Music'" + FileList[0];
player.LoadAsync();
}
private void Player_LoadCompleted(object sender, AsyncCompletedEventArgs e)
{
if (player.IsLoadCompleted)
{
player.PlaySync();
}
}
由于PlaySync
方法是同步的,因此在文件播放到最后之前,它不会返回。所以,你可以简单地这样做:
if (player.IsLoadCompleted)
{
player.PlaySync();
DoSomethingAfterMusicIsDone();
}
更新:
如果SoundLocation
指向文件系统上的文件,则LoadAsync
似乎同步运行。这意味着,如果您不想冻结UI线程,则应该在另一个线程上调用LoadAsync
。这里有一个例子:
Task.Run(() => player.LoadAsync());
改为使用MediaPlayer:
mediaPlayer = new MediaPlayer();
mediaPlayer.MediaEnded += delegate { MessageBox.Show("Media Ended"); };
mediaPlayer.Open(new Uri(@"C:'myfile.mp3"));
mediaPlayer.Play();
理论上听起来不错。然而,事实上,我无法让MediaEnded事件启动。因此,我不得不投票支持MediaEvent的结束,如下所示:
while(true)
{
System.Threading.Thread.Sleep(1000);
string pos = "unknown";
string dur = "unknown";
try
{
pos = mediaplayer1.Position.Ticks.ToString();
dur = mediaplayer1.NaturalDurataion.TimeSpan.Ticks.ToString()
if (pos == dur)
{
// MediaEnded!!!!!
pos = "0";
dur = "0";
}
catch {}
}
}
积极的一面是,你可以通过轮询来更新你的音频播放器Slider。。。不利的一面是,如果你注意到1000毫秒的延迟,它会使暂停按钮有点没有反应。。。
如果您使用此解决方法,我建议将Mediaplayer放在后台线程中,这样轮询循环就不会锁定UI线程。