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

使用SoundPlayer在音乐结束后执行某些操作

由于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线程。