Как я могу изменить, в какой группе и подгруппе появляется push-фильтр DirectShow?
Я использую код для создания push-фильтра C# DirectShow из следующей статьи с открытым исходным кодом, которая создает фильтр под названием VirtualCam:
http://www.codeproject.com/Articles/437617/DirectShow-Virtual-Video-Capture-Source-Filter-in
Утилита GraphEdit может найти его и показать в группе источников видеозахвата с именем CSharp Virtual Camera, и я могу построить график фильтра с ним, и он работает нормально. Скайп тоже может его найти. Однако все остальные программы, с которыми я хочу использовать его, не могут найти его, потому что он не отображается в вызове перечисления устройств при использовании VideoInputSource в качестве основной группы. Я считаю, что это идентификатор класса для этой группы:
/// <summary> CLSID_VideoInputDeviceCategory, video capture category </summary>
public static readonly Guid VideoInputDevice = new Guid(0x860BB310, 0x5D01, 0x11d0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86);
Я получил этот идентификатор класса из утилиты с открытым исходным кодом, которая сканирует устройства ввода видео. Это одно из приложений, которое не может найти фильтр VirtualCam. Эти приложения могут только найти устройства, такие как моя веб-камера (другими словами, VirtualCam не отображается в списке доступных устройств).
Что мне нужно сделать с исходным кодом VirtualCam, чтобы он объявлял / регистрировал себя как устройство ввода видео и отображался при сканировании перечисления устройств в категории VideoInputDevice, чтобы большинство программ могло его видеть и использовать?
ОБНОВЛЕНИЕ: После более тщательной проверки в GraphEdit основное различие, которое я вижу между фильтром VirtualCam, который не может быть найден большинством приложений, и устройствами захвата видео, которые могут быть обнаружены, состоит в том, что фильтр VirtualCam не имеет определенных пинов, в то время как другое видео устройства захвата делают. Если это проблема, как мне правильно определить вывод, который позволит обнаруживать VirtualCam и будет правильно работать для обслуживания объявленного интерфейса?
1 ответ
Подгруппы нет, и эта группа называется "категория". Фильтры зарегистрированы по категориям. Категория вашего интереса здесь CLSID_VideoInputDeviceCategory
также известный как "Источники видеозахвата".
С точки зрения регистрации, единственная проблема, о которой я могу думать, это битность 32/64. Фильтры, зарегистрированные как 32-битные фильтры, не видны для 64-битных приложений и наоборот. Это может быть сложно, потому что ваш проект на C#, и вы можете его построить для AnyCPU
однако в любом случае вы можете использовать 32- и 64-битный GraphEdit (или, точнее, GraphStudioNext), чтобы убедиться, что ваш фильтр находится в списке. Наличие в списке фильтров гарантирует, что шаг регистрации пройден.
Оттуда до реализации приложения, чтобы показать или не показать конкретный источник видео. Некоторые приложения показывают каждый зарегистрированный источник, другие, например, Skype пытаются создать экземпляр источника и выполнить некоторую первоначальную проверку. Если им не нравится источник, он удаляется из списка вариантов.
Требования к реализации для источника видео не определены четко, но большинство приложений ожидают получить фильтр, совместимый с WDM Video Capture Filter
, Лучшие приложения принимают источник видео, если образец SDK AmCap может его предварительно просмотреть, в худших реализациях существуют другие предположения.
В общем, источник видео ДОЛЖЕН реализовывать IBaseFilter
в классе фильтра и IPin
, IAMStreamConfig
интерфейсы в контактах. ДОЛЖЕН реализовывать IQualityControl
а также IKsPropertySet
в кеглях тоже. Также было бы хорошо реализовать ISpecifyPropertyPages
поскольку плохие реализации также могут ожидать этого там (даже если никакие страницы не приложены).