DirectShow USB网络摄像头改变video源

嘿所有我想在我的网络摄像头上找到将我的video源更改为“复合”的设置。 似乎如果我拔下USB然后将其重新插入并启动代码,它就会出现一个空白屏幕。 但是,一旦我更改了video源(在另一个程序中),然后返回并再次运行我的代码,它就会显示出来。

所以我需要一些东西,允许我改变它,以便同样的事情发生,但在我自己的应用程序内,而无需启动另一个具有该function来设置网络摄像头的程序。

当我拔出USB线然后重新插入并运行源代码时,应用程序的图片框为黑色。

在此处输入图像描述

我用来改变video源的“其他程序”(似乎可以调出图像): 在此处输入图像描述

在我使用“其他程序”后,我回到源代码并运行它,这就是我得到的: 在此处输入图像描述

我从这里使用名为dot Net Webcam Library的C#代码:在此处输入链接描述

它似乎使用DirectShow从这里输入链接描述

我在源代码中注意到它列出了不同类型的video设置(在下面的AXExtend.cs中找到):

public enum PhysicalConnectorType { Video_Tuner = 1, Video_Composite, Video_SVideo, Video_RGB, Video_YRYBY, Video_SerialDigital, Video_ParallelDigital, Video_SCSI, Video_AUX, Video_1394, Video_USB, Video_VideoDecoder, Video_VideoEncoder, Video_SCART, Video_Black, Audio_Tuner = 0x1000, Audio_Line, Audio_Mic, Audio_AESDigital, Audio_SPDIFDigital, Audio_SCSI, Audio_AUX, Audio_1394, Audio_USB, Audio_AudioDecoder, } 

但我不确定如何在代码中调用它:

 Device selectedDevice = device as Device; imageCapture.Device = selectedDevice as Device; imageCapture.PerformAutoScale(); imageCapture.Refresh(); imageCapture.Start(); 

所以我猜测“Video_Composite”是我可能需要做的吗?

任何帮助都会很棒!!! 谢谢!

大卫

代码更新

 foreach (Device device in Device.FindDevices()) { if (device.ToString() == "BackupCamera") { Device selectedDevice = device as Device; IGraphBuilder graphBuilder = new FilterGraph() as IGraphBuilder; DsDevice device1 = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)[1]; // <<--- Your Device Guid baseFilterIdentifier = typeof(IBaseFilter).GUID; object videoSourceObject; device1.Mon.BindToObject(null, null, ref baseFilterIdentifier, out videoSourceObject); IBaseFilter videoSourceBaseFilter = videoSourceObject as IBaseFilter; graphBuilder.AddFilter(videoSourceBaseFilter, "Source"); ICaptureGraphBuilder2 captureGraphBuilder = new CaptureGraphBuilder2() as ICaptureGraphBuilder2; captureGraphBuilder.SetFiltergraph(graphBuilder); object crossbarObject; captureGraphBuilder.FindInterface(FindDirection.UpstreamOnly, null, videoSourceBaseFilter, typeof(IAMCrossbar).GUID, out crossbarObject); IAMCrossbar crossbar = crossbarObject as IAMCrossbar; int inputPinCount, outputPinCount; crossbar.get_PinCounts(out inputPinCount, out outputPinCount); // <<-- In/Out Pins // Pin Selection: Physical Input 2 (eg Composite) to Capture Pin 0 crossbar.Route(0, 2); imageCapture.Device = selectedDevice as Device; imageCapture.PerformAutoScale(); imageCapture.Refresh(); imageCapture.Start(); } } 

在运行文件管理器图之前,您需要获取交叉开关接口。 您通常使用ICaptureGraphBuilder2::FindInterface 。 这需要一个额外的filter, FindInterface方法特别适用于这个原因:

支持filter。 如果捕获设备使用Windows驱动程序模型(WDM)驱动程序,则图形可能需要WDMvideo捕获filter上游的某些filter,例如电视调谐器滤波器或模拟video交叉开关filter。 如果pCategory参数不等于NULL,则此方法会自动将任何所需的WDMfilter插入到图形中

完成此操作后,您将拥有IAMCrossbar接口,而IAMCrossbar::Route方法则是您切换输入的方式。

另请参阅: Crossbarfilter将当前输入更改为Composite

代码段:

 IGraphBuilder graphBuilder = new FilterGraph() as IGraphBuilder; DsDevice device = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)[1]; // <<--- Your Device Guid baseFilterIdentifier = typeof(IBaseFilter).GUID; object videoSourceObject; device.Mon.BindToObject(null, null, ref baseFilterIdentifier, out videoSourceObject); IBaseFilter videoSourceBaseFilter = videoSourceObject as IBaseFilter; graphBuilder.AddFilter(videoSourceBaseFilter, "Source"); ICaptureGraphBuilder2 captureGraphBuilder = new CaptureGraphBuilder2() as ICaptureGraphBuilder2; captureGraphBuilder.SetFiltergraph(graphBuilder); object crossbarObject; captureGraphBuilder.FindInterface(FindDirection.UpstreamOnly, null, videoSourceBaseFilter, typeof(IAMCrossbar).GUID, out crossbarObject); IAMCrossbar crossbar = crossbarObject as IAMCrossbar; int inputPinCount, outputPinCount; crossbar.get_PinCounts(out inputPinCount, out outputPinCount); // <<-- In/Out Pins // Pin Selection: Physical Input 2 (eg Composite) to Capture Pin 0 crossbar.Route(0, 2);