Fraktalanimationen mit Xaos erstellen

Das ist ja geil, wie du deine Fraktalzooms schnell an der Kommandozeile machst. Kannst du mir das Programm geben?

Ja, das ist geil, denn da sind die Konzepte unixoider Betriebssysteme so richtig an der Arbeit, um mir die leidige und fehleranfällige Arbeit abzunehmen.

Das »Programm« ist ein einfaches Shellskript, das eine Menge fertiger Arbeit anderer Menschen nutzbar macht. Die Länge des unterlegten Musikstückes bestimme ich mit Sox, was übrigens generell ein unentbehrliches Tool für Menschen ist, die öfter einmal Sounddateien zu konvertieren haben und lieber dem Rechner bei der Arbeit zuschauen als sich die Finger wund zu klicken. Die einzelnen Bilder der Animation lasse ich mit Xaos berechnen, damit lege ich auch (schön klickig) den Start- und Endpunkt der Reise durch Fraktalia fest. Zum Glück kann man Xaos skripten, so dass dieser Teil der Arbeit bereits erledigt ist – sonst müsste ich für jedes Bild eine einzelne Parameterdatei erzeugen. Abschließend setze ich aus den Bildern und der Musik ein Video mit FFmpeg zusammen, einem geradezu mörderischen, kleinen Tool, dessen man-page mir jedes Mal aufs Neue zeigt, dass ich überhaupt nichts von Videoformaten zu verstehen scheine.

Mir wurde es irgendwann zu lästig, diesen Vorgang immer wieder händisch zu machen (und dabei auch immer wieder einmal eine neue Fehlerquelle zu finden), und deshalb habe ich mein Shellskript geschrieben. Dieses sieht für »normale« Menschen auf dem ersten Blick ein bisschen gruselig aus, was daran liegt, dass es sich um ein Programm handelt, das ein Programm erzeugt – dabei kommt es nicht gerade zur hübschesten Syntax. Dieses Skript sieht so aus (ich habs eben etwas aufgeräumt):

#!/bin/sh
########################################################################
#
# zoomskript
# $Id: zoomskript,v 1.3 2012/09/22 15:38:03 elias Exp $
#
# Aus einer Audio-Datei (diese gibt die Länge vor), zwei gespeicherten
# Parameterdateien von Xaos und einem Namen wird ein Skript erzeugt, das
# einen Fraktalzoom berechnet. Ich habe dabei so häufig Fehler gemacht,
# dass ich diese Aufgabe lieber an einen Computer übergebe. Der kann
# das nämlich besser als ich... 
#
# Alle vier Parameter sind erforderlich.
#
########################################################################

# Paranoiazeilen
PATH=/bin:/usr/bin
SOX_OPTS=""

# Parameter lesen, Kurzinfo bei falscher Anzahl 
case $# in
    4) 	xaosfrom="$1"
        xaosto="$2"
        music="$3"
        zoomname="$4"
        ;;
    *) 	echo "Aufruf: `basename $0` [xaos-from] [xaos-to] [audiofile] [name]"
        echo
        echo "* Schreibt zwei Dateien: [name].xpf und [name].sh"
        echo "* [name].xpf ist die Zoom-Definition für xaos"
        echo "* Filter und Palette werden aus [xaos-to] genommen"
        echo "* [name].sh ist das Shellskript, das das Video rendert"
        exit
        ;;
esac

# Die Namen der erzeugten Dateien
xaoszoom="$zoomname.xpf"
xaosskript="$zoomname.sh"

# Ein paar Zeilen langweiliger Fehlerbehandlung
if [ ! -f "$xaosfrom" ]
then
    echo >&2 "Keine Startpunkt-Definition ’$xaosfrom’"
    exit 1
fi
if [ ! -f "$xaosto" ]
then
    echo >&2 "Keine Endpunkt-Definition ’$xaosto’"
    exit 1
fi
if [ ! -f "$music" ]
then
    echo >&2 "Keine Audiodatei ’$music’"
    exit 1
fi
if [ -f "$xaoszoom" ]
then
    echo >&2 "Ausgabedatei ’$xaoszoom’ existiert bereits"
    exit 1
fi
if [ -f "$xaosskript" ]
then
    echo >&2 "Ausgabeskript ’$xaosskript’ existiert bereits"
    exit 1
fi

# Die Länge der Audiodatei mit sox ermitteln und daraus die
# Anzahl der Mikrosekunden für xaos ermitteln
musicmicros=`sox --info "$music" |
grep ’uration’ |
sed ’s/^[^0-9]*\([0-9\.:]*\).*$/\1/
     s/[:\.]/ /g’ |
awk ’{ sec = $4 / 100 + $3 + $2 * 60 + $1 * 60 * 60
       microsec = sec * 1000000
       printf "%d", microsec }’`

# Keine Länge ermittelt? Das ist ein Fehler!
if [ -z "$musicmicros" ]
then
    echo >&2 "Länge für Audiodatei ’$music’ kann nicht ermittelt werden"
    exit 1
fi

# Startpunkt aus der Startdatei ermitteln
startline=`grep ’^ *(view’ $xaosfrom |
sed ’s/).*$/)/
     s/^[^(]*(/(/’`

# Kein Startpunkt ermittelt? Das ist ein Fehler!
if [ -z "$startline" ]
then
    echo >&2 "In ’$xaosfrom’ existiert keine view-Zeile"
    exit 1
fi

# Zoomdatei schreiben
(   echo "; Diese Datei wurde automatisch mit `basename $0` erzeugt"
    echo "; Aufruf: `basename $0` \"$1\" \"$2\" \"$3\" \"$4\""
    echo
    sed "/^;/d
         s/(view/$startline\n(morphview/" <"$xaosto" 
    echo "(usleep $musicmicros)" ) >"$xaoszoom"

# Zoomskript schreiben
# Achtung! Ich setze eine gediegene Bitrate beim Erzeugen des Videos,
# weil ich der Meinung bin, dass man immer noch nachträglich die
# Qualität verschlechtern kann. Nachträgliches Verbessern hingegen ist
# eher ein bisschen schwierig...
cat >"$xaosskript" <<EOF
#!/bin/sh
# Dieses Skript wurde automatisch mit `basename $0` erzeugt
# Aufruf: `basename $0` "$1" "$2" "$3" "$4"

if [ -d /var/tmp ]
then
    tmpdir=/var/tmp/zoom-\`whoami\`-\$$
else
    tmpdir=/tmp/zoom-\`whoami\`-\$$
fi

trap "rm -rf \$tmpdir; exit" 1 2 15
mkdir \$tmpdir

nice xaos -render "$xaoszoom" \\
          -size 1280x720 \\
          -antialiasing \\
          -rendervectors \\
          -renderframerate 25 \\
          -basename \$tmpdir/img

nice ffmpeg -y \\
            -i "$music" \\
            -f image2 \\
            -i "\$tmpdir/img%04d.png" \\
            -r 25 \\
            -s hd720 \\
            -b 17000k \\
            "$zoomname.mp4"

rm -rf \$tmpdir
EOF

# Aufräumen
chmod +x "$xaosskript"

# Abschließender Hinweis
echo "Starte das Rendern mit ./$xaosskript"

Abschreiben oder übers Clipboard kopieren ist nicht nötig, hier ist ein bequemerer Download. Einfach herunterladen, entpacken und irgendwo in den $PATH legen. Wer auf Sicherheit bedacht ist, wird mir nicht vertrauen und natürlich einen Blick auf das Skript werfen wollen.

Ein erheblicher Teil besteht aus der Behandlung naheliegender Fehler, um einigermaßen verständliche Fehlermeldungen zu bekommen.

Wenn die verwendeten Tools sox und ffmpeg installiert sind, ist die Verwendung des Skriptes ganz einfach. Angenommen, die Musik befindet sich in der Datei soundtrack.wav, der Startpunkt der Animation in start.xpf und der Endpunkt in ende.xpf, und daraus soll ein Video namens blah.mp4 gemacht werden, dann gibt es die folgende Sitzung an der Kommandozeile:

ich@rechner ~/zoom $ zoomskript start.xpf ende.xpf soundtrack.wav blah
Starte das Rendern mit blah.sh
ich@rechner ~/zoom $ ./blah.sh

Den Rest erledigt jemand für mich, der es besser kann als ich: Der Rechner. 😉

So muss das auch sein!

Die Palette für die Animation und eventuelle Filter werden dabei aus der Zielposition übernommen, entsprechende Angaben der Startparameter werden vollständig verworfen. Das liegt daran, dass ich selbst lieber am Ziel (oder auf dem Weg dorthin) über solche Dinge entscheide.

Ach ja: Wer gern einen Lizenztext zu diesem Skript haben möchte, fühle sich bitte einfach unter den Bedingungen der Piratenlizenz lizensiert. Share and Enjoy, but don’t sue me!

Dieser Beitrag wurde unter Technisches abgelegt und mit , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert