DirectShow USB веб-камера смена источника видео
Привет всем, я пытаюсь найти настройки, чтобы изменить мой источник видео на "композитный" на моей веб-камере. Похоже, что если я отключу USB, а затем снова подключу его и запуском кода, он просто получит пустой экран. Но как только я меняю источник видео (в другой программе), а затем возвращаюсь и снова запускаю свой код, он появляется.
Поэтому мне нужно что-то, что позволит мне изменить это для того, чтобы это произошло, но в моем собственном приложении, без необходимости запуска другой программы, которая имеет эту функцию для настройки веб-камеры.
Когда я вытаскиваю USB-кабель, затем вставляю его обратно и запускаю исходный код, картинка приложения отображается в черном цвете.
"Другая программа", которую я использую для смены источника видео (кажется, работает для вывода изображения):
После того, как я использую эту "другую программу", я возвращаюсь к исходному коду и запускаю его, и вот что я получаю:
Я использую код C# под названием dot Net Webcam Library отсюда: введите описание ссылки здесь
Кажется, использовать DirectShow из введите описание ссылки здесь
В источнике я заметил, что в нем перечислены различные типы настроек видео (см. Ниже в файле 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();
}
}
1 ответ
Перед запуском графа файлов необходимо получить интерфейс кроссбара. Вы обычно используете ICaptureGraphBuilder2::FindInterface
за это. Это требует дополнительного фильтра и FindInterface
Метод полезен именно по этой причине:
Вспомогательные фильтры. Если устройство захвата использует драйвер модели драйвера Windows (WDM), для графика могут потребоваться определенные фильтры перед фильтром захвата видео WDM, такие как фильтр ТВ-тюнера или фильтр аналоговых видеопереключателей. Если параметр pCategory не равен NULL, этот метод автоматически вставляет все необходимые фильтры WDM в график.
Сделав это, вы будете иметь IAMCrossbar
интерфейс и IAMCrossbar::Route
Метод, как вы переключаете входы.
См. Также: Фильтр поперечины меняет текущий вход на композитный.
Фрагмент кода:
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);