ubuntuusers.de

Treiber

Webcam und Treiber identifizieren

Für die meisten gängigen Webcams werden bereits mit einem aktuellen Linux-Kernel passende Treiber mitgeliefert und beim Ansprechen der Webcam automatisch geladen. Bei Problemen ist es dennoch wichtig, die Webcam vorab genau zu identifizieren.

Befehl lsusb

Eine Möglichkeit ist mit dem Befehl lsusb: Dazu steckt man die Webcam einfach in den USB-Port des Rechners (entfällt bei integrierten Webcams) und ruft in einem Terminal den Befehl auf:

lsusb 

Dieser Befehl liefert Informationen über die angeschlossenen USB-Geräte, u.a. auch die Hersteller- (engl. Vendor) und die Produkt-ID, die eine eindeutige Identifizierung des Gerätes ermöglichen (das Gerät muss dafür auch nicht konfiguriert oder mit Treibern versehen sein).

...
Bus 001 Device 008: ID 046d:081b Logitech, Inc. Webcam C310
...

Hier lautet die Hersteller-ID (vendor) 046d und die Produkt-ID (product) 081b. Mit diesen beiden Identifikationsnummern kann auf Datenbanken wie auf Linux-USB verlinkt die genaue Hersteller- und Modellbezeichnung ermittelt werden.

Nicht immer ist der Eintrag für die Webcam so leicht zu erkennen. Die Funktion eines Gerätes und der verwendete Treiber wird in der USB Baumstruktur ersichtlich. Dafür wird

lsusb -t 

aufgerufen und die Webcam wird über den adressierten Bus und Device (hier: 001 - Port 1 bzw. 008 - Dev 8) identifiziert:

...
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
    |__ Port 1: Dev 8, If 0, Class=Video, Driver=uvcvideo, 480M
    |__ Port 1: Dev 8, If 1, Class=Video, Driver=uvcvideo, 480M
    |__ Port 1: Dev 8, If 2, Class=Audio, Driver=snd-usb-audio, 480M
    |__ Port 1: Dev 8, If 3, Class=Audio, Driver=snd-usb-audio, 480M
...

Das Gerät hat also die Schnittstellen (interface If) 0 bis 3 für Video und Audio, verwendet die Treiber uvcvideo und snd-usb-audio bei einer verfügbaren Bandbreite von 480Mb (für USB 2.0).

Syslog

Alternativ kann der verfügbare Webcam-Treiber auch in den Logdateien untersucht werden. Dafür wird vor dem Anstecken der Webcam im Terminal der Befehl:

journalctl -f  

oder (alt)

tail -f /var/log/syslog 

angegeben wird und dann unmittelbar danach die Webcam an den USB-Port angesteckt wird. Die dann neuen Einträge beziehen sich dann auf die Webcam und zeigen ggfs. Fehlermeldungen oder welcher Treiber genutzt wird.

Dez 31 01:11:57 hostname kernel: usb 1-1: new high-speed USB device number 8 using ehci-pci
Dez 31 01:11:57 hostname kernel: usb 1-1: New USB device found, idVendor=046d, idProduct=081b
Dez 31 01:11:57 hostname kernel: usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=2
Dez 31 01:11:57 hostname kernel: usb 1-1: SerialNumber: 54E015E0
Dez 31 01:11:57 hostname mtp-probe[5330]: checking bus 1, device 8: "/sys/devices/pci0000:00/0000:00:12.2/usb1/1-1"
Dez 31 01:11:57 hostname mtp-probe[5330]: bus: 1, device: 8 was not an MTP device
Dez 31 01:11:57 hostname kernel: uvcvideo: Found UVC 1.00 device <unnamed> (046d:081b)
Dez 31 01:11:57 hostname kernel: input: UVC Camera (046d:081b) as /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/input/input19
Dez 31 01:11:57 hostname kernel: usbcore: registered new interface driver uvcvideo
Dez 31 01:11:57 hostname kernel: USB Video Class driver (1.1.1)
Dez 31 01:11:58 hostname kernel: usb 1-1: set resolution quirk: cval->res = 384
Dez 31 01:11:58 hostname kernel: usbcore: registered new interface driver snd-usb-audio

Befehl hwinfo

Alternativ kann über den Befehl hwinfo Details über das USB Gerät aufgegeben werden. Leider werden Webcams hier oft als "Unclassified device" (nicht klassifiziertes Gerät) geführt, so dass man für den richtigen Webcam-Eintrag die gesamte Ausgabe überfliegen muss.

verfügbare Kernel-Treiber

Im aktuellen Kernel sind verschiedene Chipsatz-Treiber für Webcams, aber auch für analoge und digitale (DVB) Videosignal-Grabber enthalten. Welche Chipsätze bei welchen Webcam-Produkten verwendet werden, darüber gibt es leider keine umfassende Übersicht, lediglich die Seiten der einzelnen Treiber können hier evtl. Aufschluss geben: siehe Tabelle

Die Kernel-Treiber sind in der V4L2-Kernel API integriert, die wie folgt dokumentiert ist:

V4L-Kompatibilitaet

Die Video for Linux Schnittstelle (urspr. V4L) bietet eine standardisierte Einbindung von Webcams auf Linux-Systemen. Diese Entwicklerschnittstelle ist seit dem Linux-Kernel 2.5 als Video for linux Version 2 (V4L2) im Linux-Kernel vorhanden. Ältere Video-Programme können jedoch noch auf der Version 1 dieser Schnittstelle basieren, hier gibt es eine Kompatibilitäts-Bibliothek, die in den Aufruf integriert werden kann, um diese Video-Programme weiterhin zu nutzen.

Laden der Bibliothek v4l1compat.so

Nutzt ein solches Programm program die erste Version der Video-Schnittstelle für Linux (V4L), kann sie allerdings mit einer Bibliothek betrieben werden, die es zur aktuellen Video-Schnittstellen kompatibel macht. Diese Bibliothek ist enthalten im folgenden Paket und muss ggf. installiert werden:

  • libv4l-0

Befehl zum Installieren der Pakete:

sudo apt-get install libv4l-0 

Oder mit apturl installieren, Link: apt://libv4l-0

program wird nun zusammen mit dieser Zusatz-Bibliothek gestartet. Dies geschieht, indem das Programm im Terminal gemeinsam mit der Umgebungsvariable LD_PRELOAD und der Bibliothek aufgerufen wird:

1
2
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l/v4l1compat.so /path/to/program # 64-bit
LD_PRELOAD=/usr/lib/i386-linux-gnu/libv4l/v4l1compat.so /path/to/program   # 32-bit

Siehe hierzu auch uname -m, um die Systemarchitektur zu ermitteln.

Dauerhafter Aufruf

Wer ein V4L-kompatibles Programm oft nutzt oder nicht mit dem Terminal arbeitet, möchte nicht jedesmal diese lange Befehlszeile angeben. An mehreren Orten kann das automatische Laden dieser Datei eingerichtet werden. Mit einer Umgebungsvariable lässt sich ein solches Programm auch über einen Launcher starten bzw. so in die Autostart-Programme einfügen:

1
2
env LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l/v4l1compat.so program  # 64-bit
env LD_PRELOAD=/usr/lib/i386-linux-gnu/libv4l/v4l1compat.so program    # 32-bit

Anschließend die Datei /usr/share/applications/program.desktop kopieren:

cp /usr/share/applications/<program>.desktop ~/.local/share/applications/<program>.desktop

und ~/.local/share/applications/program.desktop editieren. Die gesuchte Zeile beginnt mit

Exec=<program> ... 

und stellt den Programmaufruf dar. Dieser Programmaufruf wird mit dem LD_PRELOAD-Parameter erweitert, so dass

die Zeile wie folgt lautet (64-bit, 32-bit funktioniert mit dem entsprechenden Pfad):

Exec=env LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l/v4l1compat.so <program> ...

Zum Schluss eine Script-Datei mit Pfad und Namen: /usr/local/bin/myprogram und dem folgenden Inhalt erstellen:

1
2
#!/bin/bash
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l/v4l1compat.so /path/to/program "$@"

(64-bit, 32-bit funktioniert mit dem entsprechenden Pfad)

Notwendige Rechte einstellen:

1
chmod a+x /usr/local/bin/myprogram

Der Aufruf der modifizierten Version des Programms erfolgt dann einfach mit

1
myprogram

(sofern der lokale Prad in der $PATH Variable enthalten ist)

Mögliche Fehlerbilder

  • folgende Fehlermeldung tritt auf:

ERROR: ld.so: object &#39;/usr/lib/x86_64-linux-gnu/libv4l/v4l1compat.so&#39; from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS64): ignored.

  • In diesem Falle sollte die i386-Version von libv4l-0 nachinstalliert werden, der Pfad muss danach auf die 32-bit-Bibliothek weisen:

1
2
sudo apt-get install libv4l-0:i386
LD_PRELOAD=/usr/lib/i386-linux-gnu/libv4l/v4l1compat.so /path/to/program

  • Webcam gibt nur grünliches Bild aus (alte Skype version)

    • Es erscheint unter Optionen → Video bei einem Klick auf das Testfeld nur ein grünliches Bild (siehe auch 260918 und Fehlerbehebung).

  • Webcam gibt nur in meinem program kein Bild aus (bspw. alte Version von Skype), andere Programme funktionieren.

  • Videobild steht kopf:

    • Um die Lage auch für andere Kameras zu korrigieren oder die Kamera auch manuell anders einzurichten, gibt es mit der v4l1compat.so-Library auch die Möglichkeit, die Lage selbst mit einer zusätzlichen Variable einzustellen. Dazu muss vor die Variable LD_PRELOAD eine weitere Variable LIBV4LCONTROL_FLAGS gesetzt werden, in der die Lage bestimmt wird:

      • LIBV4LCONTROL_FLAGS=0 # Keine Änderung

      • LIBV4LCONTROL_FLAGS=1 # Drehen um waagerechte Achse

      • LIBV4LCONTROL_FLAGS=2 # Drehen um senkrechte Achse

      • LIBV4LCONTROL_FLAGS=3 # Drehen um waagerechte und senkrechte Achse

      • LIBV4LCONTROL_FLAGS=[4,5,6,7] # Drehung um 90 Grad (und Kombinationen mit o.g.Flips)

Diese Revision wurde am 11. Januar 2024 18:13 von karzer erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Hardware, Webcam