之前在https://blog.csdn.net/fengbingchun/article/details/103507754 博文中介绍过如何在Linux获取usb视频设备的vendor id和product id,这里介绍在Windows下获取的方式:

1. 打开设备管理器,如下图所示,内置摄像头显示名为”Integrated Webcam”,插入的usb摄像头显示名为”Logitech HD Webcam C310”:

选中其中一个,如”Logitech HD Webcam C310”,点击右键,选中”属性”点击,-->详细信息,-->属性选择”硬件id”,可获取vid和pid值,如下图所示,十六进制vid为”046D”,pid为”081B”:

2. 通过执行ffmpeg获取,执行命令及执行结果如下图所示:

3. 通过Windows的SetupDiGetDeviceInstanceId函数可以获得所有usb设备的vid和vid,测试code如下:

int get_all_usb_devices_vid_pid()
{GUID *guidDev = (GUID*)&GUID_DEVCLASS_USB;HDEVINFO deviceInfoSet = SetupDiGetClassDevs(guidDev, NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE);CHAR buffer[4000];DWORD memberIndex = 0;while (true) {SP_DEVINFO_DATA deviceInfoData;ZeroMemory(&deviceInfoData, sizeof(SP_DEVINFO_DATA));deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);if (SetupDiEnumDeviceInfo(deviceInfoSet, memberIndex, &deviceInfoData) == FALSE) {if (GetLastError() == ERROR_NO_MORE_ITEMS) {break;}}DWORD nSize = 0;SetupDiGetDeviceInstanceId(deviceInfoSet, &deviceInfoData, buffer, sizeof(buffer), &nSize);buffer[nSize] = '\0';fprintf(stdout, "%s\n", buffer);memberIndex++;}if (deviceInfoSet) {SetupDiDestroyDeviceInfoList(deviceInfoSet);}return 0;
}

执行结果如下:

4. 提取FFmpeg源码中部分code,测试code如下:

std::unique_ptr<char[]> dup_wchar_to_utf8(wchar_t *w, int& len)
{len = WideCharToMultiByte(CP_UTF8, 0, w, -1, 0, 0, 0, 0);std::unique_ptr<char[]> s(new char[len]);WideCharToMultiByte(CP_UTF8, 0, w, -1, s.get(), len, 0, 0);return s;
}int parse_string(const std::string& src, std::string& vid, std::string& pid)
{int pos = src.find("vid_");if (pos == std::string::npos) return -1;vid.assign(src, pos + 4, 4);pos = src.find("pid_");if (pos == std::string::npos) return -1;pid.assign(src, pos + 4, 4);return 0;
}int get_usb_video_devices_vid_pid()
{CoInitialize(0);ICreateDevEnum *devenum = NULL;int r = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&devenum));if (r != S_OK) {fprintf(stdout, "fail to CoCreateInstance: %d\n", r);return -1;}IEnumMoniker *classenum = NULL;r = ICreateDevEnum_CreateClassEnumerator(devenum, CLSID_VideoInputDeviceCategory, (IEnumMoniker **)&classenum, 0);if (r != S_OK) {fprintf(stdout, "fail to ICreateDevEnum_CreateClassEnumerator: %d\n", r);return -1;}IBaseFilter *device_filter = NULL;IMoniker *m = NULL;while (!device_filter && IEnumMoniker_Next(classenum, 1, &m, NULL) == S_OK) {IPropertyBag *bag = NULL;VARIANT var;r = IMoniker_BindToStorage(m, 0, 0, IID_IPropertyBag, (void **)&bag);if (r != S_OK) {fprintf(stdout, "fail to IMoniker_BindToStorage: %d\n", r);return -1;}var.vt = VT_BSTR;r = IPropertyBag_Read(bag, L"FriendlyName", &var, NULL);if (r != S_OK) {fprintf(stdout, "fail to IPropertyBag_Read: %d\n", r);return -1;}int length;auto friendly_name = dup_wchar_to_utf8(var.bstrVal, length);fprintf(stdout, "friendly_name: %s\n", friendly_name.get());LPMALLOC co_malloc = NULL;r = CoGetMalloc(1, &co_malloc);if (r != S_OK) {fprintf(stdout, "fail to CoGetMalloc: %d\n", r);return -1;}IBindCtx *bind_ctx = NULL;r = CreateBindCtx(0, &bind_ctx);if (r != S_OK) {fprintf(stdout, "fail to CreateBindCtx: %d\n", r);return -1;}LPOLESTR olestr = NULL;r = IMoniker_GetDisplayName(m, bind_ctx, NULL, &olestr);if (r != S_OK) {fprintf(stdout, "fail to IMoniker_GetDisplayName: %d\n", r);return -1;}auto unique_name = dup_wchar_to_utf8(olestr, length);/* replace ':' with '_' since we use : to delineate between sources */std::for_each(unique_name.get(), unique_name.get() + length, [](char& ch) { if (ch == ':') ch = '_'; });fprintf(stdout, "unique_name: %s\n", unique_name.get());std::string src(unique_name.get()), vid, pid;parse_string(src, vid, pid);unsigned int value_vid, value_pid;std::istringstream(vid) >> std::hex >> value_vid;std::istringstream(pid) >> std::hex >> value_pid;fprintf(stdout, "usb device name: %s, vid: %s, value: %d; pid: %s, value: %d\n",friendly_name.get(), vid.c_str(), value_vid, pid.c_str(), value_pid);if (olestr && co_malloc)IMalloc_Free(co_malloc, olestr);if (bind_ctx)IBindCtx_Release(bind_ctx);if (bag)IPropertyBag_Release(bag);IMoniker_Release(m);}IEnumMoniker_Release(classenum);return 0;
}

执行结果如下:

GitHub:https://github.com//fengbingchun/OpenCV_Test

Windows下获取usb视频设备vendor id和product id的4种方法相关推荐

  1. Linux下获取usb视频设备vendor id和product id的8种方法

    在使用usb摄像头获取视频时,有时需要获取此摄像头供应商ID(vendor id, vid)和产品ID(product id, pid),这里在Linux下提供获取vid和pid的8种方法: 1. 通 ...

  2. Windows下获取视频设备的一种改进实现

    之前在https://blog.csdn.net/fengbingchun/article/details/102806822中介绍过在Windows下获取视频设备列表的方法.其实那种实现方法是有缺陷 ...

  3. QT在Windows下检测USB设备热拔插的思路

    一.问题描述: 使用QT开发视频会议时需要实现实时检测USB摄像头/麦克风拔插的功能,这里主要涉及到对一些Windows API的了解以及windows系统的设备管理识别不同种设备时的原理,在实现过程 ...

  4. 有两个以上的USB设备,他们的Vendor ID和Product ID都一样,如何指定对应的usb插口和/dev/ttyUSB的序号?

    如果有两个以上的USB设备,他们的Vendor ID和Product ID都一样,那么无法通过Vendor ID和Product ID来区分它们.需要采取其他方式来指定对应的USB插口和/dev/tt ...

  5. USB设备的Vendor ID和Product ID是什么?有什么样?接到不同的pc他们的ID还是一样的吗?

    USB设备的Vendor ID(厂商识别码)和Product ID(产品识别码)是用来标识USB设备的两个数字代码.Vendor ID是由USB Implementers Forum颁发给厂商的唯一标 ...

  6. windows/linux 查看vendor ID 和 product ID

    windows/linux 查看vendor ID 和 product ID vendor 和 product ID 通常是十六进制数值形式,用冒号隔开,例如 "1d6b:0002" ...

  7. C++在windows下获取本地主机ipv4地址和ipv6地址的代码

    把内容过程中经常用的内容段记录起来,下面内容段是关于C++在windows下获取本地主机ipv4地址和ipv6地址的内容,应该是对码农有所用处. #include <Winsock2.h> ...

  8. usb 视频设备 按钮消息处理 和普通usb连接的事件处理

    usb 视频设备 按钮消息处理 和普通usb连接的事件处理 (c#版,c++/c可仿照修改) 最近要做个usb camera的例子,试过了很多方法,一般的usb连接的处理方法: (1) define ...

  9. 【新知实验室 三步完成Windows下实时音视频开发】

    三步完成Windows下实时音视频开发 第一步:开通产品 第二步:下载源码 第三步:编译源码 第四部:运行测试 背景介绍 实时音视频(Tencent RTC)基于腾讯21年来在网络与音视频技术上的深度 ...

最新文章

  1. python使用fpdf将生成的长字符串手动换行写入pdf
  2. CentOS 8中安装Docker出现和Podman冲突
  3. Echarts 解决饼图文字过长重叠的问题
  4. JAVA——关闭ServerSocket
  5. jQuery面向对象写法规定写法样式规定
  6. Stream流的基本使用方法
  7. canvas 多次画图效果_canvas练习之终极的奔跑小人
  8. C# 操作线程的通用类[测试通过]
  9. 学习笔记 十一 : iscsi
  10. 完整记录一则Oracle 11.2.0.4单实例打PSU补丁的过程
  11. Arcgis拓扑检查之面空隙(内附具体操作步骤)
  12. 2016 最好的Bootstrap 管理模板
  13. Aggressive cows题解
  14. 开源电子书项目FBReader初探(四)
  15. 自动驾驶开源平台整理
  16. AD7606与STM32F103ZET6的串行通信
  17. Java 金额信息存储、精度运算及显示的处理
  18. ThinkPHP6使用七牛云存储,不改代码,改下配置就上七牛
  19. PowerBI-时间智能函数-ENDOF系列
  20. 网络编程-网路七层协议图(2)之每一层对应的设备及功能(物理层、数据链路层、网络层、传输层、应用层...)

热门文章

  1. Android开发(一):Android Studio及SDK下载安装教程2020
  2. vb毕业设计——基于vb+VB.NET的媒体播放器设计与实现(毕业论文+程序源码)——媒体播放器
  3. 托里拆利小号:有关于其的证明
  4. 使用mllib完成mnist手写识别任务
  5. 京东金融java面试题_互联网金融西部联盟
  6. HIVE常用命令之MSCK REPAIR TABLE
  7. 达人评测 天玑1100和骁龙888哪个处理器好
  8. print log trace (I forgot it )
  9. Google OR-Tools(六) 装箱问题 Bin Packing
  10. 计算机网络中的IP到底是什么?