Netzwerkkameras sind zweifelsohne praktisch, egal ob man vorhat Einbrecher abzuschrecken oder von unterwegs zu Hause nach dem Rechten sehen will. Steht aber kein teures Exemplar zur Verfügung, lässt sich auch eine einfache Webcam mit der entsprechenden Software hierfür verwenden. Unter Linux stehen zahlreiche Möglichkeiten zur Verfügung. Es muss jedoch nicht immer gleich eine voll ausgewachsene Lösung wie ZoneMinder sein. Eine leichtgewichtige Alternative, die ich vorstellen möchte, ist der MJPG-Streamer. Dank dem Linux-UVC-Treiber ist er mit vielen Webcams kompatibel und lässt sich schnell einrichten.
Ich setze an dieser Stelle voraus, dass die Kamera mit Linux kompatibel ist und schon unter anderen Programmen funktioniert. Zur Installation von MJPG-Streamer empfiehlt es sich, nicht das vorhandene Paket zu verwenden, da es ein Problem mit dem Dateinamen gibt. Stattdessen lädt man den Quellcode per Subversion (SVN) herunter und kompiliert das Programm anschließend selbst.
Die notwendigen Pakete installieren
1 2 |
sudo apt-get update sudo apt-get install build-essential libjpeg-dev imagemagick subversion libv4l-dev checkinstall |
Quellcode herunterladen und kompilieren
1 2 3 4 5 6 |
svn co svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer cd mjpg-streamer/mjpg-streamer make USE_LIBV4L2=true 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 |
Durch die Option USE_LIBV4L2=true
sind weitere Einstellungen und Auflösungen verfügbar. Die Installation per checkinstall
hat den Vorteil, dass man das Paket mittels sudo dpkg -r mjpg-streamer
deinstallieren kann, wenn man es nicht mehr braucht.
MJPG-Streamer kann nun auf der Kommandozeile gestartet werden und streamt dann die Videodaten als Motion-JPEG (MJPEG). Auf die Konfiguration wird ausführlich im ubuntuusers.de Wiki eingegangen, weswegen ich hier nur exemplarisch zwei Möglichkeiten zeige.
1 2 |
export LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_uvc.so -d /dev/video0 -f 15 -r 640x480" -o "output_http.so -p 8080 -w /usr/local/www -p 8080 -c benutzername:passwort" |
Wenn die Kamera MJPEG nicht unterstützt, hilft es die Option -y
anzufügen, um auf YUVY umzuschalten:
1 2 |
export LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_uvc.so -d /dev/video0 -f 15 -r 640x480 -y" -o "output_http.so -p 8080 -w /usr/local/www -p 8080 -c benutzername:passwort" |
Das Starten des Webstreams wird wie folgt quittiert
1 2 3 4 5 6 7 8 9 |
MJPG Streamer Version.: 2.0 i: Using V4L2 device.: /dev/video0 i: Desired Resolution: 640 x 480 i: Frames Per Second.: 15 i: Format............: MJPEG o: www-folder-path...: /usr/local/www/ o: HTTP TCP port.....: 8080 o: username:password.: benutzername:passwort o: commands..........: enabled |
Das Webinterface, über das die verschiedenen Streams aufgerufen werden können, ist nun unter http://localhost:8080/
erreichbar.
Je nachdem, auf welcher Plattform man unterwegs ist und was man mit dem Video machen möchte, werden verschiedene Varianten angeboten. Unter Android 4.0 funktionierte bei mir beispielsweise nur die Javascript-Variante.
Mit folgendem Init-Skript ist es möglich, MJPG-Streamer automatisch zu starten:
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
#! /bin/sh ### BEGIN INIT INFO # Provides: mjpg_streamer # Required-Start: $local_fs $remote_fs networking # Required-Stop: $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Starts the MJPG-Streamer # Description: Starts the MJPG-streamer, # if it is enabled in /etc/default/mjpg_streamer. ### END INIT INFO ## MJPG-Streamer init.d script # Author: Thomas Maetz # Article URL: http://webprosa.de/howto-webcam-mit-mjpg-streamer-als-netzwerkkamera-nutzen/ # Script URL: http://webprosa.de/wp-content/uploads/2012/03/mjpg_streamer.initd.txt PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DESC="MJPG-Streamer" NAME=$(command basename "${0}") # Set defaults ENABLED=0 INPUT_PLUGIN="input_uvc.so" OUTPUT_PLUGIN="output_http.so" # Read configuration variable file if it is present [ -r "/etc/default/${NAME}" ] && . "/etc/default/${NAME}" DAEMON="/usr/local/bin/mjpg_streamer" PIDFILE="/var/run/${NAME}.pid" SCRIPTNAME="/etc/init.d/${NAME}" export LD_LIBRARY_PATH=/usr/local/lib # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions if [ "$ENABLED" != "1" -a "$1" != "stop" ]; then log_warning_msg "Not starting $DESC - edit /etc/default/mjpg-streamer and change ENABLED to be 1."; exit 0; fi # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started start-stop-daemon --start --make-pidfile --background --quiet --pidfile "$PIDFILE" --exec "$DAEMON" --chuid "$USER" --test > /dev/null \ || return 1 start-stop-daemon --start --make-pidfile --background --quiet --pidfile "$PIDFILE" --exec "$DAEMON" --chuid "$USER" -- \ -i "$INPUT_PLUGIN" -o "$OUTPUT_PLUGIN" \ || return 2 # Add code here, if necessary, that waits for the process to be ready # to handle requests from services started subsequently which depend # on this one. As a last resort, sleep for some time. } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --make-pidfile --quiet --retry=TERM/1/KILL/5 --pidfile $PIDFILE --name $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. start-stop-daemon --stop --quiet --oknodo --retry=0/1/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; restart|force-reload) # # If the "reload" option is implemented then remove the # 'force-reload' alias # log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: ${SCRIPTNAME} {start|stop|restart|force-reload}" >&2 exit 3 ;; esac : |
Die dazu passende Konfigurationsdatei sieht so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# /etc/default/mjpg_streamer ## Defaults for MJPG-Streamer init.d script # Author: Thomas Maetz # Article URL: http://webprosa.de/howto-webcam-mit-mjpg-streamer-als-netzwerkkamera-nutzen/ # Script URL: http://webprosa.de/wp-content/uploads/2012/03/mjpg_streamer.default.txt # Set ENABLED to 1 to enable mjpg_streamer's init-script ENABLED=0 # Configuration of the input/output plugin # More information: http://wiki.ubuntuusers.de/MJPG-Streamer#Plugins INPUT_PLUGIN="input_uvc.so -d /dev/video0 -f 15 -r 640x480" OUTPUT_PLUGIN="output_http.so -p 8080 -w /usr/local/www -p 8080 -c benutzername:passwort" # The daemon should never be run as root. It is recommended to run it # under the website user id (usually www-data:www-data) to prevent file # ownership issues. USER="www-data:www-data" |
Um beide zu installieren und gegebenenfalls anzupassen geht man wie folgt vor:
1 2 3 4 5 6 |
sudo wget http://webprosa.de/wp-content/uploads/2012/03/mjpg_streamer.default.txt -O /etc/default/mjpg_streamer sudo vi /etc/default/mjpg_streamer sudo adduser www-data video sudo wget http://webprosa.de/wp-content/uploads/2012/03/mjpg_streamer.initd.txt -O /etc/init.d/mjpg_streamer sudo chmod 755 /etc/init.d/mjpg_streamer sudo /etc/init.d/mjpg_streamer start |
Anschließend muss das Init-Skript nur noch zum Autostart hinzugefügt werden:
1 |
sudo update-rc.d mjpg_streamer defaults |
Es ist klar, dass MJPG-Streamer keine vollwertige Netzwerkkamera ersetzen kann. Für den Fall, dass man einen Computer hat, der sowieso durchgehend läuft, oder einfach nur schnell einen Netzwerkstream aufsetzen möchte, ist die allerdings Software ideal.
Hallo, ich bin genau nach Anleitung vorgegangen, wenn ich den Stream aber nun starten will bekomme ich nur das zurück:
MJPG Streamer Version: svn rev: 3:172
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
Kannst du mir helfen? Was ist da schief gelaufen?
Danke für den Hinweis! 🙂
Ich habe das HowTo entsprechend angepasst und es müsste nun wieder funktionieren.
Danke, das hat geklappt aber ruckelt der stream bei dir auch so extrem, ich habe 15fps und 30 fps versucht aber es kommt kein flüssiges bild zu Stande. Es ruckelt immer und laut JAvascript kommen auch nur 3-5 fps raus
Bei mir ist der Stream bei 15 fps relativ flüssig, mit JavaScript kommen im Durchschnitt 12 fps an. Welche Auflösung hast Du denn eingestellt?
Ich habe übrigens gerade auch noch ein Init-Skript erstellt und im Artikel eingefügt, mit dem man MJPG-Streamer automatisch starten kann. 😉
Mhh komisch, ich habe die gleiche wie du, eigentlich alles genau wie hier, trotzdem ruckelt der stream sehr stark. Hier zu sehen: http://albummi-dd.myftp.org:8181/javascript.html
Wenn der Stream über DSL übertragen wird, kann das Ruckeln auch daher kommen, dass der Upload nicht ausreicht, um alle Bilder hochzuladen.
Angenommen ein Bild hat eine Größe von 60 kB und es werden im Durchschnitt 0,8 fps übertragen, so entspricht dies ungefähr einem Upload von 400 kBit/s. Da stoßen manche Anschlüsse schon an ihre Grenzen.
Habe lokal genau das gleiche bild, leider
inzwischen ist das packet hier zu laden.
also svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/ mjpg-streamer
anstatt
svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
Ich habe den Link aktualisiert. 🙂
Hi,
bei dem Versuch die xdatei init,d von deinem Vezeichnis wp-content kommt
Fehler Meldung 404 das heisst die Seite gibt nicht oder nicht mehr.
Kannst du weiter helfen ?
Gruß.
Martin Speiser
Bei mir funktioniert es. Möglicherweise war es ein temporäres Problem.
Hallo,
benutze den Streamer mit einem Raspberry Pi, läuft auch super, wie kann ich aber Abens auf schwarz/weiss umschalten, die Bilder sind dann besser.
Habe Picam mit mechanischem IR Filter, der funktioniert auch mit den IR LED\’s.
Grüße