-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;”但最后一个视频帧仍然存在。显然,我需要更多代码来关闭视频,但我无法在任何地方找到任何样本。
“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
好吧,它显然存在,但取决于互操作导入(例如'Visible'属性),它可能会稍有不同。您可以使用Object Browser来清除它,或者使用[DirectShow.NET](http://directshownet.sourceforge.net/)作为包装器。 – 2015-02-24 18:57:03
好的,我找到了如何清除画框中的最后一帧视频。现在,当用户单击“停止”按钮时,如何将视频的当前位置设置为视频的开头?到目前为止,我有“mc.Stop();”现在我需要将视频重置为开始的代码。 – manicdrummer 2015-02-24 20:02:17