
¿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/video1
que /dev/video2
no 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 lsusb
o 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 lsusb
puede tener una referencia cruzada con una /dev/video*
ruta.
Por ejemplo, si alguien conecta dos cámaras web idénticas y aparecen como /dev/video1
y /dev/video2
luego las desconecta y las vuelve a conectar en puertos completamente diferentes, de modo que /dev/video2
se vuelve /dev/video3
y /dev/video1
se 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 sudo
es 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/videoX
los 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://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-id
que incluye la serie corta.
ls -l /dev/v4l/by-id/ | sort