如何在DirectShow.Net中访问网络摄像头的电力线补偿和背光补偿

问题描述

我正在尝试编写一个程序,该程序将根据存储的预设来设置网络摄像头设置。我正在使用C#和DirectShow.Net。到目前为止,除上述设置外,我都可以访问所有设置。

要读取设置,我使用以下代码

            DsDevice[] capDevices;

            // Get the collection of video devices
            capDevices = 
                DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);

            // Select first camera
            var dev = capDevices[0];

            int hr;

            IBaseFilter capFilter = null;
            ICaptureGraphBuilder2 capGraph = null;

            // Get the graphbuilder object
            IFiltergraph2 m_Filtergraph = (IFiltergraph2)new Filtergraph();
            try
            {
                // Get the ICaptureGraphBuilder2
                capGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();

                /// Start building the graph
                hr = capGraph.SetFiltergraph(m_Filtergraph);
                DsError.ThrowExceptionForHR(hr);

                // Add the video device
                hr = m_Filtergraph.AddSourceFilterForMoniker(dev.Mon,null,"Video input",out capFilter);
                DsError.ThrowExceptionForHR(hr);

                int value;

                // Reset settings
                cameraSettings.Reset();

                // Get IAMVideoProcAmp Values
                IAMVideoProcAmp pVideoAmp = (IAMVideoProcAmp)capFilter;
                VideoProcAmpFlags vpaFlags;

                pVideoAmp.Get(VideoProcAmpProperty.Brightness,out value,out vpaFlags);

                .....

                // Get IAMCameraControl Values
                IAMCameraControl pCameraControl = (IAMCameraControl)capFilter;
                CameraControlFlags ccFlags;

                pCameraControl.Get(CameraControlProperty.Exposure,out ccFlags);

                .....

但是,两个接口都不允许获取这两个值。我将附上一张屏幕截图,显示在典型Windows界面中可用于网络摄像头设置的那些值:

如何通过DirectShow.Net访问这些值?

解决方法

这些属性页面分别使用IAMVideoProcAmpIAMCameraControl接口与过滤器对象通信。也就是说,IAMVideoProcAmp::SetIAMCameraControl::Set是属性页实现所调用的方法,它们可以类似地由应用程序以编程方式使用。

属性枚举没有为电力线频率和弱光补偿定义值,因为不再更新SDK和文档以指示来自扩展枚举的值,但是确实存在新属性。具体来说,它们存在于股票属性页面的实现中。

命名和记录的属性值可从较低层的SDK定义中获得:

  • KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY = 13
  • KSPROPERTY_CAMERACONTROL_AUTO_EXPOSURE_PRIORITY = 19