2010-11-26 24 views
6

Tenemos una aplicación de consola simple Win32 de C++. Todo lo que queremos es imprimir la lista de cámaras web y otros dispositivos de captura de video que están disponibles. Queremos usar Windows Apis tanto como sea posible, sin libretas externas, después de todo, todo lo que queremos es imprimir una lista, ¡no volar a la luna! ¿Cómo hacer tal cosa?¿Cómo obtener una lista de dispositivos de captura de video (cámaras web) en Windows? (C++)

Mi propia Reserch: yo encontramos este official msdn sample pero todavía no consiguen la forma de salida de la lista de dispositivos en la pantalla = ((lo siento - Soy nuevo en C++)

... algunos más vital para la investigación ...

En uno de simpliest muestras ms sobre el tema encontraron esta

HRESULT OnInitDialog(HWND hwnd, ChooseDeviceParam *pParam) 
{ 
    HRESULT hr = S_OK; 

    HWND hList = GetDlgItem(hwnd, IDC_DEVICE_LIST); 

    // Display a list of the devices. 

    for (DWORD i = 0; i < pParam->count; i++) 
    { 
     WCHAR *szFriendlyName = NULL; 

     hr = pParam->ppDevices[i]->GetAllocatedString(
      MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, 
      &szFriendlyName, 
      NULL 
      ); 

     if (FAILED(hr)) 
     { 
      break; 
     } 

     int index = ListBox_AddString(hList, szFriendlyName); 

     ListBox_SetItemData(hList, index, i); 

     CoTaskMemFree(szFriendlyName); 
    } 

parece que debería hacer el trabajo pero no conseguir la forma de incluir esto en aplicación simple línea de comandos para que los datos de salida ...


también de esta serie:

Respuesta

7

De los ejemplos que se muestran, copie el siguiente código en dev.c. A continuación, abra la línea de comando con todas las variables SDK establecidas. En el enlace de la línea de comando a ole32.lib y oleaut32.lib. A continuación, le mostrará todos los dispositivos.

cl dev.c Ole32.lib Oleaut32.lib

dev.exe va a dar la lista de la línea de comandos.

#include <windows.h> 
#include <dshow.h> 

#pragma comment(lib, "strmiids") 

HRESULT EnumerateDevices(REFGUID category, IEnumMoniker **ppEnum) 
{ 
    // Create the System Device Enumerator. 
    ICreateDevEnum *pDevEnum; 
    HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, 
     CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum)); 

    if (SUCCEEDED(hr)) 
    { 
     // Create an enumerator for the category. 
     hr = pDevEnum->CreateClassEnumerator(category, ppEnum, 0); 
     if (hr == S_FALSE) 
     { 
      hr = VFW_E_NOT_FOUND; // The category is empty. Treat as an error. 
     } 
     pDevEnum->Release(); 
    } 
    return hr; 
} 


void DisplayDeviceInformation(IEnumMoniker *pEnum) 
{ 
    IMoniker *pMoniker = NULL; 

    while (pEnum->Next(1, &pMoniker, NULL) == S_OK) 
    { 
     IPropertyBag *pPropBag; 
     HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag)); 
     if (FAILED(hr)) 
     { 
      pMoniker->Release(); 
      continue; 
     } 

     VARIANT var; 
     VariantInit(&var); 

     // Get description or friendly name. 
     hr = pPropBag->Read(L"Description", &var, 0); 
     if (FAILED(hr)) 
     { 
      hr = pPropBag->Read(L"FriendlyName", &var, 0); 
     } 
     if (SUCCEEDED(hr)) 
     { 
      printf("%S\n", var.bstrVal); 
      VariantClear(&var); 
     } 

     hr = pPropBag->Write(L"FriendlyName", &var); 

     // WaveInID applies only to audio capture devices. 
     hr = pPropBag->Read(L"WaveInID", &var, 0); 
     if (SUCCEEDED(hr)) 
     { 
      printf("WaveIn ID: %d\n", var.lVal); 
      VariantClear(&var); 
     } 

     hr = pPropBag->Read(L"DevicePath", &var, 0); 
     if (SUCCEEDED(hr)) 
     { 
      // The device path is not intended for display. 
      printf("Device path: %S\n", var.bstrVal); 
      VariantClear(&var); 
     } 

     pPropBag->Release(); 
     pMoniker->Release(); 
    } 
} 

void main() 
{ 
    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); 
    if (SUCCEEDED(hr)) 
    { 
     IEnumMoniker *pEnum; 

     hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum); 
     if (SUCCEEDED(hr)) 
     { 
      DisplayDeviceInformation(pEnum); 
      pEnum->Release(); 
     } 
     hr = EnumerateDevices(CLSID_AudioInputDeviceCategory, &pEnum); 
     if (SUCCEEDED(hr)) 
     { 
      DisplayDeviceInformation(pEnum); 
      pEnum->Release(); 
     } 
     CoUninitialize(); 
    } 
} 
+0

¡trabajo de rejilla! +1! – Rella

1
+0

no usa win32 directamente. No necesito una lib, ¡todo lo que necesito es una lista simple! probablemente algo tan simple como una solicitud ... – Rella

+1

Creo que tienes que usar directshow/vfw porque eso maneja las cámaras - No creo que puedas acceder a las cámaras de directshow con raw win32 –

4

Esta siendo Microsoft, lo que razonablemente podría haber sido algún lugar alrededor de 10 líneas de código, gracias a las maravillas de COM, terminar como a couple hundred lines más o menos.

Cuestiones relacionadas