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!