我有两个UVC相机在立体设置,控制与一个C++ MediaFoundation应用程序。我需要唯一的识别他们,以便分配左和右每个物理设备。这个相机模型在USB描述符中有一个唯一的序列号。但是,在使用MediaFoundation进行枚举时,我似乎找不到获取序列号的方法。
这些摄像机的MF枚举顺序不可靠,95%的相机是在摄像机2之前枚举的,而在某些机器上,相机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
,它将返回您应该能够从中获得序列号的描述符。但是,不知道如何从符号链接中获取集线器设备和端口索引。可以解析用于USB设备的一些符号链接以提取序列号,但是在组合设备(此处讨论的所有设备)情况下,符号链接具有&MI_00#
样式格式,并且不包含符号链接字符串中的序列号。所以它不能简单地被解析出来。
更普遍地说,Win32中的设置和相关API似乎使得获取诸如制造商、友好名称和各种其他信息等信息变得更加容易。但序列号却明显缺失。
那么,如何获得与MediaFoundation设备实例关联的序列号?
发布于 2021-12-08 12:49:45
您可以通过USB端口连接进行相机标识(如果不将新的USB卡或集线器连接到系统,则根-集线器端口标识符是相同的)。
发布于 2021-12-10 10:42:31
通常简单的USB相机(网络摄像头)没有序列号,或者像序列号一样被编码在USB实例ID中。更昂贵的摄像头有特殊的驱动程序,你可以通过驱动程序读取SN。
我只看到一种方式来知道,我现在使用什么相机-通过附加USB端口。这个港口很独特..。如果您不连接其他集线器或没有插入额外的USB接口卡在计算机上。有USB枚举过程,它提供控制器(根)-集线器-端口枚举索引.我确实用这些索引来识别相机。
查看此对话框:您将看到5个带有5个USB摄像机描述符的字符串。每个描述符由“友好摄像机名称”、3个枚举索引(Rx.Hx.Px)、相机供应商ID和产品ID (VID和PID)组成。
如果我把不同的相机放在同一个端口,我的程序就会使用这个不同的摄像头。如果同一类型的几个摄像机连接在一起,那么RHP索引在相机之间确实会有不同。例如,列表中的第一台和第四台相机是相同的,但它们有不同的。
发布于 2021-12-10 10:57:15
不幸的是,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;
每个字符串由友好的摄像机名称、Rx.Hx.Px摄像机连接端口索引(即控制器编号“R”-Hub number"H"-Port number"P")和VID MI表示字符串(供应商id、产品id和接口号)组成。第一和第四摄像机相同,但RHP指数不同。我确实用这些索引来识别相机。我做了USB枚举器,它提供了这些索引(我这样做的基础上的微软USBView.exe应用程序,这是提供了Windows的源代码)。1:https://i.stack.imgur.com/6SQcS.png
https://stackoverflow.com/questions/67369169
复制相似问题