Zeitraffer / Timelapse aus Bildern, die Webcams liefern
Ich hatte relativ ausführlich beschrieben, wie man ein Zeitraffer / Timelapse nur mit Open-Source-Tools erstellen kann – inklusive ausrichten mit Hugin, entflackern und so weiter.
Nun wurde ich gefragt, ob das auch mit Webcams machbar ist und wie ich das machen würde. Genauer gesagt gibg es um diese Webcam:
http://www.tv-fdz.de/deutsch/aktuell/webcams/born
Die Idee gefällt mir gut. Ich dachte, das ist es wert, mit anderen zu teilen.
Das ist in diesem Fall recht einfach und wget erledigt diesen Job. Die URL des Bildes ist http://webcams.stoneds.de/born/cam/hafen-born.jpg und das Bild wird minütlich überschrieben. Also bemühen wir die Bash und wget und schreiben ein kleines Script.
Ich habe das mal in eine Endlosschleife gepackt und man müsste das Script manuell abbrechen. Packe die nachfolgenden Zeilen in eine Datei, die sich zum Beispiel get-pic.sh nennt (natürlich ohne die Nummerierung!):
#!/bin/bash
COUNTER=0
while [ true ] ; do
COUNTER=$((COUNTER + 1))
/usr/bin/wget http://webcams.stoneds.de/born/cam/hafen-born.jpg --output-document=$COUNTER.jpg
sleep 60
done
Hier noch eine Anmerkung aus dem Kommentar unten – vielen Dank dafür! Besser ist es wohl, Datum und Uhrzeit für die Bilder zu verwenden, damit man bei der Reihenfolge keine Probleme bekommt. Die Zeile würde dann entsprechend so aussehen:
/usr/bin/wget http://webcams.stoneds.de/born/cam/hafen-born.jpg --output-document=hafen-born-$(date +"%m%d_%H%M").jpg
Die Datei get-pic.sh steckst Du nun in ein Verzeichnis Deiner Wahl, wo die Bilder hinterlegt werden sollen. Danach rufst Du die Datei einfach mit sh get-pic.sh
auf und schon geht es los.
Alternativ könntest Du die Datei noch mittels chmod +x get-pics.sh
ausführbar machen und dann mit ./get-pics.sh
ausführen.
Das Script fängt also an und holt ein Bild. Speichert dies danach unter 1.jpg ab. Dann schläft das Script eine Minute (60 Sekunden) und COUNTER wird um 1 hochgezählt. Das nächste Bild wird also 2.jpg genannt. So geht das Spiel weiter.
Für den Fall, dass wget bei Dir nicht im Verzeichnis /usr/bin/ liegt (falls installiert – befindet sich zumindest in fast jedem Linux-Repository), findest Du den korrekten Pfad mit
which wget
heraus.
Vorsicht: Startest Du das Script neu, werden die Dateien überschrieben! Der COUNTER steht ja wieder auf 0. Man könnte eine Prüfung einbauen und den COUNTER so lange hoch zählen lassen, bis eine Datei nicht mehr existiert. Eine existierende Datei überprüfst Du so:
if [ -f ./$COUNTER.jpg ]; then
echo "Datei gefunden!"
fi
Das ist ein sehr pragmatischer Ansatz, der allerdings meiner Meinung nach funktioniert. Auf der Kommandozeile und einem Shell-Script gäbe es auch andere Möglichkeiten. Mit einer for-Schleife könnte man zum Beispiel die Anzahl der aufzunehmenden Bilder festlegen. Statt wget könnte man auch curl nehmen und so weiter und so fort. Hier führen wirklich viele Wege nach Rom.
Wenn dann genug Bilder gesammelt sind, verwendest Du mencoder und machst ein Video daraus -> Zeitraffer. Ein Raspberry Pi würde sich für diese Aufgabe sehr gut eignen, da der Winzling nicht viel Strom verbraucht. Läuft das Raspberry Pi headless und Du verbindest Dich via ssh damit, kann das Script dennoch eigenständig laufen.
Installiere einfach screen. Damit kannst Du ein Terminal starten, in den Hintergrund schieben und Dich dann wieder abmelden. Ist screen installiert, rufe das Tool auf der Kommandozeile auf. Starte das Script und melde Dich von screen mithilfe der Tastenkombinationen Strg+A Strg+D ab. Mit screen -r
kannst Du die Sitzung fortsetzen. Gibt es mehr als eine screen-Session, kannst Du Dir mittels screen -ls
eine Liste anzeigen lassen und Dich dann gezielt zu einer Sitzung verbinden. Mehr dazu gibt es in der Manpage: man screen
Nachtrag: Ich wurde gefragt, ob man das auch zeitlich steuern kann. Unter Linux ginge das zum Beispiel mit einem Cronjob. Das Script zu beenden ist ein wenig verzwickter, aber so ginge es zum Beispiel (auch wieder in einem Cronjob):
kill $(ps -aef | grep 'get-pic.sh' | awk '{print $2}')
In Cronjobs ist es ebenfalls ratsam, komplette Pfadangaben zu hinterlegen. Womit der Befehl dann so aussehen würde:
/bin/kill $(ps -aef | /bin/grep 'get-pic.sh' | /usr/bin/awk '{print $2}')
Wenn Du nicht weißt, wo kill, grep und awk liegen: which kill
, which grep
, which awk
Prima Idee. Danke auch für den Link auf Born, dort hatten wir (meine Frau, unser Hund und ich) 2011 einen herrlichen Urlaub verbracht.
Zwei Anmerkungen zum Skript oben. Bei der Übernahme muss man darauf achten, dass die wget-Option "output-document" unbedingt mit doppeltem Minus gebraucht wird. Kopiert man einfach, wird die formatierte Darstellung wie angezeigt übernommen.
Beim Erzeugen des Videos habe ich dann gesehen, dass der Counter nicht optimal ist. Die Dateien werden in alphanumerischer Reihenfolge verwendet, das heißt, dass Bild Nr. 16 zwischen Bild 159 und Bild 160 folgt.
Ich habe daher den Counter ganz weggelassen und statt dessen Datum und Uhrzeit bei der Vergabe des Dateinamens benutzt.
/usr/bin/wget http://webcams.stoneds.de/born/cam/hafen-born.jpg --output-document=hafen-born-$(date +"%m%d_%H%M").jpg
Du hast Recht, ich füge das noch oben ein - danke für den Hinweis. Alternativ könnte man mit ls die Dateien sortieren und dann mencoder übergeben - aber Dein Ding ist einfacher.
Das Problem mit den doppelten Bindestrichen nervt mich so dermaßen. Ich weiß nicht, wie oft ich die Datei formatting.php schon geändert habe - wird beim Update überschrieben. Da muss ich mal eine andere Lösung über die functions.php implementieren.
Also, wenn man das mit jpg.1 jpg.2 jpg.3 usw löst, ist imho die Geschichte mit COUNTER überflüssig.
Denn wget wird das Bild jpg nicht überschreiben, sondern jpg.1 jpg.2 usw. von ganz alleine anlegen.
Und was das Problem mit der falschen Reihenfolge angeht, könnte man das auch mit "ls" lösen
ls -tr
zeigt alle Dateien in der entstandenen Reihenfolge. Das müsste man dann nur zu mencoder pipen...
Aber hey, es gibt viele Wege nach Rom... 😉
[…] » Zeitraffer / Timelapse aus Bildern, die Webcams liefern Jürgen zeigt, wie man Bilder einer Webcam regelmäßig runterlädt und daraus ein Video macht. Für mich interessant, weil ich gerade an einem ähnlichen Skript arbeite. […]