MJPG-Streamer

24.04.2021

MJPG-Streamer

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Ein Terminal öffnen
  2. Programme kompilieren
  3. Ein Programm starten

MJPG-Streamer ist ein Werkzeug für die Kommandozeile, mit dem sich Videodaten von einer Webcam oder einer anderen Videoquelle als Motion-JPEG (M-JPEG/MJPG) streamen lassen. Während moderne Netzwerkkameras einen solchen Stream automatisch erzeugen, kann mit Hilfe des Programms auch eine einfache Webcam mittels eines Rechners mit Internet-Zugang zu einer solchen umfunktioniert werden.

Voraussetzungen

Zum Betrieb eines Webstreams muss die Webcam zunächst korrekt eingerichtet sein. Bei einigen Modellen muss zunächst ein Treiber für Video 4 Linux 2 installiert werden. Wenn die Kamera aber unter anderen Programmen funktioniert, entfällt dieser Schritt.

Installation

MJPG-streamer ist nicht in den offiziellen Paketquellen enthalten und muss selber kompiliert werden, dafür werden folgende Pakete benötigt:

  • build-essential
  • libjpeg-dev
  • imagemagick
  • subversion
  • libv4l-dev (optional)
  • checkinstall (optional)

Paketliste zum Kopieren:

sudo apt-get install build-essential libjpeg-dev imagemagick subversion libv4l-dev checkinstall

sudo aptitude install build-essential libjpeg-dev imagemagick subversion libv4l-dev checkinstall

Der aktuelle Quelltext wird aus dem SVN-Projektarchiv heruntergeladen

svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer

Nun wechselt man in das erstellte Verzeichnis mjpg-streamer/mjpg-streamer.

cd mjpg-streamer/mjpg-streamer

und kompiliert bzw. installiert das Programm entweder auf die klassische Weise

make sudo make install

oder mit checkinstall (dann kann das Programm leicht wieder deinstalliert werden).

VERSION=$( sed -n '/SOURCE_VERSION/s/^.*"(.*)".*$/1/gp' < mjpg_streamer.h )
REVISION=$( svnversion -cn | sed "s/.*://" )
sudo checkinstall --pkgname=mjpg-streamer --pkgversion="$VERSION+$REVISION~checkinstall" --default

Dabei ist VERSION die aktuelle Versionsnummer von MJPG-streamer und REVISION die aktuelle Revision im Versionsverwaltungssystem. Zusammengesetzt könnte die Paketversion also z. B. 2.0+172~checkinstall heißen.

mit Video 4 Linux

Wenn man das Paket libv4l-dev installiert hat, kann man diese Bibliothek mit herein kompilieren:

make USE_LIBV4L2=true

Dadurch sind bei manchen Kameras weitere Einstellungen möglichen und man kann viel mehr Auflösungen wählen.

Benutzung/Konfiguration

Die Bedienung von MJPG-streamer erfolgt über die Kommandozeile. Die Einstellungen erfolgen über die Parameter beim Aufruf, ab Version 2.0 lautet dieser

mjpg_streamer -i "<Input-Plugin> <Input-Optionen>" -o "<Output-Plugin> <Output-Optionen>"

Hinweis:

In älteren Versionen hieß das Programm mjpg-streamer. Der Artikel bezieht sich jedoch immer auf die neue Version 2.0.

Plugins

Die Hilfe zu allen Plugins kann mit

mjpg_streamer -i "<Input-Plugin> --help"

aufgerufen werden. Die folgende Tabelle zeigt die wichtigsten Plugins:

  • Input

  • Plugin

  • Funktion

  • Optionen

  • Eingabe

input_testpicture.so

Testbild

-d <Verzögerung>

Bildintervall in Sekunden (z.B. 5)

-r <Auflösung>

Gewünschte Auflösung: 960x720, 640x480, 320x240 oder 160x120

input_uvc.so

Liest Daten aus der Kamera

-d

Gerätename (z.B. /dev/video0)

-r <Auflösung>

Gewünschte Auflösung (z. B. 640x480)

-f

Framerate in Bilder pro Sekunde (z.B. 20)

-q <Bildqualität>

Qualität der JPEG Kompression (z. B. 85 für 85% Bildtreue)

-y

Zeichnet die Farbwerte in YUVY auf (wenn die Kamera MJPEG nicht unterstützt)

  • Output

  • Plugin

  • Funktion

  • Optionen

  • Eingabe

output_file.so

Speichert die Aufnahme in JPEG Dateien

-f

Speicherort (z.B. /home//webcam/)

-d <Verzögerung>

Bildintervall in Sekunden (z.B. 5)

-b <Änderung>

Speichert nur bei Veränderung des Bildinhalts über n Bytes (z.B. 64)

-c

Führt einen Befehl nach dem Speichern des Bildes aus

output_http.so

Erzeugt einen HTTP fähigen Stream

-w

Speicherort der Webinterface-Dateien (es sollte /usr/local/www angegeben werden)

-p

Port auf dem der Stream gesendet wird (z. B. 8080)

-c user:pass

Weist dem Stream einen Usernamen und ein Passwort zu

Webstream testen

Um einen Webstream von /dev/video0 auf localhost Port 8080 zu erzeugen, wird MJPG-streamer mit den folgenden Parametern gestartet:

export LD_LIBRARY_PATH=/usr/local/lib
mjpg_streamer -i "input_uvc.so -d /dev/video0" -o "output_http.so -p 8080 -w /usr/local/www"

Dabei gibt LD_LIBRARY_PATH=/usr/local/lib das Verzeichnis an, in das die Plugins installiert wurden. Die Option -w /usr/local/www gibt das Verzeichnis des installieren Webinterface an.

In der Konsole sollte die folgende Ausgabe erscheinen:

MJPG Streamer Version.: 2.0
     i: Using V4L2 device.: /dev/video0
     i: Desired Resolution: 640 x 480
     i: Frames Per Second.: 5
     i: Format............: MJPEG
     o: www-folder-path...: /usr/local/www/
     o: HTTP TCP port.....: 8080
     o: username:password.: disabled
     o: commands..........: enabled

Um sich den Stream anzusehen, ruft man im Browser die Adresse http://localhost:8080 auf. Dann muss das Webinterface erscheinen. Dort kann der Stream als Standbild und als MJPG-, Java- oder Javascript-Livestream abgerufen werden. Der MJPG-Stream http://localhost:8080/?action=stream kann auch mit VLC geöffnet werden.

MJPG-streamer automatisch starten

Damit MJPG-streamer beim Systemstart automatisch gestartet wird, erzeugt man die Konfigurationsdatei /etc/init/mjpg_streamer.conf für Upstart:

description "MJPG-streamer /dev/video0"
start on runlevel \[2345\]
stop on runlevel \[016\]
script
    export LD_LIBRARY_PATH=/usr/local/lib
    mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 352x288" -o "output_http.so -p 8080 -w /usr/local/www -c joe:bean" >> /var/log/mjpg_streamer_upstart.log 2>&1
end script

Im Vergleich zu oben wurde hier zusätzlich eine Auflösung von 352x288 eingestellt und der Zugang auf den Nutzer joe (Passwort bean) beschränkt. Das Skript muss ausführbar gemacht werden:

sudo chmod u+x /etc/init/mjpg_streamer.conf

Wie andere Dienste kann MJPG-streamer nun mit

sudo service mjpg_streamer \[ start | stop \]

gestartet bzw. beendet werden. Beim Systemstart wird MJPG-streamer nun automatisch gestartet.

Fehlerbehebung

Could not find input/output plugin

Wenn MJPG-streamer die Ein- und Ausgabe-Plugins nicht findet

MJPG Streamer Version.: 2.0
ERROR: could not find input plugin
       Perhaps you want to adjust the search path with:
       # export LD_LIBRARY_PATH=/path/to/plugin/folder
       dlopen: input_uvc.so: cannot open shared object file: No such file or directory

liegt das daran, dass ihr Verzeichnis nicht in der Umgebungsvariable LD_LIBRARY_PATH steht. Die Plugins werden nach /usr/local/lib installiert, demnach wird vor der Ausführung von MJPG-streamer folgender Befehl benötigt:

export LD_LIBRARY_PATH=/usr/local/lib

Unable to set format: XX.

Sollte beim Start der Aufnahme eine Meldung wie

Unable to set format: 5.
     Init v4L2 failed !! exit fatal 
     i: init_VideoIn failed

erscheinen, hilft es in der Regel, die Kamera kurz vom USB-Port abzuziehen und/oder in einen anderen Port zu stecken. Es kann aber auch sein, dass die Kamera MJEPG nicht unterstützt, dann hilft die Option -y um auf YUVY umzuschalten

mjpg_streamer -i "input_uvc.so -d /dev/video0 -y" -o "output_http.so"

no www-folder configured

Sollte im Browser die folgende Meldung erscheinen:

501: Not Implemented! no www-folder configured

Wurde Option -w zur Angabe des Verzeichnisses des Webinterface vergessen. Man kann den Stream aber trotzdem unter der Adresse http://localhost:8080/?action=stream bzw. http://localhost:8080/?action=snapshot erreichen.