Kamera internetowa DirectShow zmieniająca źródło wideo
Hej wszystkim próbuję znaleźć ustawienie, aby zmienić moje źródło wideo na „kompozytowe” na mojej kamerze internetowej. Wygląda na to, że jeśli odłączę USB, a następnie podłączę je ponownie i uruchomię kod, otrzyma tylko pusty ekran. Ale gdy zmienię źródło wideo (w innym programie), a następnie wrócę i ponownie uruchomię kod, pojawi się.
Potrzebuję więc czegoś, co pozwoli mi to zmienić, aby to samo się stało, ale w mojej własnej aplikacji bez konieczności uruchamiania innego programu, który ma tę funkcję, aby ustawić kamerę internetową.
Kiedy wyciągam kabel USB, a następnie wkładam go z powrotem i uruchamiam kod źródłowy, okno obrazka aplikacji jest czarne.
„Inny program” używam do zmiany źródła wideo (które wydaje się działać, aby wywołać obraz):
Po użyciu tego „innego programu” wracam do kodu źródłowego i uruchamiam go.
Używam tutaj kodu C # o nazwie dot Net Webcam Library:wprowadź opis linku tutaj
Wydaje się, że korzysta z DirectShow zwprowadź opis linku tutaj
Zauważyłem w źródle, że wyświetla różne typy ustawień wideo (poniżej w 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,
}
Ale nie jestem pewien, jak to wywołać w kodzie tutaj:
Device selectedDevice = device as Device;
imageCapture.Device = selectedDevice as Device;
imageCapture.PerformAutoScale();
imageCapture.Refresh();
imageCapture.Start();
Zgaduję, że „Video_Composite” jest tym, czego potrzebuję, aby to zrobić?
Każda pomoc byłaby świetna !!! Dzięki!
David
Aktualizacja kodu
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();
}
}