vid_093a single rev_0100 pid_2468 pid_2460 microscope cif chip c170 c++ webcam directshow device-driver wdk

c++ - single - usb vid_093a&pid_2468&rev_0100



Controlador de webcam virtual (2)

Quiero desarrollar un controlador de cámara web virtual que, desde el modo Usuario, le pasaré la imagen y se mostrará como salida de cámara web.

No quiero usar el filtro DirectX y CSourceStream, etc. Porque no funcionan en algunos programas que no usan DirectX para capturar la imagen de la cámara web.

Tengo que escribir un controlador de dispositivo en modo kernel para.

¿Algunas ideas? Probé testcap a partir de muestras de DDK, pero no procesa la imagen desde el modo de usuario y no recibe ninguna entrada, solo muestra 7 colores en la cámara web ...

Cualquier ayuda sería muy apreciada. Gracias

¡Gracias a todos!

Intenté el código desde aquí: http://tmhare.mvps.org/downloads.htm (buscar filtro de fuente de captura)

Funcionó bien cuando lo compilé en Yahoo, MSN, pero se estrelló AIM, Internet Explorer Flash Webcam, Firefox Flash webcam y Skype ... Tuve un error en QueryInterface después de 8 llamadas de tiempo, lo encontré con el rastreo con un muchos trucos ..

Ahora lo sé, se bloquea en la 8ª llamada a HRESULT CVCamStream :: QueryInterface (REFIID riid, void ** ppv)

La octava llamada cuando llega a durar si, quiero decir: return CSourceStream :: QueryInterface (riid, ppv);

Está en la línea 17 de Filters.cpp

¿Por qué crees que me estoy chocando?

Gracias a todos por guiarme a encontrar la solución correcta, que es DirectShow, no el controlador.


Hay varias API de Microsoft que proporcionan acceso a datos de imagen.

  • Twain: se utiliza para la captura de una sola imagen desde escáneres, etc.
  • WIA: Esto parece haberse degenerado en una biblioteca de códecs de una sola imagen.
  • VfW: Una API muy antigua (Win16) que realmente solo funciona con la codificación / decodificación de archivos de video, pero que admite algunas adquisiciones de video.
  • DirectShow: anteriormente formaba parte del SDK de DirectX, actualmente en el SDK de la plataforma. Este es el lugar al que ir para las soluciones de transmisión actuales (generales).
  • Windows Media / Media Foundation: esto parece estar más orientado a la reproducción / recodificación de video.
  • Bibliotecas específicas del fabricante: Pilón / Halcon / Control de imagen / ...

DirectShow específico:

Para crear dispositivos de adquisición de imágenes en Windows, debe proporcionar un dispositivo (controlador) que implemente las interfaces de clase de secuencia (o Avstream más reciente) o escribir un objeto COM de modo de usuario que debe agregarse al enumerador de VideoInputCategory.

La muestra Avstream proporciona todo para un dispositivo de adquisición de imagen real. Sólo falta la capa inferior para el dispositivo real.

Si puede diseñar un dispositivo, debe crearlo compatible con DCAM o UVC. Para ambos hay controladores incorporados suministrados por Windows.

Cómo escribir un dispositivo fuente de software:

Debe crear un filtro DirectShow que proporcione al menos un pin de salida y registrarlo en la categoría VideoInputCategory. Puede haber varias interfaces que ciertas aplicaciones requieren de una aplicación de captura, pero éstas dependen de la aplicación en sí. Las aplicaciones simples para probar los filtros son GraphEdit y AMCap, que se suministran en Plattform SDK.

Algún código:

#include <InitGuid.h> #include <streams.h> const AMOVIESETUP_MEDIATYPE s_VideoPinType = { &MEDIATYPE_Video, // Major type &MEDIATYPE_NULL // Minor type }; const AMOVIESETUP_PIN s_VideoOutputPin = { L"Output", // Pin string name FALSE, // Is it rendered TRUE, // Is it an output FALSE, // Can we have none FALSE, // Can we have many &CLSID_NULL, // Connects to filter NULL, // Connects to pin 1, // Number of types &s_VideoPinType // Pin details }; const AMOVIESETUP_FILTER s_Filter = { &CLSID_MyFilter, // Filter CLSID L"bla", // String name MERIT_DO_NOT_USE, // Filter merit 1, // Number pins &s_VideoOutputPin // Pin details }; REGFILTER2 rf2; rf2.dwVersion = 1; rf2.dwMerit = MERIT_DO_NOT_USE; rf2.cPins = 1; rf2.rgPins = s_Filter.lpPin; HRESULT hr = pFilterMapper->RegisterFilter( CLSID_MyFilter, _FriendlyName.c_str(), 0, &CLSID_VideoInputDeviceCategory, _InstanceID.c_str(), &rf2 ); if( FAILED( hr ) ) { return false; } std::wstring inputCat = GUIDToWString( CLSID_VideoInputDeviceCategory ); std::wstring regPath = L"CLSID//" + inputCat + L"//Instance"; win32_utils::CRegKey hKeyInstancesDir; LONG rval = openKey( HKEY_CLASSES_ROOT, regPath, KEY_WRITE, hKeyInstancesDir ); if( rval == ERROR_SUCCESS ) { win32_utils::CRegKey hKeyInstance; rval = createKey( hKeyInstancesDir, _InstanceID, KEY_WRITE, hKeyInstance ); ....

_InstanceID es un GUID creado para esta entrada de ''dispositivo virtual''.


No puedes decidir cómo llamaría tu conductor a otro programa. La mayoría de los programas usarán DirectShow. Algunos usarían la tecnología win3.x VFW. Muchos programas nuevos, incluidos el escáner de Windows XP y el asistente de cámara, pueden llamarle a través de la interfaz WIA. Si no desea implementar todo eso, necesita al menos proporcionar la interfaz DirectShow a través de WDM y dejar que vfwwdm32.dll le proporcione una interfaz VFW, o escribir su propio controlador VFW.