ASTRO ELECTRONIC
Dipl.-Ing. Michael Koch
Raabestr. 43     D-37412 Herzberg     Germany
Tel: +49 (0)5521 854265    Fax:  +49 (0)5521 854266
www.astro-electronic.de e-mail

Wie man Zeitraffer-Videos mit FFmpeg selber machen kann

Seit einiger Zeit beschäftige ich mich damit, Zeitraffer-Videos selber zu machen. Die Vorgehensweise möchte ich jetzt mal schriftlich festhalten. Zum einen weil es auch andere interessieren könnte, und zum anderen weil es inzwischen so umfangreich geworden ist dass ich selber auch manchmal nachschauen muss wie ich das eigentlich gemacht habe.

Zum Aufnehmen der Einzelbilder könnte man viel schreiben, aber ich werde mich zunächst nur auf das notwendigste beschränken:

  • Man braucht eine Digitalkamera
  • Wenn möglich sollte der Autofokus ausgeschaltet werden und von Hand fokussiert werden
  • Wenn möglich sollte ein externer Intervall-Timer angeschlossen werden
  • Bei sehr langen Videos kann es sinnvoll sein,  die Kamera mit einer externen Stromversorgung zu betreiben
  • Die Kamera sollte fest auf ein Stativ montiert werden
  • Im einfachsten kann die Kamera mit einer UNC 1/4"-20 Schraube an einer Holzlatte befestigt werden, die wiederum mit einer Schraubzwinge irgendwo befestigt wird.
  • Im einfachsten Fall verwendet man die Programmautomatik der Kamera, um Blende und Belichtungszeit zu steuern
  • Bei Aufnahmen mit Tag-Nacht Übergang geht das nicht so einfach, dazu schreibe ich vielleicht später noch was.
  • Die Bilder müssen fortlaufend durchnummeriert sein. Die Nummerierung muss aber nicht bei 1 anfangen.

  •  

     

    Nun haben wir also hunderte oder tausende von Einzelbildern, aber wie macht man daraus ein Video?
    Hierfür gibt es das frei verfügbare Programm "FFmpeg", zu finden auf http://www.ffmpeg.org. Man klickt zunächst auf "Download", dann auf
    der nächsten Seite auf "Windows Builds", und dann auf der nächsten Seite die "Static" Version, entweder 32-bit oder 64-bit. Die ZIP-Datei wird dann in irgendein Verzeichnis entpackt. Wo dieses Verzeichnis steht ist im Prinzip egal.

    FFmpeg hat keine grafische Bedienoberfläche. Es wird über eine Kommandozeile gestartet. Da die Zeile viele Parameter enthält und entsprechend lang ist, ist es ratsam das Programm über ein Batch-File zu starten. Das sieht zum Beispiel so aus:

    video.bat
    c:/Programme/ffmpeg/bin/ffmpeg -framerate 20 -start_number 3551 -i IMG_%%4d.jpg -codec:v mpeg4 -s 900x600 -q:v 2 Video_1.mp4
    pause

    Bitte beachtet dass der gesamte Programmaufruf in einer Zeile stehen muss. Es stört aber nicht, wenn die Zeile im Editor automatisch am Ende umgebrochen wird. Der Befehl "pause" muss in einer neuen Zeile stehen.

    c:/Programme/ffmpeg/bin/ffmpeg    Das ist der Pfad zu ffmpeg
    -framerate 20      bedeutet, dass das Video mit 20 Bildern pro Sekunde laufen soll
    -start_number 3551 gibt die Nummer des ersten Bilden an, das verwendet werden soll
    -i IMG_%%4d.jpg gibt den Dateinamen der Bilder an. Dabei steht %%4d für eine 4-stellige Nummer
    -codec:v mpeg4     bewirkt, dass ein MP4 Video erzeugt wird
    -s 900x600 gibt die Bildgröße des Videos an, und kann auch kleiner oder größer als die Größe der Einzelbilder sein
    -q:v 2    gibt an in welcher Qualität das Video erzeugt werden soll (genaue Bedeutung ist mir noch unklar)
    Video_1.mp4 das ist der Dateiname des erzeugten Videos

    Der Befehl "pause" bewirkt, dass am Ende des Batch-Files erst noch auf einen Tastendruck gewartet wird, bevor das Fenster geschlossen wird. Das ist sinnvoll, damit man eventuelle Fehlermeldungen sehen kann.

    Diese Batch-Datei kopiert man in den gleichen Ordner wo sich auch die Bilder befinden. Dann wird die Batch-Datei bearbeitet (Rechtsklick --> bearbeiten), d.h. die Parameter werden entsprechend angepasst. Dann wird die Datei gespeichert. Gestartet wird die Batch-Datei durch Doppelklick auf das Icon.
     

    Problem:
    Meine Kamera erzeugt Bilder mit 4-stelliger Nummerierung. Dabei kann es passieren, dass der Zähler von 9999 nach 0001 überläuft. Somit ist die Nummerierung nicht mehr fortlaufend, wie es von FFmpeg erwartet wird. Dieses Problem kann man lösen indem man ein Fenster mit Eingabeaufforderung öffnet, zum aktuellen Verzeichnis wechselt und dann folgende Befehle ausführt:
     
    ren IMG_1*.* IMG_2*.*
    ren IMG_0*.* IMG_1*.*
    ren IMG_9*.* IMG_0*.*
    copy IMG_0999.* IMG_1000.*

    Die ersten drei Zeilen bewirken, dass die Bilder in eine fortlaufende Reihenfolge gebracht werden (ren ist die Abkürzung für rename). Es wird praktisch auf jede Nummer 1000 addiert, ausgenommen bei denen die mit 9 beginnen, da wird 9000 subtrahiert. Jetzt ist nur noch das Problem, dass zwischen Bild 0999 und Bild 1001 ein Bild fehlt. Die Kamera beginnt nämlich nach Bild 9999 nicht etwa mit Bild 0000, sondern mit Bild 0001. Dieses Problem wird in der vierte Zeile dadurch gelöst, dass das Bild 0999 dupliziert wird. In der Hoffnung dass es im Video keiner sieht :-)

    Nun soll das Video auch noch mit Musik unterlegt werden. Auch das ist mit FFmpeg relativ einfach möglich, und der Aufruf sieht beispielsweise so aus:
     
    c:/Programme/ffmpeg/bin/ffmpeg -i Musik.mp3 -framerate 20 -start_number 3551 -i IMG_%%4d.jpg -codec:v mpeg4 -s 900x600 -q:v 2 Video_1.mp4

    -i Musik.mp3    gibt den Namen der Musik-Datei an.

    Nun wäre es ein großer Zufall, wenn die Musik genau so lang ist wie das Video. Falls die Musik länger ist, dann bleibt am Ende des Videos das letzte Einzelbild solange als Standbild stehen, bis die Musik zu Ende ist. Falls das Video länger als die Musik ist, dann läuft der Schluss des Videos lautlos ab. Mit dem zusätzlichen Parameter -shortest kann man erreichen, dass das Video zu Ende ist wenn die kürzeste Signalquelle zu Ende ist. Dann wird entweder die Musik nicht bis zu Ende zu hören sein, der es wird ein Stück vom Video abgeschnitten. Um Bild und Ton auf die gleiche Länge zu bringen, kann man die Framerate (innerhalb gewisser Grenzen) so berechnen, dass das Video genau so lange dauert wie die Musik:   Framerate = Anzahl_Bilder / Audio_Sekunden
    Dadurch ergibt sich für die Framerate eine krumme Zahl, aber das ist kein Problem. Als Dezimaltrenner muss ein Punkt verwendet werden, z.B.  -framerate 7.9

    Kostenlose Gema-freie Musik kann man zum Beispiel hier finden:
    http://opsound.org/artist/peterrudenko/.
    Kostenlos und Gema-frei bedeutet aber nicht, dass man damit machen kann was man will. Man sollte sich die Lizenzbedingungen schon genau durchlesen. In diesem Fall wird z.B. gefordert, dass eine angemessene Anerkennung gegeben wird (d.h. der Name des Interpreten und der Musiktitel wird genannt), und ein Link zu der Lizenz soll angegeben werden. Wir müssen also zu unserem Video noch einen Vorspann und / oder einen Nachspann hinzufügen, um diese Informationen anzeigen zu können.
     

    Der Vorspann und der Nachspann soll jeweils ein einfaches Standbild sein, das für einige Sekunden angezeigt wird. Den Text kann man im Texteditor schreiben, dann über die Zwischenablage in ein Grafikprogramm kopieren, und dann als JPG oder GIF Bild abspeichern. Wichtig ist, dass das Höhen/Seiten Verhältnis mit dem Video übereinstimmt, und dass die gleiche Framerate und die gleichen Codecs wie beim Video verwendet werden. Der Vorspann kann dann wie folgt erzeugt werden:
     
    c:/Programme/ffmpeg/bin/ffmpeg -i Stille_1min.mp3 -framerate 7.9 -loop 1 -i Vorspann.jpg -t 5 -codec:v mpeg4 -s 900x600 -q:v 2 -shortest Vorspann.mp4

    c:/Programme/ffmpeg/bin/ffmpeg Das ist der Pfad zu ffmpeg
    -i Stille_1min.mp3 ist eine MP3 Datei die eine Minute perfekte Stille enthält, zu finden beispielweise hier
    -framerate 7.9     Die Framerate muss mit dem Video übereinstimmen. Als Dezimaltrenner einen Punkt verwenden!
    -loop 1   bewirkt, dass das gleiche Bild immer wieder verwendet wird
    -i Vorspann.jpg das ist der Dateiname des Vorspann-Bildes, die Größe ist beliebig, aber das Höhen/Seiten Verhältnis muss passen
    -t 5      gibt die Dauer des Vorspanns in Sekunden an
    -codec:v mpeg4     muss mit dem Codec des Videos übereinstimmen
    -s 900x600 die Bildgröße des Vorspann-Videos, muss mit den Haupt-Video übereinstimmen
    -q:v 2    muss wahrscheinlich auch mit dem Video übereinstimmens
    -shortest bewirkt hier, dass die Vorspann-Länge durch den Parameter -t bestimmt wird und nicht durch die MP3 Länge
    Vorspann.mp4 der Dateiname des fertigen Vorspann-Videos

    Der Nachspann wird nach dem gleichen Verfahren erzeugt.
     

    So, nun haben wir drei Videos: Den Vorspann, das eigentliche Zeitraffer-Video, und den Nachspann. Selbstverständlich kann man sich schon mal jedes Video einzeln anschauen und überprüfen. Für das Zusammenfügen zu einem einzigen Video brauchen wir jetzt eine Datei Schnitt.txt, in der die Dateinamen der Einzel-Videos in der richtigen Reihenfolge angegeben werden:

    Schnitt.txt
    # Diese Datei legt fest, aus welchen Teilen und in welcher Reihenfolge das Video zusammengesetzt wird
    file 'Vorspann.mp4'
    file 'Video_1.mp4'
    file 'Nachspann.mp4'

    Das eigentliche Zusammenfügen geht dann so:
     
    c:/Programme/ffmpeg/bin/ffmpeg -f concat -i Schnitt.txt -c copy Video.mp4

    Im folgenden Batch-File habe ich nochmal alles zusammengefasst, und in den Kommentaren auch noch weitere Parameter erläutert.
     
    REM Erzeugung des 5 Sekunden Vorspanns aus einem Einzelbild

    c:/Programme/ffmpeg/bin/ffmpeg -i Stille_1min.mp3 -framerate 7.9 -loop 1 -i Vorspann.jpg -t 5 -codec:v mpeg4 -s 1800x1200 -q:v 2 -shortest Vorspann.mp4

    REM Erzeugung des Video_1 aus den vielen Einzelbildern

    c:/Programme/ffmpeg/bin/ffmpeg -i Peter_Rudenko_-_When_It_Rains_Part_2.mp3 -framerate 7.9 -start_number 3551 -i IMG_%%4d.jpg -codec:v mpeg4 -s 1800x1200 -q:v 2 Video_1.mp4

    REM Erzeugung des 5 Sekunden Nachspanns aus einem Einzelbild

    c:/Programme/ffmpeg/bin/ffmpeg -i Stille_1min.mp3 -framerate 7.9 -loop 1 -i Nachspann.jpg -t 5 -codec:v mpeg4 -s 1800x1200 -q:v 2 -shortest Nachspann.mp4

    REM Zusammenfügen von Vorspann, Video_1 und Nachspann zum fertigen Film

    c:/Programme/ffmpeg/bin/ffmpeg -f concat -i Schnitt.txt -c copy Video.mp4

    REM Warten auf Tastendruck, damit man eventuelle Fehlermeldungen lesen kann

    pause
     
     

    REM ****************************************************************************************
    REM      Es folgen nun Erläuterungen zu den Parametern von ffmpeg 
    REM ****************************************************************************************
    REM
    REM
    REM -i Musik.mp3        Einbinden einer Audio-Datei
    REM
    REM -i Stille_1min.mp3  Das ist ein Trick um im Vor- und Nachspann die Tonspur anzulegen,
    REM                      ohne dass man was hört
    REM
    REM -framerate 30       Bilder pro Sekunde, 25 ist Default und kann auch weggelassen werden
    REM                     Die Framerate kann so berechnet werden, dass die Gesamtzeit genau der
    REM                      Länge der Audio-Datei entspricht.
    REM                      Framerate = Anzahl_Bilder / Audio_Sekunden
    REM                      Punkt als Dezimaltrenner verwenden ! 
    REM                     Im Zweifelsfall die Framerate etwas höher setzen, das bewirkt dass das
    REM                      letzte Bild stehenbleibt während die Musik endet. 
    REM                     Falls mehrere Videos zusammengefügt werden sollen, dann sollte die
    REM                      Framerate in allen Teilen identisch sein! 
    REM
    REM -start_number 123   Legt die Nummer des ersten Bildes fest
    REM
    REM -loop 1             Bewirkt dass die Eingangsdatei immer wieder verwendet wird 
    REM
    REM -i IMG_%%4d.jpg     Input Dateiname mit 4-stelliger Nummer, innerhalb der Batchdatei 
    REM                      müssen zwei "%%" geschrieben werden, bei direktem Aufruf nur ein "%".
    REM
    REM -vol 200            Änderung der Audio-Lautstärke, 256 entspricht der Original-Lautstärke,
    REM                      128 ist halbe Lautstärke, 512 ist doppelte Lautstärke 
    REM
    REM -t 5                Bewirkt dass die Länge der Ausgangs-Datei auf 5 Sekunden begrenzt wird 
    REM
    REM -vf "crop=w,h,x,y"  Zuschneiden der Eingangs-Bilder auf Größe w*h, linke obere Ecke bei x,y
    REM -vf "crop=ih:ih"    Zuschneiden der Eingangs-Bilder auf quadratisches Format, zentriert
    REM                      "ih" ist die Höhe des Eingangs-Bildes 
    REM 
    REM -codec:v mpeg4      Damit läuft's auch unter Windows Media Player
    REM
    REM -b:v 1000k          Legt eine bestimmte Bitrate fest 
    REM 
    REM -s 900x600          Bildbreite x Bildhöhe des erzeugten Videos
    REM
    REM -frames 10          Begrenzung auf 10 Frames, gut zum schnellen Testen
    REM 
    REM -q:v 2              Video-Qualitätsfaktor, Werte ausprobieren 
    REM
    REM -shortest           Bewirkt, dass die Bearbeitung beendet wird wenn die kürzeste Quelle
    REM                      (Audio oder Video) beendet ist. 
    REM
    REM video.avi           Ausgabedatei *.avi oder *.mp4 
    REM
    REM
    REM
    REM **************************************************************************************
    REM So erzeugt man ein 5 Sekunden langes Video aus einem Einzelbild, mit Tonspur aber ohne Ton:
    REM **************************************************************************************
    REM
    REM ffmpeg -i Stille_1min.mp3 -framerate 7.9 -loop 1 -i Bild.jpg -t 5
    REM  -codec:v mpeg4 -s 900x600 -q:v 2 -shortest Vorspann.mp4
    REM
    REM Die Datei "Stille_1min.mp3" enthält genau das was der Dateiname beschreibt
    REM
    REM Es ist wichtig dass der Vorspann mit der gleichen Framerate und mit der gleichen
    REM  Bildgröße wie der Hauptfilm erzeugt wird!
    REM
    REM
    REM **************************************************************************************
    REM So fügt man mehrere Videos zu einem einzigen zusammen:
    REM **************************************************************************************
    REM
    REM ffmpeg -f concat -i Schnitt.txt -c copy Video.mp4
    REM
    REM Dabei wird die Reihenfolge der Teil-Videos in der Datei Schnitt.txt festgelegt,
    REM  die z.B. so aussieht:
    REM
    REM  file 'Vorspann.mp4'
    REM  file 'Video_1.mp4'
    REM  file 'Nachspann.mp4'
    REM
    REM
    REM **************************************************************************************
    REM Batch-Befehle:
    REM **************************************************************************************
    REM
    REM pause               Wartet auf einen Tastendruck 
    REM
    REM
    REM **************************************************************************************
    REM Sonstiges
    REM **************************************************************************************
    REM
    REM Bildformat der Canon EOS 6D: 5472x3648 
    REM

    Hier könnt ihr das Video sehen, das nach dieser Anleitung erzeugt wurde (allerdings bei Youtube nicht in voller Auflösung):
    https://youtu.be/iaTNyLrdLJA


    Einige Tage später...

    Ich habe herausgefunden dass man den Titel und einen von unten hochlaufenden Nachspann direkt mit FFmpeg erzeugen kann. Man kann auch im Batch-File Variablen definieren, um die Sache übersichtlicher zu gestalten. Das Batch-File sieht dann so aus:
     
    set "IMAGES=IMG_%%4d.jpg"         :: Dateiname der Bilder, %%4d steht für 4-stellige Nummer
    set "FRAMERATE=7.9"               :: Bilder pro Sekunde
    set "STARTNUMBER=3551"            :: Nummer des ersten Bildes
    set "CODEC=mpeg4"                 :: Codec, am besten ist mpeg4
    set "SIZE=1800x1200"              :: Breite und Höhe des erzeugten Videos
    set "VIDEO_BITRATE=5M"            :: Video-Bitrate
    set "VIDEO_QUALITY=2"             :: Video-Qualitätsfaktor 

    set "FONTFILE=arial.ttf"          :: Zeichensatz für Titel und Nachspann
    set "TITLE_FILE=titel.txt"        :: Titel-Text-Datei (muss UTF-8 codiert sein)
    set "TITLE_COLOR=white"           :: Farbe für Titel
    set "TITLE_SIZE=80"               :: Schriftgröße für Titel
    set "TITLE_DURATION=4"            :: gibt an, wie lange der Titel eingeblendet werden soll (Sekunden)
    set "CREDITS_FILE=nachspann.txt" :: Nachspann-Text-Datei (muss UTF-8 codiert sein)
    set "CREDITS_COLOR=white"         :: Farbe für Nachspann
    set "CREDITS_SIZE=30"             :: Schriftgröße für Nachspann
    set "CREDITS_START=33"            :: Zeitpunkt wann der Nachspann beginnt (Sekunden)
    set "CREDITS_SPEED=100"           :: Geschwindigkeit des durchlaufenden Nachspanns, Pixel pro Sekunde 
    set "MUSIC_DELAY=2"               :: Verzögerung in Sekunden, bevor die Musik beginnt
    set "MUSIC_FILE=Peter_Rudenko_-_When_It_Rains_Part_2.mp3"  :: Musik-Datei
    set "FILENAME=Wolken.mp4"         :: Name des erzeugten Videos 
     

    REM Schritt 1: Erzeugung des Videos aus den vielen Einzelbildern

    c:/Programme/ffmpeg/bin/ffmpeg -framerate %FRAMERATE% -start_number %STARTNUMBER% ^
      -i %IMAGES% -codec:v %CODEC% -s %SIZE% -b:v %VIDEO_BITRATE% -q:v %VIDEO_QUALITY% temp.mp4
     

    REM Schritt 2: Hinzufügen von Titel, Nachspann und Musik

    set "TITLE=drawtext='fontfile=%FONTFILE%:textfile=%TITLE_FILE%:x=(w-tw)/2:y=(h-th)/2:fontcolor=%TITLE_COLOR%:fontsize=%TITLE_SIZE%:enable=lt(t\,%TITLE_DURATION%)'"

    set "CREDITS=drawtext='fontfile=%FONTFILE%:textfile=%CREDITS_FILE%:x=(w-tw)/2:y=h-(t-%CREDITS_START%)*%CREDITS_SPEED%:fontcolor=%CREDITS_COLOR%:fontsize=%CREDITS_SIZE%'" 

    c:/Programme/ffmpeg/bin/ffmpeg -itsoffset %MUSIC_DELAY% -i %MUSIC_FILE% ^
    -i temp.mp4 -vf "%TITLE%,%CREDITS%" ^
    -codec:v %CODEC% -s %SIZE% -b:v %VIDEO_BITRATE% -q:v %VIDEO_QUALITY% %FILENAME%
     

    REM Warten auf Tastendruck, damit man eventuelle Fehlermeldungen lesen kann

    pause
     

    Die beiden Textfiles für den Titel und den Nachspann müssen UTF-8 codiert sein. Solange der Text nur ASCII-Zeichen enthält, geht auch die normale ANSI Codierung. Aber wenn Umlaute oder Sonderzeichen enthalten sind, dann  muss man vor dem Abspeichern die Codierung auf UFT-8 umstellen. Das geht mit Notepad, aber die so entstandene Datei hat noch das Problem dass sie am Anfang drei störende Zeichen EF BB BF enthält. Diese drei Zeichen muss man mit einem Hex-Editor nachträglich entfernen. Sonst sieht man im Video ein störendes Rechteck.

    Hier könnt ihr das neue Video sehen, das mit diesem Batch-File erzeugt wurde (allerdings bei Youtube nicht in voller Auflösung):
    https://youtu.be/YSTpl71-1YU


    Einige Tage später...

    Inzwischen habe ich herausgefunden wie man Texte langsam ein- und ausblenden kann. Das war gar nicht so einfach, weil es schlecht dokumentiert ist. Aber es geht !
     
    REM Schritt 1: Erzeugung des Videos aus den vielen Einzelbildern

    set "IMAGES=IMG_%%4d.jpg"    : Dateiname der Bilder, %%4d steht für 4-stellige Nummer
    set "FRAMERATE=7.9"          : Bilder pro Sekunde, kann so berechnet werden dass
                                 :  das Video die gleiche Länge wie die Musik bekommt:
                                 :  Framerate = Bilderanzahl / Musiksekunden
                                 :  Der Dezimaltrenner ist ein Punkt! 
    set "RATE=30"                : Erzeugte Framerate (kann kleiner oder größer als FRAMERATE sein) 
    set "STARTNUMBER=3551"       : Nummer des ersten Bildes
    set "QUAD=false"             : false: Bilder werden nicht zugeschnitten
                                 : true: Bilder werden auf quadratisches Format
                                 :  zugeschnitten, sinnvoll bei Fisheye-Aufnahmen 
    set "MAXSTAR=false"          : true: Maximum aus 3x3 Pixel Umgebung, ist sinnvoll
                                 :  für Stern-Bilder
                                 : false: Ist sinnvoll für sonstige Bilder
    set "CODEC=mpeg4"            : Codec, am besten ist mpeg4
    set "FRAMESIZE=1800x1200"    : Breite und Höhe des erzeugten Videos, das Verhältnis
                                 :  sollte wie bei den Einzelbildern sein (3:2), oder
                                 :  quadratisch falls QUAD=true gewählt wurde 
    set "VIDEO_BITRATE=5M"       : Video-Bitrate
    set "VIDEO_QUALITY=2"        : Video-Qualitätsfaktor 
     

    set CROP=
    if %QUAD%==true (set CROP=-vf "crop=ih:ih")

    set DILATION=
    if %MAXSTAR%==true (set DILATION=-vf "dilation")

    c:/Programme/ffmpeg/bin/ffmpeg -framerate %FRAMERATE% ^
    -start_number %STARTNUMBER% -i %IMAGES% %DILATION% %CROP% -codec:v %CODEC% ^
    -s %FRAMESIZE% -b:v %VIDEO_BITRATE% -q:v %VIDEO_QUALITY% -r %RATE% temp.mp4
     

    REM Schritt 2: Definition der Titel-Einblendung

    set "NAME=FILTER1"         : Eindeutiger Name dieser Texteinblendung
    set "FONTFILE=arial.ttf"   : Zeichensatz 
    set "FILENAME='titel.txt'" : Dateiname (muss UTF-8 codiert sein, falls Umlaute
                               :  enthalten sind)
    set "COLOR=white"          : Farbe für Titel
    set "SIZE=80"              : Schriftgröße
    set "POSITION_X=(w-tw)/2"  : X-Textposition, für mittige Anordnung: (w-tw)/2 
    set "POSITION_Y=(h-th)/2"  : Y-Textposition, für mittige Anordnung: (h-th)/2 
    set "DS=0"                 : Startzeitpunkt
    set "DE=5"                 : Endzeitpunkt
    set "FID=0.001"            : Fade-in Dauer (darf klein sein, aber nicht null)
    set "FOD=1"                : Fade-out Dauer (darf klein sein, aber nicht null)

    REM ******************************************************************************** 
    REM *  This is the filter definition. Don't change anything in the following line. *
    REM ********************************************************************************
    set "%NAME%=drawtext='fontfile=%FONTFILE%:textfile=%FILENAME%:fontcolor_expr=%COLOR%@%%{e\:between(t,%DS%+%FID%,%DE%-%FOD%)+((t-%DS%)/%FID%)*between(t,%DS%,%DS%+%FID%)+(%DE%-t)/%FOD%*between(t,%DE%-%FOD%,%DE%)}:fontsize=%SIZE%:x=%POSITION_X%:y=%POSITION_Y%'"
     

    REM Schritt 3: Definition des Nachspanns

    set "NAME=FILTER2"             : Eindeutiger Name dieser Texteinblendung
    set "FONTFILE=arial.ttf"       : Zeichensatz 
    set "FILENAME='nachspann.txt'" : Dateiname (muss UTF-8 codiert sein, falls Umlaute
                                   :  enthalten sind)
    set "COLOR=white"              : Farbe für Titel
    set "SIZE=30"                  : Schriftgröße 
    set "POSITION_X=(w-tw)/2"      : X-Textposition, für mittige Anordnung: (w-tw)/2 
    set "POSITION_Y=(h-th)/3"      : Y-Textposition, für mittige Anordnung: (h-th)/2 
    set "DS=37"                    : Startzeitpunkt
    set "DE=45"                    : Endzeitpunkt
    set "FID=2"                    : Fade-in Dauer (darf klein sein, aber nicht null)
    set "FOD=1"                    : Fade-out Dauer (darf klein sein, aber nicht null)

    REM ******************************************************************************** 
    REM *  This is the filter definition. Don't change anything in the following line. *
    REM ********************************************************************************
    set "%NAME%=drawtext='fontfile=%FONTFILE%:textfile=%FILENAME%:fontcolor_expr=%COLOR%@%%{e\:between(t,%DS%+%FID%,%DE%-%FOD%)+((t-%DS%)/%FID%)*between(t,%DS%,%DS%+%FID%)+(%DE%-t)/%FOD%*between(t,%DE%-%FOD%,%DE%)}:fontsize=%SIZE%:x=%POSITION_X%:y=%POSITION_Y%'"
     

    REM Schritt 4: Hinzufügen von Texten und Musik zum Video

    set "MUSIC_DELAY=2"                : Verzögerung in Sekunden, bevor die Musik beginnt
    set "MUSIC_FILE=Peter_Rudenko_-_When_It_Rains_Part_2.mp3" : Musik-Datei
    set "FILENAME=Wolken.mp4"                                 : Name des erzeugten Videos 

    REM In der zweiten Zeile müssen die oben definierten Filter angegeben werden

    c:/Programme/ffmpeg/bin/ffmpeg -itsoffset %MUSIC_DELAY% -i %MUSIC_FILE% ^
    -i temp.mp4 -vf "%FILTER1%,%FILTER2%" ^
    -codec:v %CODEC% -s %FRAMESIZE% -b:v %VIDEO_BITRATE% -q:v %VIDEO_QUALITY% %FILENAME%

    REM Warten auf Tastendruck, damit man eventuelle Fehlermeldungen lesen kann

    pause
     

    Kurzanleitung für die Erzeugung eines Videos aus Einzelbildern, mit Vorspann, Nachspann und Musik:
    -- Neuen Ordner anlegen, und folgendes hineinkopieren:
      -- Alle *.JPG Bilder (müssen fortlaufend durchnummeriert sein)
      -- Die Batch Datei, Inhalt des grauen Kastens (siehe oben) kopieren
      -- Text-Datei "titel.txt" anlegen
      -- Text-Datei "nachspann.txt" anlegen
      -- Zeichensatz "arial.ttf" (im Internet zu finden)
      -- Eine beliebige MP3 Musikdatei
    -- Nun wird die Batch Datei bearbeitet, wichtig sind zunächst folgende Einträge:
      -- Dateiname der Einzelbilder
      -- Framerate
      -- Nummer des ersten Bildes
      -- QUAD=true, falls es runde Fisheye-Bilder sind
      -- Framesize
      -- weiter unten bei Schritt 4 den Namen der MP3 Musik-Datei eintragen
      -- und darunter den Namen des fertigen Videos
    -- Batch Datei starten, der Prozess läuft in zwei Schritten ab.
        Zuerst wird die Datei temp.mp4 erzeugt, die nur das Video ohne Vorspann, Nachspann und Musik enthält.
        Im zweiten Schritt werden Titel, Nachspann und Musik hinzugefügt.
        Falls die Dateien schon existieren, fragt FFmpeg jedesmal, ob sie überschrieben werden sollen (y/n).
        Der erste Schritt dauert länger als der zweite. Wenn temp.mp4 bereits erzeugt ist und nur noch Änderungen an
        Vorspann, Nachspann und Musik gemacht werden sollen, dann muss man temp.mp4 nicht noch einmal erzeugen
        und kann die Frage mit "n" beantworten !
    -- Falls es nicht so läuft wie erwartet: Im Ausgabefenster nach oben scrollen und die Fehlermeldungen lesen.
        Wichtig ist die am weitesten oben stehende Fehlermeldung. Alles weitere können Folgefehler sein.

    -- Grundsätzliches zur Bearbeitung der Batch-Datei:
      -- Nicht zuviel auf einmal ändern, sonst weiss man nicht welche Änderung falsch war.
      -- Regelmässig Sicherheitskopien machen, damit man wieder zu einem funktionierenden Stand zurückkehren kann
      -- Nicht die Syntax ändern !!!  Keine "  ' % ^ . ,  Zeichen hinzufügen oder weglassen, es sei denn ihr wisst genau was ihr tut.
          Bei solchen Fehlern kann man sich dumm und dämlich suchen.
      -- Keine Zeilenumbrüche innerhalb der FFmpeg Aufrufe, ausgenommen solche bei denen die Zeile mit ^ abgeschlossen ist !
      -- Keine Sonderzeichen, Umlaute oder Leerzeichen in Dateinamen !


    Weiter geht's mit den Themen Gradations-Kurven, Vignettierung und Bildrotation. Das geht so:

    -- Ein Bild wird in GIMP geöffnet.
    -- Farben::Werte --> Im Bild geeignete Punkte für Schwarz- Weiss- und Grau auswählen.
    -- Klick auf "Diese Einstellungen als Kurven bearbeiten"
    -- Feinkorrekturen an den Kurven machen
    -- Dabei möglichst viele Punkte auf die Kurven  setzen, weil sie später durch Geraden interpoliert werden.
    -- Klick auf "Einstellungen als Datei exportieren"
    -- Häkchen setzen bei "Altes Dateiformat für Kurven verwenden"
    -- Dateiname: curves.gimp
    -- Abspeichern
    -- Dann den Konverter GIMP2ACV aufrufen. Dadurch wird die Datei curves.gimp eingelesen, konvertiert und als curves.acv abgespeichert. Die Datei curves.gimp muss in gleichen Ordner stehen.
    -- Im Batch-File für die FFmpeg Bearbeitung wird u.a. der entsprechende Video-Filter ausgerufen: -vf curves=psfile='curves.acv'

    Vignettierung am Bildrand kann automatisch ausgeglichen werden: -vf vignette=0.5:mode=backward
    mode=backward macht die Bildescken heller, mode=forward würde sie dunkler machen. Die Zahl 0.5 muss so eingestellt werden, dass die Bildecken  weder zu hell noch zu dunkel werden.

    Bildrotation um 180° geht so: -vf rotate=PI

    Die drei Filter können so zusammengefasst werden:
    -vf "vignette=0.5:mode=backward,curves=psfile='curves.acv',rotate=PI"


    So kann man den Aufnahme-Zeitpunkt der Bilder in das Video einblenden:
     
    REM  *******************************
    REM  Definition der Zeit-Einblendung
    REM  *******************************

    set "NAME=FILTER3"             : Eindeutiger Name dieser Texteinblendung
    set "FONTFILE=courbd.ttf"      : Zeichensatz 
    set "FILENAME='nachspann.txt'" : Dateiname (muss UTF-8 codiert sein, falls Umlaute
                                   :  enthalten sind)
    set "COLOR=white"              : Farbe für Titel
    set "BOXCOLOR=black"
    set "SIZE=30"                  : Schriftgröße 
    set "POSITION_X=0"             : X-Textposition
    set "POSITION_Y=(h-th)"        : Y-Textposition 
    set "S=72060"                  : Aufnahme-Uhrzeit des ersten Bildes in Sekunden
    set "I=8"                      : Intervall in Sekunden 
                                   :  Falls sich -framerate und -r unterscheiden, dann muss 
                                   :  hier eingetragen werden:
                                   :  Intervall_in_Sekunden * FRAMERATE / RATE

    set %NAME%=drawtext='fontfile=%FONTFILE%:text=%%{eif\:mod((%S%+%I%*n)/3600,24)\:'d'\:2}"\:"%%{eif\:mod((%S%+%I%*n)/60,60)\:'d'\:2}"\:"%%{eif\:mod(%S%+%I%*n,60)\:'d'\:2}:fontcolor=%COLOR%:boxcolor=%BOXCOLOR%:box=1:fontsize=%SIZE%:x=%POSITION_X%:y=%POSITION_Y%'
     


    Nochmal zurück zum Thema Framerate.

    Weiter oben habe ich beschrieben, wie man die Framerate so berechnen kann, dass das fertige Video eine bestimmte Gesamtlänge bekommt. Das ist sinnvoll, damit die Video-Länge zur Dauer der Musik passt.
    Dadurch ergeben sich "krumme" Werte für die Framerate, die meistens auch ziemlich klein (5...15) sind.
    Problematisch wird es dann, wenn man mehrere Videos zusammenfügen will. Dann müssen nämlich alle Teil-Videos die gleiche Framerate haben.
    Dieses Problem kann man mit FFmpeg so lösen:
    Der Parameter -framerate wird immer vor den Input-Bildern angegeben, und er bestimmt mit welcher Geschwindigkeit die Bilder eingelesen werden.
    Der Parameter -r wird immer nach den Input-Bildern und vor der Ausgabe-Datei angegeben, und er bestimmt mit welcher Framerate das Video erzeugt wird. Wenn er größer als -framerate ist, dann werden automatisch Bilder dupliziert. Wenn er kleiner als -framerate ist, dann werden automatisch Bilder übersprungen. Wenn der Parameter -r nicht angegeben wird, dann wird der Wert von -framerate übernommen.


    Bilder mit unterschiedlicher Dauer zu einem Video zusammenfügen:

    Im folgenden Beispiel wird jedes Bild eine Sekunde lang gezeigt (25 Frames), ausgenommen das dritte Bild 3 Sekunden (25+50 Frames) und das fünfte Bild 5 Sekunden (25+100 Frames).

     ffmpeg -i image-%3d.jpg -vf "zoompan=d=25+'50*eq(in,3)'+'100*eq(in,5)'" test.mp4


    Bilder mit Kreuz-Überblendung (Crossfading) aneinanderfügen:

    Hierfür kann der "framerate" Filter missbraucht werden. Im folgenden Beispiel ist 0.25 die Framerate mit der die Bilder eingelesen werden, also 4 Sekunden pro Bild.
    Der Parameter "fps" bestimmt die Framerate des Ausgangs-Videos, in diesem Fall 30.
    Mit den Parametern "interp_start" und "interp_end" kann man die Dauer der Überblendung beeinflussen.
    interp_start=128:interp_end=128  bedeutet dass keine Überblendung gemacht wird.
    interp_start=0:interp_end=255  bedeutet kontinuierliche Überblendung. Wenn das erste Bild vollständig ausgeblendet ist und das zweite Bild ganz eingeblendet ist, dann beginnt sofort die Einblendung des dritten Bildes. Es gibt keine Pause in der die Bilder unveränderlich gezeigt werden. Alles ist immer in Bewegung.
    interp_start=64:interp_end=191  bedeutet dass während der Hälfte der Zeit ein Bild unveränderlich gezeigt wird, und während der anderen Hälfte der Zeit findet die Überblendung statt. Leider ist es keine vollständige Überblendung von 0 bis 100%, sondern nur eine von 25% bis 75%. Das ist nicht ganz das was man eigentlich möchte, aber besser als gar keine Überblendung.

     ffmpeg -framerate 0.25 -i IMG_%3d.jpg -vf "framerate=fps=30:interp_start=64:interp_end=192:scene=100" test.mp4