2015-02-24 78 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