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

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

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

这很好用,但我想知道文件何时完成播放,以便我可以重新启动它。

请问我该怎么做?

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

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

您可以使用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(); 

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

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

编辑:我希望能够使一首歌可重复到我厌倦了这一点,并且上面的代码确实在我设置了断点时起作用。 一旦我删除它们,我发现有其他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(); } } } 

您可以使用Thread不断检查它,但是文档很少…

  //player .playState //Possible Values // //This property is a read-only Number (long). The C-style enumeration constant can be derived by prefixing //the state value with "wmpps". For example, the constant for the Playing state is wmppsPlaying. //Value State Description //0 Undefined Windows Media Player is in an undefined state. //1 Stopped Playback of the current media item is stopped. //2 Paused Playback of the current media item is paused. When a media item is paused, resuming playback begins from the same location. //3 Playing The current media item is playing. //4 ScanForward The current media item is fast forwarding. //5 ScanReverse The current media item is fast rewinding. //6 Buffering The current media item is getting additional data from the server. //7 Waiting Connection is established, but the server is not sending data. Waiting for session to begin. //8 MediaEnded Media item has completed playback. //9 Transitioning Preparing new media item. //10 Ready Ready to begin playing. //11 Reconnecting Reconnecting to stream. 

您可以使用PlayStateChange(int NewState)函数bulitinto媒体播放器来检测停止状态。