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

11 c# winforms

我的c #windows窗体可以播放mp3文件.我是用这个代码做的

    WMPLib.WindowsMediaPlayer wplayer;
    wplayer = new WMPLib.WindowsMediaPlayer();
    wplayer.URL = "c:/Standup.mp3";
    wplayer.controls.play();
Run Code Online (Sandbox Code Playgroud)

这很完美,但我想知道文件何时播放完毕,以便我可以重新启动它.

请问我该怎么做?

Mar*_*all 16

您可以使用PlayStateChanged事件来完成此操作.您可以像这样将它添加到您的MediaPlayer.

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

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

void wplayer_PlayStateChange(int NewState)
{
    if (NewState == (int)WMPLib.WMPPlayState.wmppsMediaEnded)
    {
        wplayer.controls.currentPosition = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:我希望能够使一首歌可重复到我厌倦了这一点,并且上面的代码确实在我设置了断点时起作用.一旦我删除它们,我发现有其他PlayStates正在停止播放该文件.我能够通过使用单次定时器来绕过它.现在我感到累了,我用的歌曲.可能/可能有更好的方法,但这将有效.

修改代码

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

        }
    }


}
Run Code Online (Sandbox Code Playgroud)


Har*_*eth 6

如果您不一定需要知道文件何时完成除了循环之外的任何其他目的,您可以考虑使用setMode方法来启用跟踪循环.

http://msdn.microsoft.com/en-us/library/windows/desktop/dd564867(v=vs.85).aspx

  • 我没有使用过这个库,但根据我的理解,你应该可以使用:wplayer.settings.setMode("loop",true); 或者wplayer.settings.setMode("autoRewind",true); (3认同)