如何經過C#開發一個媒體播放器(下)

  接下來,添加播放 / 暫停按鈕的代碼。在代碼窗口中,在中止、暫停菜單中單擊,而後,在方法名稱列表中單擊 Click 。將如下代碼添加到 Visual C# 爲您建立的 Click 事件處理程序中:

  看看下面的代碼是如何實現的:
CleanUp();
m_objFilterGraph = new FilgraphManager();
m_objFilterGraph.RenderFile(openFile
Dialog.FileName);
m_objBasicAudio = m_objFilterGraph as IBasicAudio;
try
{
  m_objVideoWindow = m_objFilterGraph as IVideoWindow;
 
m_objVideoWindow.Owner = (int) panel1.Handle;
 
m_objVideoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN;
 
m_objVideoWindow.SetWindowPosition(panel1.ClientRectangle.Left,
 
panel1.ClientRectangle.Top,
 
panel1.ClientRectangle.Width,
 
panel1.ClientRectangle.Height);
}
catch (Exception ex)
{
 
m_objVideoWindow = null;
}
m_objMediaEvent = m_objFilterGraph as IMediaEvent;
m_objMediaEventEx = m_objFilterGraph as IMediaEventEx;
m_objMediaEventEx.SetNotifyWindow((int) this.Handle, WM_GRAPHNOTIFY, 0);
m_objMediaPosition = m_objFilterGraph as IMediaPosition;
m_objMediaControl = m_objFilterGraph as IMediaControl;

//

如何來播放,暫停,中止
?
簡單這些函數看字面也知道
.
//

m_objMediaControl.Run();//
播放

m_objMediaControl.Pause();//
暫停
m_objMediaControl.Stop();//
中止

//
這段代碼很是簡單。當用戶單擊播放/暫停按鈕時,代碼將檢查 Player playState 屬性。若是 Player 正在播放數字媒體文件,代碼就會暫停文件的播放; 若是 Player 已經暫停或中止,代碼就再次啓動 Player 播放文件。

OK,
在來看咱們是如何控制時間進度的 ?
//

private void timer1_Tick(object sender, System.EventArgs e)
{
 
if (m_CurrentStatus == MediaStatus.Running)
 
{
  
UpdateStatusBar();
 
}
}

  看見上面那個 UpdateStatusBar(); 這裏是讓它沒 100ms 更新一次狀態欄 .
代碼以下 :
private void UpdateStatusBar()
{
 
switch (m_CurrentStatus)
 
{
  
case MediaStatus.None : statusBarPanel1.Text = "Stopped"; break;
  
case MediaStatus.Paused : statusBarPanel1.Text = "Paused "; break;
  
case MediaStatus.Running: statusBarPanel1.Text = "Running"; break;
  
case MediaStatus.Stopped: statusBarPanel1.Text = "Stopped"; break;
 
}
 
if (m_objMediaPosition != null)
 
{
  
int s = (int) m_objMediaPosition.Duration;
  
int h = s / 3600;
  
int m = (s - (h * 3600)) / 60;
  
s = s - (h * 3600 + m * 60);
  
statusBarPanel2.Text = String.Format("{0:D2}:{1:D2}:{2:D2}", h, m, s);
  
s = (int) m_objMediaPosition.CurrentPosition;
  
h = s / 3600;
  
m = (s - (h * 3600)) / 60;
  
s = s - (h * 3600 + m * 60);
  
statusBarPanel3.Text = String.Format("{0:D2}:{1:D2}:{2:D2}", h, m, s);
 
}
 
else
 
{
  
statusBarPanel2.Text = "00:00:00";
  
statusBarPanel3.Text = "00:00:00";
 
}
}

  還有一個問題程序怎麼可以知道它播放完了 ?

  這會有點麻煩了,想一想看有什麼辦法呢?對了, windows 是消息驅動的。那找找看有什麼消息。有的就 EC_COMPLETE 。還記得 "WndProc" 它嗎?是的,個人老朋友,此次咱們必需要改寫它來捕獲 EC_COMPLETE 消息。這個消息是 DirectShow 通知父窗體,播放結束了。
protected override void WndProc(ref Message m)
{
 
if (m.Msg == WM_GRAPHNOTIFY)
 
{
  
int lEventCode;
  
int lParam1, lParam2;
  
while (true)
  
{
   
try
   
{
    
m_objMediaEventEx.GetEvent(out lEventCode,out lParam1,out lParam2,0);
    
m_objMediaEventEx.FreeEventParams(lEventCode, lParam1, lParam2);
    
if (lEventCode == EC_COMPLETE)
    
{
     
m_objMediaControl.Stop();
     
m_objMediaPosition.CurrentPosition = 0;
     
m_CurrentStatus = MediaStatus.Stopped;
     
UpdateStatusBar();
     
UpdateToolBar();
    
}
   
}
   
catch (Exception)
   
{
    
break;
   
}
  
}
 
}
 
base.WndProc(ref m);
}

  只要播放狀態改變,上述代碼就會運行。若是 Player 正在播放(用戶打開文件時就處於播放狀態,由於 autoStart 設置爲 True ),代碼將啓用播放 / 暫停按鈕和中止按鈕,以便用戶執行操做。以後,代碼將播放 / 暫停按鈕的文字更改成 暫停 ,這樣用戶就可使用該按鈕暫停播放過程。最後,代碼檢索當前數字媒體文件的標題,並更新標題標籤的文字以顯示標題。

  若是 Player 被暫停(用戶單擊了播放 / 暫停按鈕),代碼會將播放 / 暫停按鈕的文字更改成 播放 ,以提示用戶使用該按鈕能夠恢復播放。

  若是 Player 被中止(用戶單擊了中止按鈕),代碼將禁用中止按鈕(因 Player 已經中止工做)並將播放 / 暫停按鈕的文字恢復爲默認值 播放

  一切都結束了 , 如今要作的事就是作些來找一部影片來享受一下本身的成果了 .

  編寫完示例項目的代碼以後,您能夠生成並運行解決方案。

   生成解決方案

  在 Build (生成)菜單中單擊 Build Solution (生成解決方案)。 Visual Studio 開始編譯並生成項目。若是鍵入內容所有正確,生成過程將順利完成,不會出現任何錯誤。若是生成報告錯誤,則請檢查您的代碼並糾正錯誤。

  使用示例應用程序

  要在調試器中運行項目,請按 鍵盤 上的 F5 鍵。若是出現 查看生成的代碼 主題中介紹的未處理的異常,則應該中止調試會話,刪除或註釋掉生成代碼中的相應行,而後再按 F5 鍵。

  您能夠單擊 打開 查找 .wma .wmv 文件(究竟選擇何種文件,取決於您在 打開 對話框 中選擇的文件類型)。選擇某個文件並單擊 肯定 以後, 打開 對話框關閉,開始播放數字媒體文件,傳輸控制按鈕的狀態也隨之改變。這時您就能夠利用傳輸控制按鈕來暫停、從新開始或徹底中止播放。
相關文章
相關標籤/搜索