【发布时间】:2015-04-26 09:43:25
【问题描述】:
我正在使用 DirectShow (Quartz.dll) 播放视频的 Visual Studio 中编写 C# 应用程序。我遇到的一个问题是当用户单击停止按钮停止视频播放时让视频回到开头。另一个问题是从 picturbox 控件中清除视频的最后一帧。
这是顶部与 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() 时,如何将视频位置重置为视频的开头?以及如何从图片框控件中清除最后一个视频帧?我试过“pbVideoDisplay.Image = null;”但最后一个视频帧仍然存在。显然我需要更多代码来关闭视频,但我在任何地方都找不到任何示例。
【问题讨论】:
标签: c# video directshow picturebox