Ich habe eine Kamera im Einsatz, die regelmäßig Bilder vom ganzen Grundstück schießt. Nach einigen Tagen werden alte Bilder gelöscht; ein Bild je Tag allerdings archiviert, so dass man irgendwann aus Spaß an der Freude nachschauen kann "Wie war vor einem Jahr nochmal das Wetter? Lag' da nicht Schnee?".

Als dieses Jahr in einem Bereich des Hofes ein Kürbis sich über den gesamten Hof verbreitete, dachte ich mir, dass es sicher witzig aussehen müsste, den Wachstum im Zeitraffer anzusehen.
Dank täglich geschossener Bilder kein Problem; ein paar Kommandozeilentools vorausgesetzt (natürlich gibt es auch einige GUI-Programme, aber da ich die passenden Kommandozeilentools sofort zur Hand hatte und die Sache vielleicht auch automatisieren möchte, Stichwort "Jahreszeitraffer", verzichte ich lieber auf die Klickerei).

Animiertes GIF

Um animierte GIFs zu erzeugen habe ich auf gifsicle und imagemagick zurückgegriffen. Letzteres wird benötigt, um die JPEG-Bilder der Webcam in GIFs umzuwandeln, da gifsicle keine JPEGs als Eingabedateien akzeptiert.

Da imagemagick bei mir eher zum Standard-Installations-Repertoire gehört, gehe ich auf dessen Installation und Verwendung hier nicht weiter ein.

Der MacOS X Installer unter "Prebuilt Binaries", der beim gifsicle-Download zur Verfügung steht, hatte bei mir leider nicht funktioniert und nur Fehlermeldungen verursacht. Ich habe dann zum aktuellsten Source-Download (Version 1.84) gegriffen und gifsicle selbst kompiliert.

./configure --enable-silent-rules --disable-gifview --disable-gifdiff
make
sudo make install

Nehmen wir an, wir haben einen Stapel JPEG-Bilder in einem Ordner, die der Reihe der Dateibenennung nach ein animiertes GIF ergeben sollen.

Diese konvertieren wir mit Hilfe von imagemagick erst in ein GIF und machen aus den einzelnen GIFs über gifsicle ein animiertes GIF.

mogrify -format gif *.jpg
gifsicle --delay=10 --loop -O *.gif > anim.gif

In obigem Fall wird ein GIF erstellt, welches 10/100 Sekunden Pause zwischen den einzelnen Frames hat und welches immer wieder in einer Schleife abgespielt wird.

Durch den
-O
-Modifier wird das GIF optimiert; es wird versucht, Änderungen zwischen den einzelnen Frames zu finden und nur die Änderungen in das GIF zu packen. So entstehen kleinere GIFs.

Ein Blick auf alle gifsicle-Optionen mit

gifsicle -h
lohnt sich: Es sind sehr viele :-)

Video

Ein Video aus einzelnen JPEG-Bildern bekam ich mit Hilfe von mencoder hin.

mencoder gehört bei mir auch schon lange zum Standard-Installations-Repertoire, aber als ich hier "mal schnell" den Link zu mencoder recherchieren wollte, stieß ich auf wohl dieselben Probleme, die ich damals schon hatte, als ich mencoder installieren wollte.

Solltet ihr mencoder nicht installiert haben, lest hierzu diesen neuen Artikel über die mencoder-Installation.

Zurück zum Thema. Wie macht man aus einem Stapel JPEG-Bildern in der Reihenfolge der Benennung einen Film? Hier Beispiele mit verschiedenen Ausgabe-Formaten:

# mkv-Video mit dem x264-Codec
mencoder mf://*.jpg -mf fps=5:type=jpg -ovc x264 -x264encopts bitrate=1200:threads=2 -o timelapsemovie.mkv

# JPEG-Dateien 1:1 in eine avi-Datei packen
mencoder -ovc copy -mf fps=5:type=jpg 'mf://*.jpg' -o timelapsemovie.avi

# Eine "mencoder hat viele Optionen, also nutzen wir sie!"-Variante mit dem MPEG4-Codec
mencoder -nosound mf://*.jpg -mf type=jpg:fps=5 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2160000:mbd=2:keyint=132:v4mv:vqmin=3:lumi_mask=0.07:dark_mask=0.2:mpeg_quant:scplx_mask=0.1:tcplx_mask=0.1:naq -o timelapsemovie.avi
# Das aus dem letzten Schritt erstellte Video lässt sich mit einem zweiten Encoding-Durchgang noch verkleinern
mencoder -ovc lavc -lavcopts vcodec=mpeg4:vpass=1:vbitrate=1620000:mbd=2:keyint=132:v4mv:vqmin=3:vlelim=-4:vcelim=7:lumi_mask=0.07:dark_mask=0.10:naq:vqcomp=0.7:vqblur=0.2:mpeg_quant -mf type=sgi:fps=25 -nosound -o /dev/null timelapsemovie.avi

# Noch eine Tonspur gefällig? Fügen wir sie hinzu...
mencoder -ovc lavc -lavcopts vcodec=mpeg4:vpass=2:vbitrate=1620000:mbd=2:keyint=132:v4mv:vqmin=3:vlelim=-4:vcelim=7:lumi_mask=0.07:dark_mask=0.10:naq:vqcomp=0.7:vqblur=0.2:mpeg_quant -mf type=sgi:fps=25  -audiofile "~/tonspur.mp3" -oac copy -o timelapsemovie_mitTon.avi timelapsemovie.avi

Ein Wert, mit dem man auf jeden Fall spielen sollte, ist die Framerate, die ich immer auf 5 gesetzt hatte (

fps=5
). Umso höher sie ist, desto schneller spielt das Video.

Durch Reduzieren der Bitrate (

bitrate=1200
/
vbitrate=1620000
) könnte man die Dateigröße des ausgegebenen Videos noch reduzieren.

Außerdem ließe sich Breite und Höhe des Videos mit der Option
-vf scale=1920:1080
auf eine Wunsch-Größe skalieren (sollte das Video zum Beispiel kleiner werden, als die Bilder; hier die Beispielswerte 1920x1080).