在编写多摄像头软件时,PC中可能接入了多个UVC摄像头,此时,我们可能希望总是打开电脑上某个固定USB端口接入的摄像头,但若我们使用的是DirectShow库来驱动【方法见我的上一篇博文https://blog.csdn.net/tanjiaqi2554/article/details/100589588】,对应某个VID和PID[Vendor ID & Project ID]的摄像头并不会总是接在某一个固定的USB端口上,这具有一定的随机性。
因此,我们需要先遍历PC设备的所有Hub集线器,以及挂接在Hub下的所有Port端口。
而这些Port端口即对应PC的每个实际物理端口,如下图,我使用USBlyzer试用版查询我接入PC的两个UVC摄像头。
由上图,可以看到,我所接入的其中一个UVC设备,接在电脑的Hub1集线器的Port10端口上,由于与实际物理USB端口一一对应,因此,即使重启电脑该设备仍将接在这个端口上,此外,我们还可以看到它的VID为058F,PID为3822,而其Serial Number由于设备属性页中没有提供,为00,由系统随机生成了一个5&D4249C9&0&10。
下面,通过查询DirectShow的DevicePath属性【源码资源链接见我的上一篇博文https://blog.csdn.net/tanjiaqi2554/article/details/100589588】,也可以得到上述VID和PID。
综上,我们其实只要查询系统Hub集线器上某个固定Port端口所连接的UVC设备的VID和PID信息,将其做绑定,再在DirectShow中遍历所有UVC设备,通过DevicePath属性匹配该相应的VID和PID,即可打开我们想要的物理端口上的UVC设备。
而Microsoft在WinDDK中有提供相关遍历系统所有Hub/Port信息的示例程序,详见开源实例usbView:
其相应执行程序usbView.exe运行效果如下:
通过整合该sample工程与我上一篇博文中的示例程序,应不难做到双击list中的某个USB PORT,即打开指定USB端口设备的软件,最后,若您要驱动的设备不是UVC类摄像头设备,也可依同样的方法,针对端口进行上述绑定。