none
axWindowsMediaPlayer的currentPlaylist更新播放的問題 RRS feed

  • 問題

  • 各位前輩好, 
    我在button_Click裡加入以下程式來播放A.mpg:
    private void btnMediaPlayer_Click(object sender, EventArgs e)
    {
    	this.axWindowsMediaPlayer1.currentPlaylist.clear();
    	this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia("A.mpg"));
    	axWindowsMediaPlayer1.settings.setMode("loop", true);
    	axWindowsMediaPlayer1.Ctlcontrols.play();
    }
    

    以上是正常會一直循環播放A.mpg,
    接著我在axWindowsMediaPlayer1_PlayStateChange加入一樣的程式只是換個影片:
    private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
    {
    	if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
    	{
    		this.axWindowsMediaPlayer1.currentPlaylist.clear();
    		this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia("B.mpg"));
    		axWindowsMediaPlayer1.settings.setMode("loop", true);
    		axWindowsMediaPlayer1.Ctlcontrols.play();
    	}
    }
    

    但是在A.mpg播完後 axWindowsMediaPlayer1 卻沒有播放B.mpg, 而且 axWindowsMediaPlayer1 回到停止播放的狀態,
    另外我發現若是在 axWindowsMediaPlayer1_PlayStateChange 中加入兩個影片的話:
    private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
    {
    	if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
    	{
    		this.axWindowsMediaPlayer1.currentPlaylist.clear();
    		this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia("B.mpg"));
    		this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia("C.mpg"));
    		axWindowsMediaPlayer1.settings.setMode("loop", true);
    		axWindowsMediaPlayer1.Ctlcontrols.play();
    	}
    }
    

    在A.mpg播完後就可以接著播新的,
    請問為什麼加入一個影片時, axWindowsMediaPlayer1在播完A.mpg後就會變成停止播放的狀態呢? 先謝謝大家!




    • 已編輯 weilin_ 2011年12月28日 上午 04:15
    2011年12月28日 上午 04:08

解答

  • 發現不能在事件裡面做play,所以可加個timer來處理!
    預設timer enabled是false,要play時,才啟動! 如下!
    private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
    {
        if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
        {
            this.axWindowsMediaPlayer1.currentPlaylist.clear();
            this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia(@"f:\b.wmv"));
            axWindowsMediaPlayer1.settings.setMode("loop", true);
            timer1.Enabled = true;
        }
    }
    
    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Enabled = false;
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }
    


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已標示為解答 weilin_ 2011年12月28日 上午 05:38
    2011年12月28日 上午 05:30

所有回覆

  • 如果一開始就設2個了呢?
    private void btnMediaPlayer_Click(object sender, EventArgs e)
    {
        this.axWindowsMediaPlayer1.currentPlaylist.clear();
        this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia("A.mpg"));
        this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia("b.mpg"));
        axWindowsMediaPlayer1.settings.setMode("loop", true);
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }

    或是,有試著先加入axWindowsMediaPlayer1.Ctlcontrols.stop();嗎?
    private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
    {
        if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
        {
            axWindowsMediaPlayer1.Ctlcontrols.stop();
           
            this.axWindowsMediaPlayer1.currentPlaylist.clear();
            this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia("B.mpg"));
            axWindowsMediaPlayer1.settings.setMode("loop", true);
            axWindowsMediaPlayer1.Ctlcontrols.play();
        }
    }
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年12月28日 上午 04:44
  • 檢查看看是不是條件用錯

    if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)

     

    [WMPPlayState enumeration]

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年12月28日 上午 04:45
    版主
  • 如果一開始就設2個了呢?
    private void btnMediaPlayer_Click(object sender, EventArgs e)
    {
        this.axWindowsMediaPlayer1.currentPlaylist.clear();
        this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia("A.mpg"));
        this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia("b.mpg"));
        axWindowsMediaPlayer1.settings.setMode("loop", true);
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }

    或是,有試著先加入axWindowsMediaPlayer1.Ctlcontrols.stop();嗎?
    private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
    {
        if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
        {
            axWindowsMediaPlayer1.Ctlcontrols.stop();
           
            this.axWindowsMediaPlayer1.currentPlaylist.clear();
            this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia("B.mpg"));
            axWindowsMediaPlayer1.settings.setMode("loop", true);
            axWindowsMediaPlayer1.Ctlcontrols.play();
        }
    }
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    先謝謝亂馬客大大的回覆!

    1. 剛剛試了一開始放兩個的話也是不行的; 而且影片數量是要給使用者決定的, 所以也很難說可以設幾個, 只是測試中發現了在這樣的情況(n -> 1)下會產生的問題.

    2. 我加了axWindowsMediaPlayer1.Ctlcontrols.stop(); 也是不行說@@


    • 已編輯 weilin_ 2011年12月28日 上午 05:04
    2011年12月28日 上午 04:53
  • 檢查看看是不是條件用錯

    if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)

     

    [WMPPlayState enumeration]

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    先謝謝Bill大大的回覆!

    因為我是希望能在影片播完的時候更新播放清單, 所以之前有試了兩種:

    1. playState == WMPLib.WMPPlayState.wmppsStopped

    2. playState == WMPLib.WMPPlayState.wmppsMediaEnded

    幾個狀態只有在2. wmppsMediaEnded 的時候,

    能讓影片在播完的時候自動進入該事件,

    如果用1. wmppsStopped 的話, 我測試的結果是要點控制面板的 Stop 才會進入事件,

    因為我更新兩個以上的影片就沒問題, 發現是更新一個才會有停止播放的問題@@

    2011年12月28日 上午 05:02
  • 發現不能在事件裡面做play,所以可加個timer來處理!
    預設timer enabled是false,要play時,才啟動! 如下!
    private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
    {
        if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
        {
            this.axWindowsMediaPlayer1.currentPlaylist.clear();
            this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia(@"f:\b.wmv"));
            axWindowsMediaPlayer1.settings.setMode("loop", true);
            timer1.Enabled = true;
        }
    }
    
    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Enabled = false;
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }
    


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已標示為解答 weilin_ 2011年12月28日 上午 05:38
    2011年12月28日 上午 05:30
  • 發現不能在事件裡面做play,所以可加個timer來處理!
    預設timer enabled是false,要play時,才啟動! 如下!
    private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
    {
        if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
        {
            this.axWindowsMediaPlayer1.currentPlaylist.clear();
            this.axWindowsMediaPlayer1.currentPlaylist.appendItem(this.axWindowsMediaPlayer1.newMedia(@"f:\b.wmv"));
            axWindowsMediaPlayer1.settings.setMode("loop", true);
            timer1.Enabled = true;
        }
    }
    
    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Enabled = false;
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }
    


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    謝謝亂馬客大大的回覆! 按照你提供的timer方法就可以了! 

    可是為什麼加了兩個影片就可以play(), 一個就不行呢? 



    • 已編輯 weilin_ 2011年12月28日 上午 05:38
    2011年12月28日 上午 05:34
  • 因為我發現,如果重新設定playlist等都會一直引發PlayStateChange(你可以check一下),不知是不是有什麼影響,所以才想說,要play時,再用個開關來處理吧!
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年12月28日 上午 05:40