2013-07-17 118 views
2

嘿所有我想找到設置來改變我的視頻源到我的攝像頭「複合」。似乎如果我拔掉USB,然後插回來,並啓動代碼,它只是一個空白的屏幕。但是,一旦我改變視頻源(在另一個程序中),然後返回並再次運行我的代碼,它就會顯示出來。DirectShow USB攝像頭改變視頻源

所以我需要的東西,讓我改變,爲了讓發生同樣的事情,但我自己的應用程序中,而無需啓動具有功能設置攝像頭另一個程序。

當我拉出USB電纜,然後把它放回來,我運行源代碼,應用程序的圖片框是黑色的。

enter image description here

的「其他程序」我用它來改變視頻源(這似乎工作,彈出圖像):在我使用的是「其他節目」我回去 enter image description here

源代碼並運行它,這就是我得到那麼: enter image description here

我使用從這裏稱爲點網絡攝像頭庫的C#代碼:enter link description here

似乎使用的DirectShow從enter link description here

我已經在源注意到了,它列出了不同類型的視頻設置(在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 (e.g. Composite) to Capture Pin 0 
     crossbar.Route(0, 2); 

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

什麼是 「ImageCapture中的」 在這裏? – rogerdpack

回答

3

運行文件管理器圖形之前,你需要獲得交叉開關接口。您通常爲此使用ICaptureGraphBuilder2::FindInterface。這需要額外的過濾器,並且FindInterface方法特別有用於這個原因:

支持過濾器。如果捕獲設備使用Windows驅動程序型號(WDM)驅動程序,則圖形可能需要WDM視頻捕獲過濾器上游的某些過濾器,例如電視調諧器過濾器或模擬視頻交叉開關過濾器。如果pCategory參數不等於NULL,則此方法自動將插入圖中的所有必需WDM過濾器。

完成此操作後,您將有IAMCrossbar接口,並且IAMCrossbar::Route方法就是如何切換輸入。

參見:Crossbar filter change current input to 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 (e.g. Composite) to Capture Pin 0 
crossbar.Route(0, 2); 
+0

感謝您的回覆!無論如何,你可以在我自己的項目中顯示代碼來執行此操作嗎? – StealthRT

+0

你在這裏(上面) –

+0

感謝你這樣做,羅馬。我更新了我的OP,以顯示我在哪裏以及如何打電話給我。當我這樣做時,我再次遇到黑屏,必須使用其他程序將其重新顯示在正確的輸入上才能顯示出來。我認爲[1]是正確的,因爲它似乎改變了輸入。我是否在錯誤的地方稱呼它? – StealthRT