Brennen Sie Dateinamen einzelner Bilder in das FFmpeg-Ausgabevideo

2799
Jpsy

Ich verwende FFmpeg, um eine Reihe einzelner Bilder einzulesen und als Video auszugeben.
Das Ergebnis ist ein Zeitraffer von Screenshots einer Website im Abstand von 1 Minute.

Nun möchte ich die ursprüngliche Aufnahmezeit jedes Bildes mit dem Befehl drawtext in das resultierende Video brennen. Die Aufnahmezeit ist im Dateinamen jedes Bildes verfügbar. Ich kann jedoch keine Option für drawtext finden, um auf die Dateinamen der Eingabebilder zuzugreifen.

Eine Alternative wäre, auf das Erstellungsdatum jedes Bildes von drawtext aus zuzugreifen (ich kann auch keinen Weg finden, dies zu tun). Ich würde aber auf jeden Fall lieber auf den Dateinamen zugreifen, da ich dadurch mehr Möglichkeiten habe, den Text zu formatieren.

Gibt es eine Möglichkeit, dies zu tun?
Es wäre schön, wenn eine vorgeschlagene Lösung auch unter Windows funktionieren würde.

6

2 Antworten auf die Frage

2
Znuff

Sie werden es nicht in einer Zeile machen können, da ffmpegder Drawtext-Filter nicht so fortgeschritten ist.

Sie müssen die Bilder vorher mit Skripts vorverarbeiten.

So etwas wie ein einfaches Bash-Skript:

for i in *.png; do  time = $(echo $i | cut -d . -f 1) ffmpeg -i $i -vf "drawtext=text=$time" mod-$time.png done 

Dann können Sie die mod * .png-Dateien verwenden, um Ihr Video zu erstellen.

2
Jpsy

Die Antwort von Znuff ist großartig (akzeptiert und bestätigt) und ebnete den Weg für meine eigene Lösung. Da es Unix-spezifisch ist und ich unter Windows arbeiten musste, ist hier meine Lösung für Windows 7 und höher:

Ich habe zwei Batch-Dateien (Master.cmd und Slave.cmd) verwendet, um alle Bilder durchzugehen und die Dateinamen darin zu brennen.

Master.cmd:

forfiles /p "MyImagesSubPath" /m "2014-02-15*.png" /c "cmd /c ..\Slave.cmd @file @fname 

Slave.cmd:

ffmpeg -i "%~1" -vf "crop=1072:1192:24:101, drawtext=text=%~2: fontcolor=white: fontsize=60: box=1: boxcolor=black@0.6: x=50:y=50: fontfile=c\\:\\\\Windows\\\\Fonts\\\\myfont.ttf" "mod_%~1" 

Erläuterung:

Es ist notwendig, zwei Chargen aus mehreren Gründen zu verwenden:
1. Die Parameter / c von forfiles akzeptieren nur eine Befehlszeile von begrenzten Länge (253 Zeichen)
2. Nesting des FFmpeg Befehl in den forfiles / c - Parameter würde eine schwindelerregende Höhe des Charakters erfordern abfangen

Der Dateinamenfilter "2014 -.... png" in Master.cmd wird verwendet, um zu verhindern, dass die Schleife ihre eigene Ausgabe (mit dem Namen "mod _.... png") in einer Endlosschleife erneut verarbeitet. Sie müssen diese Filterzeichenfolge an Ihre Quellbilder anpassen.

Der Slave-Stapel wird innerhalb des Unterverzeichnisses "MyImagesSubPath" unterhalb des Stapelverzeichnisses ausgeführt (hier müssen Sie Ihre Quellbilder ablegen). Slave.cmd erhält den Dateinamen mit und ohne Erweiterung (.png) als seine beiden Parameter.

Der Dateiname-Parameter ohne Erweiterung wird als Text verwendet, der in das Bild eingebrannt werden soll. Die resultierenden Bilder werden mit dem Präfix "mod_" im selben Pfad wie die Originalbilder gespeichert. Die Dateinamen können Leerzeichen enthalten.