MJPG-Streamer
Archivierte Anleitung
Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.
Anmerkung: Das Projekt wurde lt. Sourceforge Projektseite vom Entwickler aus Zeitgründen eingestellt. Es gibt mit mjpg-streamer einen Fork / Nachfolgeprojekt
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
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)
Befehl zum Installieren der Pakete:
sudo apt-get install build-essential libjpeg-dev imagemagick subversion libv4l-dev checkinstall
Oder mit apturl installieren, Link: apt://build-essential,libjpeg-dev,imagemagick,subversion,libv4l-dev,checkinstall
Der aktuelle Quelltext wird aus dem SVN-Projektarchiv heruntergeladen
svn co svn://svn.code.sf.net/p/mjpg-streamer/code/ 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[2]
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 [1]. 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 <device> | Gerätename (z.B. /dev/video0) |
-r <Auflösung> | Gewünschte Auflösung (z. B. 640x480) | ||
-f <Bildwiederholrate> | 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 <Verzeichnis> | Speicherort (z.B. /home/<user>/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 <Anweisung> | Führt einen Befehl nach dem Speichern des Bildes aus | ||
output_http.so | Erzeugt einen HTTP fähigen Stream | -w <Verzeichnis> | Speicherort der Webinterface-Dateien (es sollte /usr/local/www angegeben werden) |
-p <Port> | 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.
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.
Keine Streams im MJPEG-Format¶
In Revision 182 ist die MJPG-Unterstützung defekt, d.h. es ist somit nur eine Anzeige im YUVY-Format möglich. Dies kostet aber mehr unnötig Rechenleistung, wenn die Kamera direkt das MJPG-Format unterstützt.
Mit diesem Patch aus dem raspberrypi-Forum 🇬🇧 lässt sich dieser Umstand beheben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | --- plugins/input_uvc/input_uvc.c (revision 174) +++ plugins/input_uvc/input_uvc.c (working copy) @@ -405,9 +405,13 @@ if(pcontext->videoIn->formatIn == V4L2_PIX_FMT_YUYV) { DBG("compressing frame from input: %d\n", (int)pcontext->id); pglobal->in[pcontext->id].size = compress_yuyv_to_jpeg(pcontext->videoIn, pglobal->in[pcontext->id].buf, pcontext->videoIn->framesizeIn, gquality); + /* copy this frame's timestamp to user space */ + pglobal->in[pcontext->id].timestamp = pcontext->videoIn->buf.timestamp; } else { DBG("copying frame from input: %d\n", (int)pcontext->id); - pglobal->in[pcontext->id].size = memcpy_picture(pglobal->in[pcontext->id].buf, pcontext->videoIn->tmpbuffer, pcontext->videoIn->buf.bytesused); + pglobal->in[pcontext->id].size = memcpy_picture(pglobal->in[pcontext->id].buf, pcontext->videoIn->tmpbuffer, pcontext->videoIn->tmpbytesused); + /* copy this frame's timestamp to user space */ + pglobal->in[pcontext->id].timestamp = pcontext->videoIn->tmptimestamp; } #if 0 @@ -418,8 +422,6 @@ prev_size = global->size; #endif - /* copy this frame's timestamp to user space */ - pglobal->in[pcontext->id].timestamp = pcontext->videoIn->buf.timestamp; /* signal fresh_frame */ pthread_cond_broadcast(&pglobal->in[pcontext->id].db_update); Index: plugins/input_uvc/v4l2uvc.c =================================================================== --- plugins/input_uvc/v4l2uvc.c (revision 174) +++ plugins/input_uvc/v4l2uvc.c (working copy) @@ -450,6 +450,8 @@ */ memcpy(vd->tmpbuffer, vd->mem[vd->buf.index], vd->buf.bytesused); + vd->tmpbytesused = vd->buf.bytesused; + vd->tmptimestamp = vd->buf.timestamp; if(debug) fprintf(stderr, "bytes in used %d \n", vd->buf.bytesused); Index: plugins/input_uvc/v4l2uvc.h =================================================================== --- plugins/input_uvc/v4l2uvc.h (revision 174) +++ plugins/input_uvc/v4l2uvc.h (working copy) @@ -28,6 +28,7 @@ #include <stdio.h> +#include <stdint.h> #include <string.h> #include <fcntl.h> #include <unistd.h> @@ -105,6 +106,8 @@ int framecount; int recordstart; int recordtime; + uint32_t tmpbytesused; + struct timeval tmptimestamp; }; /* context of each camera thread */ |
Den Inhalt des Patches fügt man in eine Textdatei und speichert diese am Besten im Sourcecodeverzeichnis von MJPG-Streamer ab, z.B. als input_uvc_patch
Dann wechselt man in das Sourcecode-Verzeichnis von MJPG-Streamer und wendet den Patch mit diesem Befehl an:
patch -p0 < input_uvc_patch
Anschließend den Sourcecode kompilieren
make USE_LIBV4L2=true clean all
Die Installation kann über Debian-Checkinstall oder klassisch per make install
erfolgen
Jetzt sollte das Streaming von MJPEG-Inhalten wieder korrekt funktionieren.
Links¶
MJPG-streamer im Linupedia-Wiki 🇩🇪
HowTo: Webcam mit MJPG-Streamer als Netzwerkkamera nutzen 🇩🇪
Webcam Übersichtsartikel