Raspberry Pi, Kameramodul und Streaming

Seit einiger Zeit gibt es ein eigens für den Raspi gebautes Kameramodul. Die maximale Auflösung ist 2592 x 1944 Pixel bei Fotografien und 1920 × 1080 (Full HD) bei Videos. Sie ist relativ klein, kann mit vielen Optionen angesteuert werden und kostet bei Ebay um die 30 €.

DSC06588

Eine Anleitung wie man das Teil an den Raspberry klemmt findet sich  hier.
Nach dem Anschluss der Kamera ergibt sich ein eher simples aber doch zuerst zu lösendes Problem. Die Kamera braucht eine Halterung. Ich habe mal eine alte Nachtischlampe, eine Diskette – ich wusste das ich die Disketten irgendwann noch mal brauchen würde 🙂 und jede Menge Klebeband dafür genommen.

Softwareupdate

nachdem die Kamera angeschlossen ist führen wir auf der Konsole folgende Befehle aus:

sudo apt-get update
sudo apt-get upgrade

Speziell das Upgrade kann etwas dauern.

sudo raspi-config

startet ein Menü in dem wir die Kamera aktivieren müssen. Danach Neustart. Auf dem Raspberry befinden sich nun zwei weitere Programme die über die Konsole gestartet werden können. Raspistill für Fotos und Raspivid für Videos.

Fotografieren

der Befehl

raspistill -o test.jpg

erzeugt bereits ein Foto.  Wenn wir die Ausgabe noch in den Ordner des Apache umleiten

raspistill -o /var/www/test.jpg

kann man sich das Ergebnis schon im Browser anschauen. Hier noch einige Optionen:

raspistill -br 75 -co 75 -w 1280 -h 720 -o /var/www/test.jpg

-br 75 (Helligkeit) und -co 75 (Kontrast) lassen sich zwischen 0 und 100 einstellen. 75er Werte sind für eher dunkle Räume ganz gut. -w 1280 -h 720 bestimmen Höhe und Breite des Bildes.

Zeitrafferaufnahme

mit diesem Befehl erzeugen wir über einen bestimmten Zeitraum Einzelbilder:

raspistill -o /var/www/img_%04d.jpg -tl 5000 -t 3600000

%04d erzeugt eine vierstellige, fortlaufende Nummerierung der Bilder. -tl bestimmt das Intervall (in Millisekunden) und -t wie lange überhaupt Bilder gemacht werden sollen.

Aus den Einzelbildern ein Video machen geht entweder mit ffmpeg:

ffmpeg -qscale 5 -r 4 -b 9600 -i img_%04d.jpg zeitraffer.mp4

siehe hier die Manpage  für eine nähere Erklärung der Optionen.

Oder mit avconv:

avconv -r 10 -i img_%04d.jpg -r 10 -vcodec libx264 -crf 20 -g 15 zeitraffer.mp4

Hier eine englische Seite mit näheren Ausführungen dazu. Beide Programme müssen u.U. erst installiert werden. Entweder

sudo apt-get install ffmpeg

oder

sudo apt-get -y install libav-tools

Dringend Empfehlenswert ist es allerdings diese Operation auf einem leistungsstärkeren Rechner durchzuführen.

Video aufnehmen

der Befehl

raspivid -t 120000 -o /var/www/video.h264 -w 1920 -h 1080

erzeugt ein zwei Minuten langes Video.  Durch die Ausgabe in den www-Ordner kann man es bereits per Browser herunterladen.

Video streamen mit VLC

zunächst muss VLC installiert werden:

sudo apt-get install vlc

dann dieser Befehl:

raspivid -o - -t 9999999 -w 640 -h 360 -fps 25 | cvlc stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264

Die Option -o – schickt das Video ins Datennirvana so das kein Video als File gespeichert wird.  Hinter der Pipe stehen die Optionen für cvlc. Wichtig ist hier erstmal nur die Einstellung des Port 8090.
Aufrufen kann man den Stream in VLC nun unter: Medien->Netzwerkstream öffnen
und dort eintragen:

http://:8090

leider ruckelt der Stream, hat Artefakte und eine Verzögerung von mindestens einer Sekunde der im laufendem Betrieb immer länger wird. Ich habe Aussetzer bis zu 10 Sekunden beobachtet. Außerdem habe ich alle paar Sekunden diese Fehlermeldung auf der Konsole:

[0xXXXXXX] main input error: ES_OUT_RESET_PCR called
[0xXXXXXX] main input error: ES_OUT_SET<GROUP_>PCR is called to late <pts_delay increased to XXXX ms>.
(der “XXXX ms”-Wert steigt dabei immer weiter an)

Trotz stundenlangem googeln bin ich zu keinem Lösungsansatz vorgedrungen, außer vielleicht dieser Anleitung, die auf der Erzeugung von Playlists beruht. Das werde ich aber nicht ausprobieren. Zitat:

The concept behind this streaming is that short segments of files, at least 5 seconds long are recorded and saved to a proper file. The playlist file is updated with the new file name and the client always polls this playlist and downloads the most recent file. 

...

You need to compile ffmpeg - DO NOT USE APT-GET INSTALL FOR FFMPEG
This can take up to 5 hours

Link dazu

MJPEG streamen

dabei muss man nur dieser Anleitung folgen. Hier die Befehle mal kurz zusammengefasst:

 

sudo apt-get install libjpeg8-dev imagemagick libv4l-dev
sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
wget http://sourceforge.net/code-snapshots/svn/m/mj/mjpg-streamer/code/mjpg-streamer-code-181.zip
unzip mjpg-streamer-code-181.zip

cd mjpg-streamer-code-181/mjpg-streamer

make mjpg_streamer input_file.so output_http.so

sudo cp mjpg_streamer /usr/local/bin

sudo cp output_http.so input_file.so /usr/local/lib/

sudo cp -R www /usr/local/www

soweit die Installation. Nun Raspistill starten:

mkdir /tmp/stream
raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &

Wer sich angesichts begrenzter Schreibzyklen bei -tl 100 Sorgen um seine SD-Karte macht kann getrost auf ein Bild/Sekunde ( -tl 1000) heruntergehen.  Der MJPG-Streamer zeigt bei mir eh höchstens 1,6 Frames/Sekunde an.

und danach:

LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -w /usr/local/www"

allerdings wollte der MJPG-Streamer bei mir zuerst nicht starten weil der Standardport 8080 bereits belegt war. (vermutlich von dem Programm Motion mit dem ich schonmal eine USB-Webcam betrieben habe) Lösung war, dem Aufruf die Option -p 5555 mitzugeben. Also so:

LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -p 5555 -w /usr/local/www"

Hier noch mehr Optionen. Danach kann man im Browser den Raspberry mit <die.IP.vom.Raspi>:5555 aufrufen.
Der MJPG-Streamer erzeugt nicht einfach nur ein Bild sondern eine richtige Webseite die verschiedene Betriebsarten anbietet.

Beenden lassen sich die beiden Programme auch wieder:

sudo killall raspistill
sudo killall mjpg_streamer

p.s.

die rote LED der Kamera lässt sich dauerhaft abschalten. In der config.txt im /boot-Verzeichnis diesen Eintrag einfügen:

disable_camera_led=1

 

Bauteile (Bezugsquellen):

eBay: Raspberry Pi
Raspberry Pi Kamera
Amazon: Raspberry Pi
Raspberry Pi Kamera

Gut?

Facebooktwittergoogle_plusredditpinterestlinkedinmailFacebooktwittergoogle_plusredditpinterestlinkedinmail