DirectShow USB网络摄像头更改视频源 [英] DirectShow USB webcam changing video source

查看:215
本文介绍了DirectShow USB网络摄像头更改视频源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我正在尝试查找设置以将网络摄像头上的视频源更改为复合。看来,如果我拔下USB,然后将其重新插入并启动代码,它只会出现空白屏幕。但是一旦我更改了视频源(在另一个程序中),然后再次运行我的代码,它就会显示出来。



所以我需要一些可以让我更改该设置,以使发生同样的事情,但是在我自己的应用程序中,而不必启动另一个具有该功能的程序来设置网络摄像头。



当我拔下USB时电缆,然后放回去,然后运行源代码,应用程序的图片框为黑色。





我用来更改视频源的其他程序(似乎可以调出视频源图片):



使用其他程序后,我返回源代码并运行它,这就是我得到的:



我正在使用C#编码在此处称为dot Net Webcam Library:在此处输入链接描述



似乎使用了在此处输入链接描述的DirectShow



我在来源中注意到它列出了不同类型的视频设置(可在下面的AXExtend.cs中找到):

 公共枚举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_S PDIFDigital,
Audio_SCSI,
Audio_AUX,
Audio_1394,
Audio_USB,
Audio_AudioDecoder,
}

但是我不确定如何在此处的代码中调用它:

  Device selectedDevice =设备作为设备; 
imageCapture.Device = selectedDevice作为设备;
imageCapture.PerformAutoScale();
imageCapture.Refresh();
imageCapture.Start();

所以我猜想我可能需要 Video_Composite? / p>

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



David



代码更新

  foreach(Device.FindDevices()中的设备设备)
{
if(device.ToString()== BackupCamera)
{
Device selectedDevice =设备作为设备;
IGraphBuilder graphBuilder = new FilterGraph()作为IGraphBuilder;
DsDevice device1 = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)[1]; //<< ---您的设备
Guid baseFilterIdentifier = typeof(IBaseFilter).GUID;
object videoSourceObject;
device1.Mon.BindToObject(null,null,ref baseFilterIdentifier,out videoSourceObject);
IBaseFilter videoSourceBaseFilter = videoSourceObject作为IBaseFilter;
graphBuilder.AddFilter(videoSourceBaseFilter, Source);
ICaptureGraphBuilder2 captureGraphBuilder = new CaptureGraphBuilder2()作为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); //<<-输入/输出引脚
//引脚选择:物理输入2(例如Composite)以捕获引脚0
crossbar.Route(0,2);

imageCapture.Device = selectedDevice作为Device;
imageCapture.PerformAutoScale();
imageCapture.Refresh();
imageCapture.Start();
}
}


解决方案

之前运行文件管理器图,您需要获取crossbar接口。您通常为此使用 ICaptureGraphBuilder2 :: FindInterface 。这就需要一个附加的过滤器,并且 FindInterface 方法特别有用,因为这个原因:


支持的过滤器。如果捕获设备使用Windows驱动程序模型(WDM)驱动程序,则该图形可能需要WDM Video Capture过滤器上游的某些过滤器,例如TV Tuner过滤器或Analog Video Crossbar过滤器。如果pCategory参数不等于NULL,则此方法会自动将所有必需的WDM过滤器插入到图形中


完成此操作后,您将具有 IAMCrossbar 界面和 IAMCrossbar :: Route 方法是切换输入的方式。



另请参见: Crossbar滤波器将当前输入更改为Composite



代码段:

  IGraphBuilder graphBuilder = new FilterGraph()作为IGraphBuilder; 
DsDevice设备= DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)[1]; //<< ---您的设备
Guid baseFilterIdentifier = typeof(IBaseFilter).GUID;
object videoSourceObject;
device.Mon.BindToObject(null,null,ref baseFilterIdentifier,out videoSourceObject);
IBaseFilter videoSourceBaseFilter = videoSourceObject作为IBaseFilter;
graphBuilder.AddFilter(videoSourceBaseFilter, Source);
ICaptureGraphBuilder2 captureGraphBuilder = new CaptureGraphBuilder2()作为ICaptureGraphBuilder2;
captureGraphBuilder.SetFiltergraph(graphBuilder);
object crossbarObject;
captureGraphBuilder.FindInterface(FindDirection.UpstreamOnly,null,videoSourceBaseFilter,typeof(IAMCrossbar).GUID,out crossbarObject);
IAMCrossbar crossbar = crossbarObject为IAMCrossbar;
int inputPinCount,outputPinCount;
crossbar.get_PinCounts(out inputPinCount,out outputPinCount); //<<-输入/输出引脚
//引脚选择:物理输入2(例如Composite)以捕获引脚0
crossbar.Route(0,2);


Hey all i am trying to find the setting to change my video source to "composite" on my webcam. Seems that if i unplug the USB and then plug it back in and fire up the code, its just got a blank screen. But once i change the video source (in another program) and then go back and run my code again, it shows up.

So i need something that will allow me to change that in order for that same thing to happen but within my own app without having to start another program that has that feature to set the webcam.

When i pull the USB cable out then put it back in and i run the source code, the app's picturebox is Black.

The "other program" i use to change the video source (that seems to work to bring up the image):

After i use that "other program" i go back to the source code and run it and this is what i get then:

I am using the C# code called dot Net Webcam Library from here: enter link description here

It seems to use the DirectShow from enter link description here

I have noticed in the source for that it lists different types of video settings (found below in the 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,
}

But i am unsure of how to call that up in the code here:

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

So i am guessing that the "Video_Composite" is what i may need in order to do that?

Any help would be great!!! Thanks!

David

Code update

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 (e.g. Composite) to Capture Pin 0 
        crossbar.Route(0, 2);

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

解决方案

Before running the filer graph, you need to obtain the crossbar interface. You typically use ICaptureGraphBuilder2::FindInterface for this. This requires an additional filter and the FindInterface method is useful specifically for this reason:

Supporting Filters. If a capture device uses a Windows Driver Model (WDM) driver, the graph may require certain filters upstream from the WDM Video Capture filter, such as a TV Tuner filter or an Analog Video Crossbar filter. If the pCategory parameter does not equal NULL, this method automatically inserts any required WDM filters into the graph.

Having this done, you will have IAMCrossbar interface, and IAMCrossbar::Route method is how you switch the inputs.

See also: Crossbar filter change current input to Composite

Code snippet:

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 (e.g. Composite) to Capture Pin 0 
crossbar.Route(0, 2);

这篇关于DirectShow USB网络摄像头更改视频源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆