0

我在立体设置中有两个 UVC 相机,由 C++ MediaFoundation 应用程序控制。我需要唯一标识它们以便为每个物理设备分配左右。此相机型号在 USB 描述符中具有唯一的序列号。但是,在使用 MediaFoundation 进行枚举时,我似乎找不到获取序列号的方法。

这些摄像机的 MF 枚举顺序在端口顺序上并不可靠;95% 的情况下,相机 1 在相机 2 之前被枚举,而在某些机器上,我们在相机 1 之前获取相机 2。所以找到序列号非常重要。

我尝试过的事情:

  • MediaFoundation似乎根本没有提供直接获取序列号的方法

  • 通过查询MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK属性,可以得到一个USB符号链接。文档说这可以用来调用,SetupDiOpenDeviceInterface但是这似乎也不能用于获取序列号(或 USB 描述符)。

  • WinUSB可用于以通用方式打开一些 USB 设备,因此 USB 描述符可能是可访问的,但在从CreateFile.

  • IOCTL最低级别的方法,显然您可以IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX使用端口索引将 a 发送到集线器设备,它将返回您应该能够从中获取序列号的描述符。不知道如何仅从符号链接获取集线器设备和端口索引。

  • 相关但未解决:使用 Windows Media Foundation 枚举时如何获取硬件 ID

  • 我不希望重新实现 USBView 示例的一半并枚举整个 USB 世界,只是为了获取我已经有句柄的设备的一些特定信息。

可以解析 USB 设备的一些符号链接以提取序列号,但是对于复合设备(此处涉及的所有设备),符号链接具有&MI_00#样式格式并且不包含符号链接字符串中的序列号。所以不能简单地解析出来。

更一般地说,Win32 中的安装程序和相关 API 似乎可以轻松获取制造商、友好名称和各种其他信息等信息。但是序列号明显没有。

那么如何获取与 MediaFoundation 设备实例关联的序列号呢?

4

3 回答 3

0

您可以通过 USB 端口连接进行相机识别(如果您不将新的 USB 卡或集线器连接到系统,则 Root-Hub-Port 标识符是相同的)

于 2021-12-08T12:49:45.267 回答
0

不幸的是 StackOverflow 没有提供附加图像(我没有足够好的声誉)。我将尝试显示来自调试器的数据:有我可用的相机列表

+Integrated_Webcam/R1.H2.P4/VID_1BCF&PID_2284&MI_00;
+HBVCAM FHD CAMERA/R4.H2.P4/VID_058F&PID_3821&MI_00;
+HD USB Camera/R5.H2.P5/VID_05A3&PID_9230&MI_00;
+Integrated_Webcam/R5.H2.P6/VID_1BCF&PID_2284&MI_00;
+Logitech HD Webcam C270/R1.H2.P1/VID_046D&PID_0825&MI_00;

每个字符串由Friendly camera name、Rx.Hx.Px camera连接端口索引(即控制器号“R”-Hub号“H”-端口号“P”)和VID-PID-MI表示字符串(vendor id,产品ID和接口号)。第 1 台和第 4 台摄像机相同,但 RHP 指标不同。这些索引我确实用于相机识别。我做了提供这些索引的 USB 枚举器(我是在 Microsoft USBView.exe 应用程序的基础上完成的,该应用程序随 Windows SDK 中的源提供)。[1]:https ://i.stack.imgur.com/6SQcS.png

于 2021-12-10T10:57:15.797 回答
-1

通常简单的 USB 摄像头(网络摄像头)没有序列号或类似序列号的东西编码在 USB 实例 ID 中。更昂贵的相机有特殊的驱动程序,您可以通过驱动程序读取 SN。

我只看到一种方法可以知道我现在使用什么相机 - 通过连接的 USB 端口。这个端口是独一无二的……如果您不连接额外的集线器或没有在计算机中插入额外的 USB 接口卡。USB 枚举过程提供 Controller(Root)-Hub-Port 枚举索引。我确实使用这些索引来识别相机。

查看此对话框:您会看到 5 个带有 5 个 USB 摄像机描述符的字符串。每个描述符由“Friendly Camera Name”、3 个枚举索引(Rx.Hx.Px)和相机供应商 ID 和产品 ID(VID 和 PID)组成。

如果我将不同的相机放到同一个端口,我的程序将使用这个不同的相机。如果连接了几台相同类型的相机,我确实会通过 RHP 索引在相机之间有所不同。例如,列表中的第一个和第四个摄像头是相同的,但它们有不同的

在此处输入图像描述

于 2021-12-10T10:42:31.590 回答