【问题标题】:C# How do I clear out video from picturebox control when video is closed and reset video playback position to start when video playback is stopped?C#如何在视频关闭时从picturebox控件中清除视频并在视频播放停止时重置视频播放位置以开始?
【发布时间】: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


    【解决方案1】:

    【讨论】:

    • "videoWindow.put_Visible" 给了我这个:“错误 1 ​​QuartzTypeLib.IVideoWindow”不包含“put_Visible”的定义,并且没有扩展方法“put_Visible”接受类型为“QuartzTypeLib.IVideoWindow”的第一个参数’可以找到。” “(mc as IMediaPosition).put_CurrentPosition”给了我这个:“错误1'QuartzTypeLib.IMediaPosition'不包含'put_CurrentPosition'的定义,并且没有扩展方法'put_CurrentPosition'接受'QuartzTypeLib.IMediaPosition'类型的第一个参数找到了。”
    • 嗯,它显然存在,但根据互操作导入(例如Visible 属性)可能会略有不同。您可以使用对象浏览器来清除它,或者使用DirectShow.NET 作为您的包装器。
    • 好的,我发现了如何从图片框中清除最后一个视频帧。现在,当用户单击停止按钮时,如何将视频的当前位置设置为视频的开头?到目前为止,我有“mc.Stop();”现在我需要将视频重置为开头的代码。
    【解决方案2】:

    您需要添加 StopWhenReady() 方法并设置属性 CurrentPosition = 0。以下过程:

    private void tsbtnStop_Click(object sender, EventArgs e)
    {
        mc.Stop();
        mc.StopWhenReady();
       
        IMediaPosition mcPos;
        mcPos = (IMediaPosition)mc;
        mcPos.CurrentPosition = 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-12-19
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多