如何在Windows上获取视频捕获设备(网络摄像头)列表? (C )

前端之家收集整理的这篇文章主要介绍了如何在Windows上获取视频捕获设备(网络摄像头)列表? (C )前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我们有一个简单的C win32控制台应用程序.我们想要的只是打印可用的网络摄像机和其他视频捕获设备列表.我们想尽可能多地使用 windows apis – 毕竟没有外部库 – 我们想要的就是打印一个列表 – 不要飞到月球上!)如何做到这一点?

我自己的研究:
我发现这个official msdn sample但是我仍然没有得到如何将设备列表输出到屏幕=((对不起 – 我是C的新手)

……还有一些研究……

在一篇关于主题的最简单的ms样本中找到了这个

  1. HRESULT OnInitDialog(HWND hwnd,ChooseDeviceParam *pParam)
  2. {
  3. HRESULT hr = S_OK;
  4.  
  5. HWND hList = GetDlgItem(hwnd,IDC_DEVICE_LIST);
  6.  
  7. // Display a list of the devices.
  8.  
  9. for (DWORD i = 0; i < pParam->count; i++)
  10. {
  11. WCHAR *szFriendlyName = NULL;
  12.  
  13. hr = pParam->ppDevices[i]->GetAllocatedString(
  14. MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME,&szFriendlyName,NULL
  15. );
  16.  
  17. if (Failed(hr))
  18. {
  19. break;
  20. }
  21.  
  22. int index = ListBox_AddString(hList,szFriendlyName);
  23.  
  24. ListBox_SetItemData(hList,index,i);
  25.  
  26. CoTaskMemFree(szFriendlyName);
  27. }

看起来它应该做的工作,但我不知道如何将其包含在简单的命令行应用程序中,以便输出数据…

也来自这个系列:

> How to get a list of video capture devices on linux?special details on getting cameras NAMES正确,经过测试的答案
> How to get a list of video capture devices on Mac OS?正确,尚未通过我的答案测试
> How to get a list of video capture devices on windows?正确,经过测试的答案
> How to get a list video capture devices NAMES using Qt (crossplatform)?

显示的示例中,将以下代码复制到dev.c.然后打开包含所有SDK变量集的命令行.在命令行链接到ole32.lib和oleaut32.lib.然后它会显示所有设备.

cl dev.c ole32.lib oleaut32.lib

dev.exe将在命令行中列出该列表.

  1. #include <windows.h>
  2. #include <dshow.h>
  3.  
  4. #pragma comment(lib,"strmiids")
  5.  
  6. HRESULT EnumerateDevices(REFGUID category,IEnumMoniker **ppEnum)
  7. {
  8. // Create the System Device Enumerator.
  9. ICreateDevEnum *pDevEnum;
  10. HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pDevEnum));
  11.  
  12. if (SUCCEEDED(hr))
  13. {
  14. // Create an enumerator for the category.
  15. hr = pDevEnum->CreateClassEnumerator(category,ppEnum,0);
  16. if (hr == S_FALSE)
  17. {
  18. hr = VFW_E_NOT_FOUND; // The category is empty. Treat as an error.
  19. }
  20. pDevEnum->Release();
  21. }
  22. return hr;
  23. }
  24.  
  25.  
  26. void DisplayDeviceInformation(IEnumMoniker *pEnum)
  27. {
  28. IMoniker *pMoniker = NULL;
  29.  
  30. while (pEnum->Next(1,&pMoniker,NULL) == S_OK)
  31. {
  32. IPropertyBag *pPropBag;
  33. HRESULT hr = pMoniker->BindToStorage(0,IID_PPV_ARGS(&pPropBag));
  34. if (Failed(hr))
  35. {
  36. pMoniker->Release();
  37. continue;
  38. }
  39.  
  40. VARIANT var;
  41. VariantInit(&var);
  42.  
  43. // Get description or friendly name.
  44. hr = pPropBag->Read(L"Description",&var,0);
  45. if (Failed(hr))
  46. {
  47. hr = pPropBag->Read(L"FriendlyName",0);
  48. }
  49. if (SUCCEEDED(hr))
  50. {
  51. printf("%S\n",var.bstrVal);
  52. VariantClear(&var);
  53. }
  54.  
  55. hr = pPropBag->Write(L"FriendlyName",&var);
  56.  
  57. // WaveInID applies only to audio capture devices.
  58. hr = pPropBag->Read(L"WaveInID",0);
  59. if (SUCCEEDED(hr))
  60. {
  61. printf("WaveIn ID: %d\n",var.lVal);
  62. VariantClear(&var);
  63. }
  64.  
  65. hr = pPropBag->Read(L"DevicePath",0);
  66. if (SUCCEEDED(hr))
  67. {
  68. // The device path is not intended for display.
  69. printf("Device path: %S\n",var.bstrVal);
  70. VariantClear(&var);
  71. }
  72.  
  73. pPropBag->Release();
  74. pMoniker->Release();
  75. }
  76. }
  77.  
  78. void main()
  79. {
  80. HRESULT hr = CoInitializeEx(NULL,COINIT_MULTITHREADED);
  81. if (SUCCEEDED(hr))
  82. {
  83. IEnumMoniker *pEnum;
  84.  
  85. hr = EnumerateDevices(CLSID_VideoInputDeviceCategory,&pEnum);
  86. if (SUCCEEDED(hr))
  87. {
  88. DisplayDeviceInformation(pEnum);
  89. pEnum->Release();
  90. }
  91. hr = EnumerateDevices(CLSID_AudioInputDeviceCategory,&pEnum);
  92. if (SUCCEEDED(hr))
  93. {
  94. DisplayDeviceInformation(pEnum);
  95. pEnum->Release();
  96. }
  97. CoUninitialize();
  98. }
  99. }

猜你在找的Windows相关文章