我如何使用DirectX.Capture C#的视频捕获设备?

时间:2014-04-09 08:30:32

标签: c# .net directx

我是C#的新手。我创建了一个由我的网络摄像头录制的应用程序。但我想创建一个带有摄像头设置的按钮(亮度等)。我下载了这个项目

http://www.codeproject.com/Articles/3566/DirectX-Capture-Class-Library

帮助我,但我很困惑。如果您转到PropertyPages并单击视频捕获设备,您可以更改摄像机的设置。我无法在代码中找到它如何只使用此窗口。我想点击一个按钮并显示设置。

提前谢谢你,我是C#的新手,所以不要破坏我的声誉,我知道我的问题有点困惑,但我很困惑:P!

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

与您的问题相关的该项目的工作流程如下:

  1. 运行应用程序时,会运行updateMenu方法并创建菜单中的项目。

    // Load property pages
        try
        {
            mnuPropertyPages.MenuItems.Clear();
            for (int c = 0; c < capture.PropertyPages.Count; c++)
            {
                p = capture.PropertyPages[c];
                m = new MenuItem(p.Name + "...", new EventHandler(mnuPropertyPages_Click));
                mnuPropertyPages.MenuItems.Add(m);
            }
            mnuPropertyPages.Enabled = (capture.PropertyPages.Count > 0);
        }
        catch { mnuPropertyPages.Enabled = false; }
    
  2. PropertyPages是第一次调用时返回PropertyPageCollection列表的属性,每个项目都会创建一个菜单。要查看如何创建此集合,请查看属性正文。并非过滤器图表中使用的所有过滤器都具有PropertyPages。

  3. PropertyPageCollection班级正在接收过滤器和graphBuilder。在构造函数中调用addFromGraph。此方法为每个过滤器创建DirectShowPropertyPage并将其添加到内部的InnerList列表中 PropertyPageCollection。创建DirectShowPropertyPage的代码位于addIfSupported方法

  4. 要显示属性页面,此菜单事件将挂钩到过滤器属性页面的所有菜单项(请参阅步骤1):

    private void mnuPropertyPages_Click(object sender, System.EventArgs e)
    {
        try
        {
            MenuItem m = sender as MenuItem;
            capture.PropertyPages[m.Index].Show( this );
            updateMenu();
        }
        catch (Exception ex)
        { 
            MessageBox.Show( "Unable display property page. Please submit a bug report.\n\n" + ex.Message + "\n\n" + ex.ToString() );
        }
    }
    
  5. 这个项目正在收集你拥有的所有相机。为了达到您的目的,您可以制作自己的方法并传递视频过滤器(您正在使用的相机),过滤器的名称和属性页的父项(您的主表单)并直接显示属性页。在Capture.cs中添加此方法,添加对using System.Windows.Forms的引用,以防缺少。

    public bool ShowPropertyPage(Control owner )
    {                      
        object filter = null;
        Guid cat = PinCategory.Capture;
    Guid med = MediaType.Interleaved; 
    Guid iid = typeof(IAMStreamConfig).GUID;
    int hr = graphBuilder.FindInterface( 
    ref cat, ref med, videoDeviceFilter, ref iid, out filter );
    if ( hr != 0 )
    {
    med = MediaType.Video ;
    hr = graphBuilder.FindInterface( 
    ref cat, ref med, videoDeviceFilter, ref iid, out filter );
    if ( hr != 0 )
            filter = null;
     }
    
        ISpecifyPropertyPages specifyPropertyPages = null;
        DsCAUUID cauuid = new DsCAUUID();
        bool hasPropertyPage = false;
    
        // Determine if the object supports the interface
        // and has at least 1 property page
        try
        {
            specifyPropertyPages = filter  as ISpecifyPropertyPages;
            if (specifyPropertyPages != null)
            {
                int hr = specifyPropertyPages.GetPages(out cauuid);
                if ((hr != 0) || (cauuid.cElems <= 0))
                    specifyPropertyPages = null;
            }
        }
        finally
        {
            if (cauuid.pElems != IntPtr.Zero)
                Marshal.FreeCoTaskMem(cauuid.pElems);
        }
    
        // Add the page to the internal collection
        if (specifyPropertyPages != null)
        {
            DirectShowPropertyPage p = new DirectShowPropertyPage(videDevice.Name, specifyPropertyPages);
            p.Show(owner);
            hasPropertyPage = true;
        }
        return (hasPropertyPage);
    }
    
  6. 在某些按钮点击事件上调用ShowPropertyPage。您可以通过调用capture.VideoDevice和名称capture.VideoDevice.Name来使用Capture类的实例来获取视频过滤器。当然首先你必须选择相机才能工作,也许你需要做一些其他的检查。

    private void btnShowPropertyPages_Click(object sender, System.EventArgs e)
    {
        try
        {
            if (capture == null)
                throw new ApplicationException("Please select a video and/or audio device.");
            capture.ShowPropertyPage(this);
    
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message + "\n\n" + ex.ToString());
        }
    }