2015-02-24 79 views
-1

我在使用DirectShow(Quartz.dll)播放視頻的Visual Studio中編寫C#應用程序。我遇到的一個問題是當用戶單擊停止按鈕停止視頻播放時,將視頻恢復到開始位置。另一個問題是從picturbox控件清除視頻的最後一幀。C#如何在視頻關閉時清除視頻控件中的視頻,並在視頻播放停止時重置視頻播放位置以啓動?

這裏是在涉及到QuartzTypeLib頂部代碼:

public partial class frmMain : Form 
{ 
    public const int WS_CHILD = 0x40000000; 
    public const int WS_CLIPCHILDREN = 0x2000000; 
    public QuartzTypeLib.IMediaControl mc; 
    public QuartzTypeLib.IVideoWindow videoWindow = null; 

下面是打開一個文件,其中包括代碼以創建FileGraphManager的實例代碼:

private void openMediaToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     // Open a media file. 
     OpenFileDialog ofd = new OpenFileDialog(); 
     ofd.Filter = "Video Files|*.mpg;*.avi;*;*.wmv;*.mov|Audio Files|*.mp3;*.wav;*.wma"; 
     ofd.FilterIndex = 1; 
     if (DialogResult.OK == ofd.ShowDialog()) 
     { 
      // Stop the playback for the current video if one is currently playing. 
      if (mc != null) 
       mc.Stop(); 
      if (pbVideoDisplay.Image != null) 
       pbVideoDisplay.Image = null; 
      // Load the movie file. 
      FilgraphManager graphManager = new FilgraphManager(); 
      graphManager.RenderFile(ofd.FileName); 
      mc = (IMediaControl)graphManager; 

      // Send the video to the picture box control pbVideoDisplay) on frmMain. 
      try 
      { 
       videoWindow = (IVideoWindow)graphManager; 
       videoWindow.Owner = (int)pbVideoDisplay.Handle; 
       videoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN; 
       videoWindow.SetWindowPosition(
       pbVideoDisplay.ClientRectangle.Left, 
       pbVideoDisplay.ClientRectangle.Top, 
       pbVideoDisplay.ClientRectangle.Width, 
       pbVideoDisplay.ClientRectangle.Height); 
      } 
      catch 
      { 

      } 
     } 
    } 

下面的代碼關閉媒體:

private void closeMediaToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     mc.Stop(); 
    } 

這裏是停止視頻的代碼回放:

private void tsbtnStop_Click(object sender, EventArgs e) 
    { 
     mc.Stop(); 
    } 

mc.Stop()將停止在視頻的當前位置的視頻,就像mc.Pause()函數。如何在調用mc.Stop()時將視頻位置重置到視頻的開頭?我怎樣才能從picturebox控件中清除最後一個視頻幀?我試過「pbVideoDisplay.Image = null;」但最後一個視頻幀仍然存在。顯然,我需要更多代碼來關閉視頻,但我無法在任何地方找到任何樣本。

回答

0
+0

「videoWindow.put_Visible」給我此:「錯誤1 QuartzTypeLib.IVideoWindow」不包含一個定義‘put_Visible’和沒有擴展方法‘put_Visible’接受型的第一參數‘QuartzTypeLib.IVideoWindow’可以是找到。」 「(mc as IMediaPosition).put_CurrentPosition」給了我這個:「錯誤1'QuartzTypeLib.IMediaPosition'不包含'put_CurrentPosition'的定義,並且不接受'QuartzTypeLib.IMediaPosition'類型的第一個參數的擴展方法'put_CurrentPosition'可能是找到。」 – manicdrummer 2015-02-24 18:07:27

+0

好吧,它顯然存在,但取決於互操作導入(例如'Visible'屬性),它可能會稍有不同。您可以使用Object Browser來清除它,或者使用[DirectShow.NET](http://directshownet.sourceforge.net/)作爲包裝器。 – 2015-02-24 18:57:03

+0

好的,我找到了如何清除畫框中的最後一幀視頻。現在,當用戶單擊「停止」按鈕時,如何將視頻的當前位置設置爲視頻的開頭?到目前爲止,我有「mc.Stop();」現在我需要將視頻重置爲開始的代碼。 – manicdrummer 2015-02-24 20:02:17