Ganz unabhängig von der aktuellen Weltlage arbeite ich mittlerweile seit April 2020 in einem All-Remote-Job. Was da jeder braucht, ist eine Webcam. Ich wollte eigentlich zu Beginn des Jobs eine neue Kamera kaufen. Blöd nur, dass die überall ausverkauft waren und wenn sie lieferbar waren, dann erst Monate später zu Wucherpreisen.
Für mich musste also kurzfristig eine Alternative her, die sich auch mittelfristig durchgesetzt hat. Die im Laptop verbaute Webcam ist leider ziemlich unbrauchbar.
Meine Alternative ist die Nutzung meiner DSLR, die ich eigentlich zum Fotografieren besitze. Konkret besitze ich eine Canon EOS 700D. Diese Anleitung hier dokumentiert wie man diese Kamera als Webcam unter Linux zum Laufen bringt. Leider ist das nicht ganz so einfach und hat ein paar Einschränkungen, aber dazu gleich mehr.
Die Kamera habe ich per Mini-USB an meinen Rechner angeschlossen. Zusätzlich wird noch eine dauerhafte Stromzufuhr gebraucht. In diversen Online-Shops existieren Batterie-Adapter, die man per USB mit Strom füttern kann. Dieses Teil kostet so knapp 20 bis 30 Euro.
Auf der Seite der Software werden prinzipiell drei verschiedene Anwendungen gebraucht. Die Paketnamen beziehen sich auf ArchLinux, bei anderen Distributionen sind die Paketnamen aber ähnlich.
gphoto2
gstreamer
undgst-plugins-bad
v4l2loopback-dkms
Um genau zu sein, wird gphoto2
gebraucht, um das Kamerabild abzugreifen. Das
muss dann an gstreamer
gepipet werden, was den Videoinhalt dann in ein Video4Linux2
Loopback-Sink schickt. Anschließend ist die Kamera dann als Webcam verfügbar. Aber
zunächst der Reihe nach.
Nachdem man sich die oben genannten Pakete installiert hat, wird durch die
Installation von v4l2loopback-dkms
ein Kernel-Modul kompiliert. Dies wird
benötigt, damit man V4L2 Loopback Devices nutzen kann. Dies muss anschließend
auch noch geladen werden:
$ sudo modprobe v4l2loopback devices=1 video_nr=10 card_label="Canon 700D" exclusive_caps=1
An dieser Stelle habe ich nicht nur das reine Modul geladen, sondern habe noch ein
paar Optionen mitgegeben. devices
gibt lediglich an, dass es sich um ein einzelnes Gerät
handelt. Mit video_nr=10
gebe ich an, dass das Gerät unter /dev/video10
im System verfügbar ist. Mit card_label
gebe ich hingegen schlicht den Namen
an. Wichtig ist noch der Parameter exclusive_caps=1
: Ohne diesen Parameter
erkennt der Chrome die Kamera nicht als Webcam. Warum das so ist, hab ich nicht
ganz verstanden, ist mir aber egal, solange es funktioniert. Im Firefox und in
Zoom funktioniert das auch ohne diesen Parameter.
Nachdem also das Kernel-Modul geladen ist, muss ich folgenden Befehl verwenden, um das Gebastel zum Laufen zu kriegen:
$ gphoto2 --stdout --capture-movie | gst-launch-1.0 fdsrc ! decodebin3 name=dec ! queue ! videoconvert ! v4l2sink device=/dev/video10
Ein Nachteil dieser Methode ist, dass gphoto2
von der Kamera per USB nur das
Preview-Bild holt und es dem Rechner rüberreicht. Das Preview-Bild ist das Bild,
was auch auf dem eingebauten Display dargestellt wird. Das heißt in meinem Fall,
dass das kein HD-Bild ist, sondern nur eine Auflösung von 960x640 hat. Für den
Einsatz als Webcam ist das allerdings nicht weiter schlimm, da das Bild immer
noch besser ist als bei einer Standard-Full-HD-Webcam. Meistens findet dann
sowieso noch ein Herunterrechnen des Bildes statt.
Eine Alternative zu dieser Methode wäre die Nutzung einer HDMI-Capture-Card die das Signal vom HDMI-Ausgang in voller Auflösung abgreift. Da gescheite HDMI-Capture-Cards über 100 € kosten, hab ich getrost darauf verzichtet.
Um meinen Workflow ein wenig zu vereinfachen, lade ich das Kernel-Modul beim jeden Reboot automatisch und hab einen Alias gesetzt, um den langen Befehl schnell aufrufen zu müssen. Einfaches Plug-and-Play ist das nicht, komfortabel auch nicht. Aber es war eine einfache Lösung um den Kauf einer überteuerten und nicht-lieferbaren Webcam zu umgehen, da der Rest der Hardware schon vorhanden war. In der Dokumentation von gphoto auf gphoto.org sind alle Kamera-Modelle aufgelistet, die unterstützt werden.