如何从 Linux 命令行通过序列号识别 USB 网络摄像头

如何从 Linux 命令行通过序列号识别 USB 网络摄像头

如何从 Linux 命令行获取 USB 网络摄像头的序列号?

我有多个 USB 网络摄像头连接到一台 Ubuntu 机器。它们都显示为/dev/video0/dev/video1/dev/video2等,但我似乎找不到任何方法以编程方式区分哪个是哪个。其中几个摄像头是同一型号,因此仅获取型号名称是不够的。

注意,我不是询问如何使用lsusb。是的,我知道您可以使用lsusb或 libusb 来获取设备序列号、产品 ID、制造商名称等。但据我所知,显示的任何内容lsusb都不能与路径交叉引用/dev/video*

例如,如果有人插入两个相同的网络摄像头,它们显示为和/dev/video1/dev/video2然后拔下它们并重新插入完全不同的端口,使得/dev/video2变成/dev/video3/dev/video1变成/dev/video4,我就可以立即知道当前的/dev/video3“曾经是” /dev/video2

我发现的唯一类似问题只建议在扫描 dmesg 时拔下并重新插入等黑客行为。我正在寻找一种纯程序化解决方案,无需硬件操作即可识别网络摄像头。

答案1

可以识别所有摄像机。命令

 $ sudo lsusb -v -d 046d:082d | grep -i serial
   iSerial                 1 05C6D16F

返回我的相机的序列号(Logitech HD Pro Webcam,用作示例,使用从先前使用中获得的正确供应商:产品代码lsusb)。请注意,使用sudo是绝对必要的:非特权用户无法访问通过命令提供的所有信息。

序列号通常是唯一的,但并非总是唯一的。如果它不是唯一的(只需比较两个具有相同 Vendor:Product 代码的设备上述命令的输出),您可以将它们分开。Google 上有很多指南可以做到这一点,为了详尽起见,我仅指出其中几个:这里这里。但请记住,这是一个设备相关程序,所以你必须找出如何去做适合你自己的相机

现在命令

$ sudo udevadm info --query=all /dev/video1 | grep 'VENDOR_ID\|MODEL_ID\|SERIAL_SHORT'
  E: ID_MODEL_ID=082d
  E: ID_SERIAL_SHORT=05C6D16F
  E: ID_VENDOR_ID=046d

返回此特定相机的相应代码。对所有设备进行反复试验,/dev/videoX可以将它们全部归类。

答案2

我也遇到了同样的问题。我需要识别连接到 raspberry pi 的 6 个 usb 摄像头,并使用 1 个 usb 集线器。6 个摄像头的供应商 ID、型号名称和序列号都相同。每当我关闭和打开时,我都能使用“/dev/video0”...“/dev/video5”来处理摄像头。但我发现“/dev/videoX”并不总是分配给同一个摄像头。所以我花了一些时间来解决这个问题,最后通过使用总线号解决了它。以下是我的 raspberry pi 的命令结果。

v4l2-ctl --列表设备

USB 2.0 摄像头:高清 USB 摄像头(usb-3f980000.usb-1.2):
     /dev/video0
USB 2.0 摄像头:高清 USB 摄像头(usb-3f980000.usb-1.3):
     /dev/video1
USB 2.0 摄像头:高清 USB 摄像头(usb-3f980000.usb-1.4):
     /dev/video2
USB 2.0 摄像头:高清 USB 摄像头(usb-3f980000.usb-1.5.1):
     /dev/video3
USB 2.0 摄像头:高清 USB 摄像头(usb-3f980000.usb-1.5.2):
     /dev/video4
USB 2.0 摄像头:高清 USB 摄像头(usb-3f980000.usb-1.5.3:
     /dev/video5

我发现总线号(1.2、1.3、1.4、1.5.1、1.5.2、1.5.3)始终与物理 USB 端口匹配。因此,我解析了结果,以找到每个总线号的摄像头路径,从而识别每个摄像头。现在看起来运行正常。我使用以下命令来解析结果。

v4l2-ctl --list-devices | awk'{split($0,a,"-"); gsub(/[):]/,"",a[3]); getline; name=substr($0,2); print a[3] "-" name; getline}'

答案3

我也有同样的愿望,希望从命令行获取特定的摄像头,这样我就可以获得一个快捷方式来查看我的视频,无论我插入哪个端口等等。这里的答案很有帮助,但并没有给我一个完整的方法,所以我会发布一个完整的解决方案。

我有一个 USB 摄像头,用于通过屏幕共享与同事展示我正在做的工作。我使用 VLC 将视频源放在窗口中,这样就可以在我正在开发的代码旁边看到它。这是一个具体的例子,但这里的命令适用于任何编程用例。

基于这个答案和其他几个答案,我想出了这个,它可以作为桌面启动器(xfce):

bash -c "VID=$(v4l2-ctl --list-devices | grep 'H264 USB Camera' -A4 | sed -n '4p' | xargs) ; vlc v4l2://$VID --live-caching=250 --v4l2-width=1920 --v4l2-height=1080 "

具体来说:

首先,用 bash 包装,以便您可以从启动器中使用管道和环境变量等:

bash -c "..."

接下来,找到正确的视频设备并将名称放入变量中

VID=$(...)

首先列出所有设备...

vfl2-ctl ...

匹配您关心的那个,包括足够的行以显示所有 /dev/video* 名称...

grep ... -A4

然后获取具有正确分辨率/设置的设备编号...

sed -n ...

修剪空格...

参数

最后,传递给 vlc 设置以最小化延迟并设置分辨率:

vlc v4l2://$VID --live-caching=250 --v4l2-width=1920 --v4l2-height=1080

参考:

https://stackoverflow.com/questions/6022384/bash-tool-to-get-nth-line-from-a-file

https://unix.stackexchange.com/questions/493081/how-to-create-an-environment-variable-that-is-the-output-of-a-command

https://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-a-bash-variable

https://askubuntu.com/questions/214977/how-can-i-find-out-the-supported-webcam-resolutions

答案4

您也可以查看下面的内容,/dev/v4l/by-id其中包括简短的连续剧。

ls -l /dev/v4l/by-id/ | sort

相关内容