
Wie erhalten Sie die Seriennummer einer USB-Webcam über die Linux-Befehlszeile?
/dev/video0
Ich habe mehrere USB-Webcams an einen Ubuntu-Rechner angeschlossen. Sie werden alle als , /dev/video1
, , usw. angezeigt /dev/video2
, aber ich kann scheinbar keine Möglichkeit finden, programmgesteuert herauszufinden, welche welche ist. Mehrere der Kameras sind vom gleichen Modell, daher reicht es nicht aus, nur den Modellnamen zu erhalten.
Beachten Sie, ich binnichtgefragt, wie man verwendet lsusb
. Ja, ich weiß, dass Sie oder libusb verwenden können, lsusb
um die Seriennummer des Geräts, die Produkt-ID, den Herstellernamen usw. abzurufen. Aber soweit ich das beurteilen kann, kann nichts von mit einem Pfad lsusb
abgeglichen werden ./dev/video*
Wenn beispielsweise jemand zwei identische Webcams anschließt und sie als /dev/video1
und angezeigt werden /dev/video2
und sie dann aussteckt und an ganz anderen Ports wieder ansteckt, so dass /dev/video2
aus /dev/video3
und /dev/video1
wird /dev/video4
, weiß ich sofort, dass das aktuelle /dev/video3
„früher“ war /dev/video2
.
Die einzigen ähnlichen Fragen, die ich gefunden habe, schlagen nur Hacks vor, wie das Aus- und Wiedereinstecken während des Scannens von dmesg. Ich suche nach einer rein programmatischen Lösung, die keine Hardwaremanipulation erfordert, um die Webcams zu identifizieren.
Antwort1
Es ist möglich, alle Kameras zu identifizieren. Der Befehl
$ sudo lsusb -v -d 046d:082d | grep -i serial
iSerial 1 05C6D16F
gibt die Seriennummer meiner Kamera zurück (eine Logitech HD Pro Webcam, als Beispiel mit den korrekten Vendor:Product-Codes, die durch eine vorherige Verwendung von erhalten wurden lsusb
). Bitte beachten Sie, dass die Verwendung von sudo
unbedingt erforderlich ist: Ein nicht privilegierter Benutzer erhält keinen Zugriff auf alle über den Befehl verfügbaren Informationen.
Die Seriennummer ist oft, aber nicht immer, eindeutig. Wenn sie nicht eindeutig ist (vergleichen Sie einfach die Ausgabe der obigen Befehle für zwei Geräte mit demselben Vendor:Product-Code), können SieSatzsie so, dass sie sich unterscheiden. Es gibt überall bei Google Anleitungen dazu, ich werde der Vollständigkeit halber nur auf einige davon verweisen:HierUndHierAber denken Sie daran, dies ist eingeräteabhängigVerfahren, also müssen Sie herausfinden, wie es gehtfür Ihre eigene Kamera.
Nun der Befehl
$ 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
gibt die passenden Codes für diese bestimmte Kamera zurück. Durch Ausprobieren mit allen /dev/videoX
Geräten können sie alle in eine Schublade gesteckt werden.
Antwort2
Ich hatte dasselbe Problem. Ich musste 6 USB-Kameras identifizieren, die mit einem weiteren USB-Hub an Raspberry Pi angeschlossen waren. 6 Kameras haben alle die gleiche Hersteller-ID, Modellbezeichnung und Seriennummer. Immer wenn ich sie aus- und wieder einschaltete, konnte ich die Kameras mit „/dev/video0“ … „/dev/video5“ bedienen. Aber ich stellte fest, dass „/dev/videoX“ nicht immer derselben Kamera zugewiesen war. Also habe ich einige Zeit damit verbracht, dieses Problem zu lösen, und es schließlich mithilfe der Busnummer gelöst. Unten ist das Befehlsergebnis meines Raspberry Pi.
v4l2-ctl --list-devices
USB 2.0-Kamera: HD-USB-Kamera (usb-3f980000.usb-1.2):
/dev/video0
USB 2.0 Kamera: HD USB Kamera (usb-3f980000.usb-1.3):
/dev/video1
USB 2.0 Kamera: HD USB Kamera (usb-3f980000.usb-1.4):
/dev/video2
USB 2.0 Kamera: HD USB Kamera (usb-3f980000.usb-1.5.1):
/dev/video3
USB 2.0 Kamera: HD USB Kamera (usb-3f980000.usb-1.5.2):
/dev/video4
USB 2.0 Kamera: HD USB Kamera (usb-3f980000.usb-1.5.3):
/dev/video5
Ich habe festgestellt, dass die Busnummer (1.2, 1.3, 1.4, 1.5.1, 1.5.2, 1.5.3) immer mit dem physischen USB-Anschluss übereinstimmt. Also habe ich das Ergebnis analysiert, um den Kamerapfad für jede Busnummer zu finden und jede Kamera zu identifizieren. Jetzt scheint es perfekt zu funktionieren. Ich habe den folgenden Befehl verwendet, um das Ergebnis zu analysieren.
v4l2-ctl --list-devices | awk '{split($0,a,"-"); gsub(/[):]/,"",a[3]); getline; name=substr($0,2); drucke a[3] "-" name; getline}'
Antwort3
Ich hatte denselben Wunsch, über die Befehlszeile eine bestimmte Kamera zu erreichen, damit ich eine Verknüpfung zum Anzeigen meines Videos erhalten könnte, die funktioniert, egal an welchen Port ich es anschließe usw. Die Antworten hier haben geholfen, aber sie haben mir kein vollständiges Rezept geliefert, daher werde ich eine vollständige Lösung posten.
Ich habe eine USB-Kamera, die ich verwende, um meine Arbeit per Bildschirmfreigabe mit meinen Kollegen zu zeigen. Ich verwende VLC, um den Video-Feed einfach in ein Fenster zu bringen, sodass er neben dem Code angezeigt wird, den ich entwickle. Dies ist ein spezielles Beispiel, aber die Befehle hier funktionieren für jeden programmatischen Anwendungsfall.
Auf Grundlage dieser und mehrerer anderer Antworten bin ich auf Folgendes gekommen, das als Desktop-Launcher (xfce) funktioniert:
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 "
Um das Ganze aufzuschlüsseln:
Wrappen Sie es zunächst in Bash, damit Sie Pipes und Umgebungsvariablen usw. von einem Launcher aus verwenden können:
bash -c "..."
Suchen Sie anschließend das richtige Videogerät und geben Sie den Namen in eine Variable ein.
VID=$(...)
Listen Sie zuerst alle Geräte auf ...
vfl2-ctl ...
Ordnen Sie den gewünschten Namen zu und fügen Sie genügend Zeilen ein, um alle /dev/video*-Namen anzuzeigen ...
grep ... -A4
Suchen Sie sich dann die Gerätenummer mit der richtigen Auflösung/den richtigen Einstellungen aus …
sed -n ...
Leerzeichen kürzen...
xargs
Zum Schluss übergeben Sie es an VLC mit Einstellungen zum Minimieren der Latenz und Einstellen der Auflösung:
vlc v4l2://$VID --live-caching=250 --v4l2-width=1920 --v4l2-height=1080
Verweise:
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
Antwort4
/dev/v4l/by-id
Möglicherweise können Sie sie auch unter „Einschließlich der Kurzserie“ ansehen .
ls -l /dev/v4l/by-id/ | sort