Cómo identificar una cámara web USB por número de serie desde la línea de comando de Linux

Cómo identificar una cámara web USB por número de serie desde la línea de comando de Linux

¿Cómo se obtiene el número de serie de una cámara web USB desde la línea de comandos de Linux?

Tengo varias cámaras web USB conectadas a una máquina Ubuntu. Todos aparecen como /dev/video0,,, etc., pero parece /dev/video1que /dev/video2no puedo encontrar ninguna manera de saber mediante programación cuál es cuál. Varias de las cámaras son del mismo modelo, por lo que no basta con obtener el nombre del modelo.

Nota, estoynopreguntando cómo usarlo lsusb. Sí, sé que puede usar lsusbo libusb para obtener el número de serie del dispositivo, la identificación del producto, el nombre del fabricante, etc. Pero hasta donde yo sé, nada de lo que se muestra lsusbpuede tener una referencia cruzada con una /dev/video*ruta.

Por ejemplo, si alguien conecta dos cámaras web idénticas y aparecen como /dev/video1y /dev/video2luego las desconecta y las vuelve a conectar en puertos completamente diferentes, de modo que /dev/video2se vuelve /dev/video3y /dev/video1se vuelve /dev/video4, puedo saber inmediatamente que el actual /dev/video3"solía ser" /dev/video2.

Las únicas preguntas similares que he encontrado solo sugieren trucos como desconectarlo y volverlo a conectar mientras escanea dmesg. Estoy buscando una solución puramente programática que no requiera manipulación de hardware para identificar las cámaras web.

Respuesta1

Es posible identificar todas las cámaras. El comando

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

devuelve el número de serie de mi cámara (una cámara web Logitech HD Pro, utilizada como ejemplo con los códigos correctos de Proveedor:Producto obtenidos de un uso anterior de lsusb). Tenga en cuenta que el uso de sudoes absolutamente necesario: un usuario sin privilegios no obtiene acceso a toda la información disponible a través del comando.

El número de serie suele ser único, aunque no siempre. Si no es único (simplemente compare el resultado de los comandos anteriores para dos dispositivos con el mismo proveedor: códigos de producto), puedecolocarellos para que sean distintos. Hay guías en todo Google para hacer esto, simplemente señalaré un par de ellas, en aras de la minuciosidad:aquíyaquí. Pero recuerda, esto es undependiente del dispositivoprocedimiento, por lo que tendrás que averiguar cómo hacerlopara tu propia cámara.

Ahora el comando

$ 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

devuelve los códigos apropiados para esta cámara en particular. La prueba y error con todos /dev/videoXlos dispositivos permite encasillarlos a todos.

Respuesta2

Yo también tuve el mismo problema. Necesitaba identificar 6 cámaras USB conectadas a Raspberry Pi con 1 concentrador USB más. 6 cámaras tienen identificación de proveedor, nombre de modelo y número de serie idénticos. Cada vez que apagaba y encendía podía manejar las cámaras usando '/dev/video0'... '/dev/video5'. Pero descubrí que '/dev/videoX' no siempre estaba asignado a la misma cámara. Así que dediqué algún tiempo a resolver este problema y finalmente lo resolví usando el número de bus. A continuación se muestra el resultado del comando de mi raspberry pi.

v4l2-ctl --listar-dispositivos

Cámara USB 2.0: Cámara USB HD (usb-3f980000.usb-1.2):
     /dev/video0
Cámara USB 2.0: Cámara USB HD (usb-3f980000.usb-1.3):
     /dev/video1
Cámara USB 2.0: Cámara USB HD (usb-3f980000.usb-1.4):
     /dev/video2
Cámara USB 2.0: Cámara USB HD (usb-3f980000.usb-1.5.1):
     /dev/video3
Cámara USB 2.0: Cámara USB HD (usb-3f980000.usb-1.5.2):
     /dev/video4
Cámara USB 2.0: Cámara USB HD (usb-3f980000.usb-1.5.3):
     /dev/vídeo5

Encontré que el número de bus (1.2, 1.3, 1.4, 1.5.1, 1.5.2, 1.5.3) siempre coincide con el puerto USB físico. Entonces analicé el resultado para encontrar la ruta de la cámara para cada número de bus para identificar cada cámara. Ahora parece que funciona perfectamente. Utilicé el siguiente comando para analizar el resultado.

v4l2-ctl --list-dispositivos | awk '{dividir($0,a,"-"); gsub(/[):]/,"",a[3]); obtener línea; nombre=substr($0,2); imprimir un nombre [3] "-"; obtener línea}'

Respuesta3

Tenía el mismo deseo de obtener una cámara específica desde la línea de comando, para poder obtener un acceso directo para ver mi video y funcionar sin importar el puerto al que lo conecté, etc. Las respuestas aquí ayudaron, pero no me dieron del todo. una receta completa, así que publicaré una solución completa.

Tengo una cámara USB que uso para mostrar el trabajo que estoy haciendo a través de una pantalla compartida con mis colegas. Utilizo VLC para colocar el vídeo en una ventana, de modo que pueda verse junto al código que estoy desarrollando. Este es un ejemplo específico, pero los comandos aquí funcionarán para cualquier caso de uso programático.

Basándome en esta respuesta y en varias otras, se me ocurrió esto, que funciona como un iniciador de escritorio (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 "

Para desglosarlo todo:

Primero, ajuste bash para poder usar canalizaciones y variables de entorno, etc. desde un iniciador:

bash -c "..."

A continuación, busque el dispositivo de vídeo correcto y coloque el nombre en una variable.

VID=$(...)

Primero enumere todos los dispositivos...

vfl2-ctl ...

Haga coincidir el que le interesa incluyendo suficientes líneas para mostrar todos los nombres de /dev/video*...

grep ... -A4

Luego, tome el número de dispositivo que tenga la resolución/configuración correcta...

sed -n ...

Recortar espacios...

xargos

Finalmente, pase a vlc con la configuración para minimizar la latencia y establezca la resolución:

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

Referencias:

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-resoluciones

Respuesta4

También puede verlos a continuación, /dev/v4l/by-idque incluye la serie corta.

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

información relacionada