C# 如何访问网络摄像头';DirectShow.Net中的s电源线补偿和背光补偿设置

C# 如何访问网络摄像头';DirectShow.Net中的s电源线补偿和背光补偿设置,c#,video,webcam,video-capture,directshow.net,C#,Video,Webcam,Video Capture,Directshow.net,我试图写一个程序,将设置网络摄像头设置根据存储的预设。我正在使用C#和DirectShow.Net。到目前为止,我能够访问所有的设置 要读取设置,我使用以下代码: DsDevice[] capDevices; // Get the collection of video devices capDevices = DsDevice.GetDevicesOfCat(FilterCategory

我试图写一个程序,将设置网络摄像头设置根据存储的预设。我正在使用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 value, out ccFlags);

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


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

这些属性页分别使用
IAMVideoProcAmp
IAMCameraControl
接口与筛选器对象通信。也就是说,和是属性页实现调用的方法,它们同样可以由应用程序以编程方式使用

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

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

  • KSPROPERTY\u VIDEOPROCAMP\u POWERLINE\u频率
  • KSPROPERTY\u CAMERACONTROL\u AUTO\u EXPOSURE\u PRIORITY

对于第一个,您可能应该扩展标准枚举(电力线频率的值为13),第二个类似于曝光属性的自动/手动标志,即
IAMCameraControl::Set(曝光,…,自动)
@romar。谢谢,13的值确实有效,但是对于自动/手动标志,我不明白你的意思。自动/手动曝光标志是曝光的标志。我尝试并确认,当我设置/取消设置它时,它会在“属性”窗口中更改。所以这不是低光补偿的值。顺便说一句,你怎么知道电力线频率是13?我在哪里可以读到它?哦,是的,它可能给我19个“自动曝光”,对应于低光补偿,而不是值为4的原始曝光属性。我在Windows10SDK的底层查看了这些数字。它们没有针对DirectShow API进行文档记录,显然也没有通过DirectShow.NET为您转发。另一种查找它们的方法是挂接
iamdevideoprocamp
IAMCameraControl
接口,并检查属性页读取和写入这些值的具体操作。@RomanR。谢谢,我自己做了实验,发现19个是低光补偿,是的。草率的18和9也意味着什么,因为它们似乎也是一些未记录的值。您可以使用的MagnumDB找到其他值: