问题描述
我正在尝试编写一个程序,该程序将根据存储的预设来设置网络摄像头设置。我正在使用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访问这些值?
解决方法
这些属性页面分别使用IAMVideoProcAmp
和IAMCameraControl
接口与过滤器对象通信。也就是说,IAMVideoProcAmp::Set
和IAMCameraControl::Set
是属性页实现所调用的方法,它们可以类似地由应用程序以编程方式使用。
属性枚举没有为电力线频率和弱光补偿定义值,因为不再更新SDK和文档以指示来自扩展枚举的值,但是确实存在新属性。具体来说,它们存在于股票属性页面的实现中。
命名和记录的属性值可从较低层的SDK定义中获得: