1. #include "windows.h"
  2. #include "TCHAR.h"
  3. #include <dshow.h>
  4. #include <vector>
  5. #include <iostream>
  6. #include <cwctype>
  7.  
  8. #define MAX_FRIENDLY_NAME_LENGTH 128
  9. #define MAX_MONIKER_NAME_LENGTH 256
  10.  
  11. typedef struct _TDeviceName
  12. {
  13. WCHAR FriendlyName[MAX_FRIENDLY_NAME_LENGTH]; // 设备友好名
  14. WCHAR MonikerName[MAX_MONIKER_NAME_LENGTH]; // 设备Moniker名
  15. } TDeviceName;
  16.  
  17. int _tmain(int argc, _TCHAR* argv[])
  18. {
  19. TDeviceName name;
  20. HRESULT hr;
  21.  
  22. // 初始化
  23. std::vector<TDeviceName> vectorDevices;
  24. vectorDevices.clear();
  25.  
  26. // 初始化COM
  27. hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
  28. if (FAILED(hr))
  29. {
  30. return hr;
  31. }
  32.  
  33. // 创建系统设备枚举器实例
  34. ICreateDevEnum *pSysDevEnum = NULL;
  35. hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void **)&pSysDevEnum);
  36. if (FAILED(hr))
  37. {
  38. CoUninitialize();
  39. return hr;
  40. }
  41.  
  42. // 获取设备类枚举器
  43. IEnumMoniker *pEnumCat = NULL;
  44. hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);
  45. if (hr == S_OK)
  46. {
  47. // 枚举设备名称
  48. IMoniker *pMoniker = NULL;
  49. ULONG cFetched;
  50. while (pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
  51. {
  52. IPropertyBag *pPropBag;
  53. hr = pMoniker->BindToStorage(NULL, NULL, IID_IPropertyBag, (void **)&pPropBag);
  54. if (SUCCEEDED(hr))
  55. {
  56. // 获取设备友好名
  57. VARIANT varName;
  58. VariantInit(&varName);
  59. hr = pPropBag->Read(L"FriendlyName", &varName, NULL);
  60. if (SUCCEEDED(hr))
  61. {
  62. StringCchCopy(name.FriendlyName, MAX_FRIENDLY_NAME_LENGTH, varName.bstrVal);
  63. std::wcout << name.FriendlyName << std::endl;
  64. // 获取设备Moniker名
  65. LPOLESTR pOleDisplayName = reinterpret_cast<LPOLESTR>(CoTaskMemAlloc(MAX_MONIKER_NAME_LENGTH * 2));
  66. if (pOleDisplayName != NULL)
  67. {
  68. hr = pMoniker->GetDisplayName(NULL, NULL, &pOleDisplayName);
  69. if (SUCCEEDED(hr))
  70. {
  71. StringCchCopy(name.MonikerName, MAX_MONIKER_NAME_LENGTH, pOleDisplayName);
  72. vectorDevices.push_back(name);
  73. }
  74. CoTaskMemFree(pOleDisplayName);
  75. }
  76. }
  77. VariantClear(&varName);
  78. pPropBag->Release();
  79. }
  80. pMoniker->Release();
  81. } // End for While
  82. pEnumCat->Release();
  83. }
  84. pSysDevEnum->Release();
  85. CoUninitialize();
  86. }

DirectShow控制台输出和保存视频设备名称的更多相关文章

  1. Eclipse将控制台输出信息保存为文件

    当你在Eclipse中 running/debugging一个应用程序的时候,有关该应用程序的运行调试信息及日志信息都会输出到控制台(console )显示,但是Eclipse只会显示最后一部分的日志 ...

  2. python将控制台输出保存至文件

    很多时候在Linux系统下运行python程序时,控制台会输出一些有用的信息.为了方便保存这些信息,有时需要对这些信息进行保存.这里介绍几种将控制台输出保存到文件中的方式:1 重定向标准输出流重定向标 ...

  3. Directshow 判断音视频设备是否被占用<转>

    直接上代码吧: 代码是参考网上大神分享的,在原基础上做了些修改(只检测视频设备): int DeviceIsBusy(char *videoName) { //输入设备的音视频名称 HRESULT h ...

  4. Java:Java控制台输出保存进文件

    前言 实现在控制台输出.并且把输出保存进文件 实现 您要在两个流中写入数据,请尝试使用OutputStream中的TeeOutputStream对象. 一.在maven的pom文件中引入jar包. & ...

  5. opencv入门系列教学(二)图像入门:读取、展示并保存视频

    一.从相机读取视频 通常情况下,我们必须用摄像机捕捉实时画面.让我们从摄像头捕捉一段视频(我使用的是我笔记本电脑内置的网络摄像头) ,将其转换成灰度视频并显示出来.        要捕获视频,我们需要 ...

  6. Linux 视频设备驱动V4L2最常用的控制命令

    http://blog.csdn.net/shaolyh/article/details/6583226 Linux 视频设备驱动V4L2最常用的控制命令使用说明(1.02) 命令 功能 VIDIOC ...

  7. 理解 QEMU/KVM 和 Ceph(3):存储卷挂接和设备名称

    本系列文章会总结 QEMU/KVM 和 Ceph 之间的整合: (1)QEMU-KVM 和 Ceph RBD 的 缓存机制总结 (2)QEMU 的 RBD 块驱动(block driver) (3)存 ...

  8. ubuntu修改设备名称

    按住ctrl+alt+t打开终端 输入 sudo gedit /etc/hostname 出现一个打开的文件,显示的就是你的设备名字,也就是终端@的那个名字.将其修改成你想显示的名字,保存重启系统就可 ...

  9. 前端不为人知的一面--前端冷知识集锦 前端已经被玩儿坏了!像console.log()可以向控制台输出图片

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

随机推荐

  1. bootstrapValidator关于verbose需要优化的地方

    开发中需要用到bootstrapValidator的配置verbose:false,达到当前验证不通过不往下在验证的效果 问题: 当前字段需要remote验证时,此配置无效,原因在于remote是异步 ...

  2. Selenium2+python自动化55-unittest之装饰器(@classmethod)【转载】

    前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不是可以 ...

  3. docker从零开始网络(六)Macvlan

    使用Macvlan网络 某些应用程序,尤其是遗留应用程序或监视网络流量的应用程序,希望直接连接到物理网络.在这种情况下,您可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配MAC地址,使其 ...

  4. HDU 2045 LELE的RPG难题(递推)

    不容易系列之(3)—— LELE的RPG难题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  5. Windows 环境下 Redis 安装

    1.redis官方下载地址:https://redis.io/download,redis 64位下载地址:https://github.com/MicrosoftArchive/redis/rele ...

  6. 安全管道工具SSF

    安全管道工具SSF   SSF(Secure Socket Funneling)是一款安全网络通信工具.它可以将多个管道的数据通过一个TLS连接转发给远程计算机,从而实现数据的安全传输.它不仅支持TC ...

  7. [BZOJ 1143] 祭祀river

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1143 Solution: 一道最长反链的模板题 由Dilworth定理可知:最小链覆盖数 ...

  8. AtCoder - 2568 Lotus Leaves

    Problem Statement There is a pond with a rectangular shape. The pond is divided into a grid with H r ...

  9. [Android]Android 布局中如何让图片和文字居中显示?

    图片文字居中显示 **①组件TextView的属性 drawableTop ``` <LinearLayout android:layout_width="match_parent&q ...

  10. 再谈EditText只能输入金额

    上次写了一篇EditText只能输入金额的博客,后来发现一个bug,当还未输入数字的情况下输入小数点程序就崩了,我去测了一下支付宝,看看会怎么样,我先输入小数点,程序正常,我再输入数字,可以正常输入, ...