c# - 如何检测 mp3 文件何时播放完毕

标签 c# winforms

我的 c# windows 窗体可以播放 mp3 文件。我使用这段代码做到了这一点

    WMPLib.WindowsMediaPlayer wplayer;
    wplayer = new WMPLib.WindowsMediaPlayer();
    wplayer.URL = "c:/Standup.mp3";
    wplayer.controls.play();

这非常有效,但我想知道文件何时播放完毕,以便我可以重新启动它。

请问我该怎么做?

最佳答案

您可以使用 PlayStateChanged event 来做到这一点.您可以像这样将它添加到您的 MediaPlayer。

WMPLib.WindowsMediaPlayer wplayer;
wplayer = new WMPLib.WindowsMediaPlayer();
wplayer.PlayStateChange += new WMPLib._WMPOCXEvents_PlayStateChangeEventHandler(wplayer_PlayStateChange);
wplayer.URL = "c:/Standup.mp3";
wplayer.controls.play();

然后您可以检查 MediaEnded PlayState在 EventHandler 中并将 currentPosition 重置为歌曲的开头:

void wplayer_PlayStateChange(int NewState)
{
    if (NewState == (int)WMPLib.WMPPlayState.wmppsMediaEnded)
    {
        wplayer.controls.currentPosition = 0;
    }
}

编辑:我希望能够让一首歌重复到我厌烦的地步,当我设置断点时,上面的代码确实有效。删除它们后,我发现还有其他播放状态正在停止播放文件。我能够通过使用一次性计时器绕过它。现在我厌倦了我正在使用的歌曲。可能/可能有更好的方法来执行此操作,但这会起作用。

修改后的代码

public partial class Form1 : Form
{
    WMPLib.WindowsMediaPlayer wplayer;
    Timer tmr = new Timer();
    public Form1()
    {
        InitializeComponent();
        tmr.Interval = 10;
        tmr.Stop();
        tmr.Tick += new EventHandler(tmr_Tick);
        wplayer = new WMPLib.WindowsMediaPlayer();
        wplayer.URL = "c:/Standup.mp3";
        wplayer.PlayStateChange += new WMPLib._WMPOCXEvents_PlayStateChangeEventHandler(wplayer_PlayStateChange);
        wplayer.controls.play();
    }

    void tmr_Tick(object sender, EventArgs e)
    {
        tmr.Stop();
        wplayer.controls.play();
    }

    void wplayer_PlayStateChange(int NewState)
    {
        if (NewState == (int)WMPLib.WMPPlayState.wmppsMediaEnded )
        {
            tmr.Start();

        }
    }


}

关于c# - 如何检测 mp3 文件何时播放完毕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17644754/

相关文章:

c# - SQL Server 列到组合框?

c# - Form Builder On the fly 使用 asp.net mvc 站点

c# - C#中两个问号在一起是什么意思?

c# - 在 Windows Phone 8.1 应用商店应用程序中设置背景音频中的媒体文件标题和专辑

c# - 创建一个消息框,用户可以选择 "Don' 再次显示它。”

c# - 在WPF中绑定(bind)高度和宽度时如何减少绑定(bind)异常的数量?

c# - 使用 GDI+ 在窗体外渲染图形

c# - Datagridview 不更新/刷新

c# - 以编程方式选择 TabControl 中的现有 TabPage 显示空白页

C# Winforms - 不同控件具有相同属性名称的数据绑定(bind)