[[Vorlage(Archiviert, "Das Projekt wurde lt. Sourceforge Projektseite vom Entwickler aus Zeitgründen eingestellt. Es gibt mit [github:jacksonliam/mjpg-streamer:mjpg-streamer] einen Fork / Nachfolgeprojekt".)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:Programme_kompilieren:] [:Programme_starten: Ein Programm starten] }}} [[Inhaltsverzeichnis(2)]] [[Bild(Wiki/Icons/Oxygen/camera-web.png, 48, align=left)]] [sourceforge:mjpg-streamer:MJPG-Streamer] {en} ist ein Werkzeug für die Kommandozeile, mit dem sich Videodaten von einer Webcam oder einer anderen Videoquelle als [wikipedia:MJPEG:Motion-JPEG] (M-JPEG/MJPG) streamen lassen. Während moderne [wikipedia:Netzwerkkamera: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 [http://linuxtv.org/wiki Video 4 Linux 2] {en} 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: {{{#!vorlage Paketinstallation build-essential libjpeg-dev imagemagick subversion libv4l-dev, optional checkinstall, optional }}} Der aktuelle Quelltext wird aus dem SVN-Projektarchiv heruntergeladen {{{#!vorlage Befehl svn co svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer }}} Nun wechselt man in das erstellte Verzeichnis '''mjpg-streamer/mjpg-streamer'''. {{{#!vorlage Befehl cd mjpg-streamer/mjpg-streamer }}} und kompiliert bzw. installiert das Programm entweder auf die klassische Weise[2] {{{#!vorlage Befehl make sudo make install }}} oder mit `checkinstall` (dann kann das Programm leicht wieder deinstalliert werden). {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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 {{{#!vorlage Befehl mjpg_streamer -i " " -o " " }}} {{{#!vorlage 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 {{{#!vorlage Befehl mjpg_streamer -i " --help" }}} aufgerufen werden. Die folgende Tabelle zeigt die wichtigsten Plugins: ||<-4 tablestyle="width: 90%;" rowclass="titel"> Input|| || Plugin||Funktion||Optionen||Eingabe|| ||<|2 cellstyle="text-align: center;"> '''input_testpicture.so''' || <|2 cellstyle="text-align: left;">Testbild || ``-d`` || Bildintervall in Sekunden (z.B. 5) || || ``-r`` || Gewünschte Auflösung: 960x720, 640x480, 320x240 oder 160x120 || ||<|5 cellstyle="text-align: center;"> '''input_uvc.so''' ||<|5 cellstyle="text-align: left;"> Liest Daten aus der Kamera || ``-d`` || Gerätename (z.B. '''/dev/video0''')|| || ``-r`` || Gewünschte Auflösung (z. B. 640x480)|| || ``-f`` || Framerate in Bilder pro Sekunde (z.B. 20)|| || ``-q`` ||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)|| ||<-4 tablestyle="width: 90%;" rowclass="titel"> Output|| || Plugin||Funktion||Optionen||Eingabe|| ||<|4 cellstyle="text-align: center;"> '''output_file.so''' ||<|4 cellstyle="text-align: left;"> Speichert die Aufnahme in JPEG Dateien || ``-f`` || Speicherort (z.B. '''/home//webcam/''')|| || ``-d`` || 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|| ||<|3 cellstyle="text-align: center;"> '''output_http.so''' ||<|3 cellstyle="text-align: left;">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`` || 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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 {{{#!vorlage Befehl 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 [https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=97983 raspberrypi-Forum] {en} lässt sich dieser Umstand beheben. {{{#!code c --- 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 +#include #include #include #include @@ -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: {{{#!vorlage Befehl patch -p0 < input_uvc_patch }}} Anschließend den Sourcecode kompilieren {{{#!vorlage Befehl 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 = * [http://www.linupedia.org/opensuse/MjpegStreamer MJPG-streamer] im Linupedia-Wiki {de} * [http://webprosa.de/howto-webcam-mit-mjpg-streamer-als-netzwerkkamera-nutzen/ HowTo: Webcam mit MJPG-Streamer als Netzwerkkamera nutzen] {de} * [http://steamforge.net/wiki/index.php/How_to_Install_ZoneMinder_under_Ubuntu_12.04_Server How to Install ZoneMinder under Ubuntu 12.04 Server] {en} * [:Webcam:] {Übersicht} Übersichtsartikel * [https://bugs.launchpad.net/ubuntu/+bug/282464 Bug: needs-packaging: mjpg-streamer] {en} # tag: Multimedia, Webcam