How to detect when a mp3 file has finished playing

前端 未结 4 856
旧时难觅i
旧时难觅i 2020-12-10 13:34

My c# windows form is enable to play an mp3 file.I did this using this code

    WMPLib.WindowsMediaPlayer wplayer;
    wplayer = new WMPLib.WindowsMediaPlaye         


        
4条回答
  •  佛祖请我去吃肉
    2020-12-10 13:45

    You can do it by using the PlayStateChanged event. you can add it to your MediaPlayer like this.

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

    you can then check for the MediaEnded PlayState in the EventHandler and reset the currentPosition to the start of the song :

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

    Edit: I expected to be able to make a song repeatable to the point I was sick of it, and the above code did work when I had breakpoints set. Once I removed them I found there were other PlayStates that were stopping the file from being played. I was able to bypass it by using a one shot timer.. Now I am tired of the song that I was using. There may/probably be a better way of doing this, but this will work.

    Modified Code

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

提交回复
热议问题