Я разработал приложение для захвата видео на C ++ с Qt на Windows 7, используя библиотеку videoInput (которая использует DirectShow). Мое приложение отлично работает со всеми устройствами, которые я ранее пробовал (некоторые встроенные устройства захвата, веб-камеры, Pinnacle Dazzle DVC 100, Pinnacle Studio Movie Box и даже проблемный USB-гибрид PixelView PlayTV), но теперь я купил AVerMedia DarkCrystal HD Capture Станция (для поддержки захвата HD), и она просто не будет работать.
Согласно веб-сайту AVerMedia, он полностью совместим с DirectShow, и мне даже не нужно использовать его SDK. Я следовал инструкциям производителя по установке и могу снимать видео с помощью собственного программного обеспечения (TotalMedia Studio MV), поэтому я полагаю, что оно работает правильно.
Я попытался запустить свое приложение на основе videoInput, а также AmCap (образец DirectShow от Microsoft), и оба они ведут себя одинаково. Они могут найти устройство, получить его понятное имя, но не более того. AmCap говорит Error 80004002: Cannot find VCapture:IAMStreamConfig
,
Я отлаживал AmCap и узнал ICaptureGraphBuilder2::FindInterface
метод всегда возвращает E_NOINTERFACE
то есть такой интерфейс не поддерживается, в таких строках:
hr = gcap.pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video, gcap.pVCap,
IID_IAMStreamConfig, (void **)&gcap.pVSC);
Вот, gcap.pBuilder
это указатель на ICaptureGraphBuilder2
, gcap.pVCap
это указатель на IBaseFilter
, а также gcap.pVSC
это указатель на IAMStreamConfig
и должен получить возвращаемое значение.
Я предполагаю, что есть какой-то обходной путь, который мог бы помочь мне захватить с этого устройства, так как я мог бы успешно извлечь имя устройства (используя ICreateDevEnum::CreateClassEnumerator
метод, основанный на CLSID_VideoInputDeviceCategory
идентификатор класса).
Устройство захвата видео, которое не реализует IAMStreamConfig
это возможный сценарий, хотя это не что-то ожидаемое. На самом деле это больше похоже на ошибку на видеоустройстве или базовом драйвере, однако вы можете обновить свое приложение, чтобы использовать тип носителя по умолчанию в случае отсутствия IAMStreamConfig
(вы все еще можете использовать GraphEdit для проверки работоспособности устройства).
Других решений пока нет …