Wechseln zu: Navigation, Inhalt, Suche

Permalink

12

HowTo: Webcam mit MJPG-Streamer als Netzwerkkamera nutzen

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

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

Quellcode herunterladen und kompilieren

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.

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:

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

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:

mjpg_streamer.initd
#! /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: https://webprosa.de/howto-webcam-mit-mjpg-streamer-als-netzwerkkamera-nutzen/
# Script URL:  https://webprosa.de/howto-webcam-mit-mjpg-streamer-als-netzwerkkamera-nutzen/snippets/mjpg_streamer.initd

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:

mjpg_streamer.default
# /etc/default/mjpg_streamer
## Defaults for MJPG-Streamer init.d script
# Author:      Thomas Maetz
# Article URL: https://webprosa.de/howto-webcam-mit-mjpg-streamer-als-netzwerkkamera-nutzen/
# Script URL:  https://webprosa.de/howto-webcam-mit-mjpg-streamer-als-netzwerkkamera-nutzen/snippets/mjpg_streamer.default

# Set ENABLED to 1 to enable mjpg_streamer's init-script
ENABLED=0

# Configuration of the input/output plugin
# More information: https://wiki.ubuntuusers.de/Archiv/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:

sudo wget images/mjpg_streamer.default.txt -O /etc/default/mjpg_streamer
sudo vi /etc/default/mjpg_streamer
sudo adduser www-data video
sudo wget images/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:

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.

12 Kommentare

  1. 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?

      1. 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

        1. 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. 😉

          1. 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

            1. 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.

  2. 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

  3. 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

  4. 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

Schreibe einen Kommentar