= 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 [:Gerätemanager/#USB: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: {{{#!vorlage Befehl 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 [mark]046d:081b[/mark] 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 [http://www.linux-usb.org/usb-ids.html 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 {{{#!vorlage Befehl 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: {{{#!vorlage Befehl journalctl -f }}} oder (alt) {{{#!vorlage Befehl 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: [mark]uvcvideo[/mark]: Found UVC 1.00 device (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 [mark]uvcvideo[/mark] 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 [:Gerätemanager/#hwinfo: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: [:Webcam#Untersttzte Webcams:siehe Tabelle] Die Kernel-Treiber sind in der V4L2-Kernel API integriert, die wie folgt dokumentiert ist: * Konfigurationen: [https://linuxtv.org/downloads/v4l-dvb-apis-new/admin-guide/v4l-drivers.html Media subsystem admin and user guide] {en} * Treiber-Spezifikationen: [https://linuxtv.org/downloads/v4l-dvb-apis-new/driver-api/drivers/index.html Media subsystem kernel internal API] {en} * Übersicht über die V4L2 Schnittstelle: [https://linuxtv.org/downloads/v4l-dvb-apis/ Kernel Dokumentation Media subsystem] {en} = 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: [[Vorlage(Paketinstallation, "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: {{{#!code bash 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: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: {{{#!code bash 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/.desktop ~/.local/share/applications/.desktop }}} und ~/.local/share/applications/''program''.desktop editieren. Die gesuchte Zeile beginnt mit {{{ Exec= ... }}} 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 ... }}} Zum Schluss eine Script-Datei mit Pfad und Namen: '''/usr/local/bin/myprogram''' und dem folgenden Inhalt erstellen: {{{#!code bash #!/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: {{{#!code bash chmod a+x /usr/local/bin/myprogram }}} Der Aufruf der modifizierten Version des Programms erfolgt dann einfach mit {{{#!code bash myprogram }}} (sofern der lokale Prad in der $PATH Variable enthalten ist) === Mögliche Fehlerbilder === * folgende Fehlermeldung tritt auf: {{{ ERROR: ld.so: object '/usr/lib/x86_64-linux-gnu/libv4l/v4l1compat.so' 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: {{{#!code bash 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 [launchpad:260918:260918] und [https://bugs.launchpad.net/ubuntu/+source/libv4l/+bug/260918/comments/112 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) #tag: Webcam, Hardware