FFmpeg - Filterverkettung und Mapping-Ausgabe

FFmpeg - Filterverkettung und Mapping-Ausgabe

Ist es in FFmpeg möglich, einen Ausgang aus der Mitte einer Filterkette zuzuordnen?

Beispielsweise in diesem Befehl:

ffmpeg -f lavfi -i smptehdbars=rate=25:size=1920x1080 -filter_complex "[0:v]drawtext=text=text1:x=100/2:y=100:fontsize=50[txt1];[txt1]drawtext=text=text2:x=200/2:y=200:fontsize=50[txt2];[txt2]drawtext=text=text3:x=300/2:y=300:fontsize=50[txt3];[txt3]drawtext=text=text4:x=400/2:y=400:fontsize=50[txt4]" -map "[txt4]" -t 10 -y ~/Desktop/mapping.mp4

Das funktioniert: -map "[txt4]". Beim Versuch, -map "[txt3]" (oder txt2 oder txt1) zu verwenden, erhalte ich "

Ausgabe mit der Bezeichnung „txt3“ existiert in keinem definierten Filterdiagramm oder wurde bereits anderswo verwendet.“

Ich möchte den vollständigen Befehl aufrufen und verschiedene Teile der Filterkette ( -map [$val]) verwenden, um unterschiedliche Dateien auszugeben.

Danke

Antwort1

Das ist möglich, aber wir müssenTeiltFilter für den "mittleren Filter".

Wenn der „mittlere Filter“ als Eingabe für einen anderen Filter verwendet wird, wird er von diesem Filter „verbraucht“ und kann später nicht mehr verwendet werden.


Hier ist ein Beispiel zum Erstellen von Videodateien aus allen „mittleren Filtern“ mit einem Befehl:

ffmpeg -y -f lavfi -i smptehdbars=rate=25:size=1920x1080 -filter_complex "[0:v]drawtext=text=text1:x=100/2:y=100:fontsize=50:fontfile=arial.ttf,split[txt1][txt1out];[txt1]drawtext=text=text2:x=200/2:y=200:fontsize=50:fontfile=arial.ttf,split[txt2][txt2out];[txt2]drawtext=text=text3:x=300/2:y=300:fontsize=50:fontfile=arial.ttf,split[txt3][txt3out];[txt3]drawtext=text=text4:x=400/2:y=400:fontsize=50:fontfile=arial.ttf[txt4]" -t 10 -map "[txt1out]" mapping1.mp4 -t 10 -map "[txt2out]" mapping2.mp4 -t 10 -map "[txt3out]" mapping3.mp4 -t 10 -map "[txt4]" mapping4.mp4


Um jede Datei einzeln zu kodieren, können wir hinzufügenStreamauswahlFilter, am Ende der Filterkette:

[txt1out][txt2out][txt3out][txt4]streamselect=4:map=1[out]

Set map=0zum Auswählen [txt1out], Set map=1zum Auswählen [txt2out]...

Beispielbefehl:

ffmpeg -y -f lavfi -i smptehdbars=rate=25:size=1920x1080 -filter_complex "[0:v]drawtext=text=text1:x=100/2:y=100:fontsize=50:fontfile=arial.ttf,split[txt1][txt1out];[txt1]drawtext=text=text2:x=200/2:y=200:fontsize=50:fontfile=arial.ttf,split[txt2][txt2out];[txt2]drawtext=text=text3:x=300/2:y=300:fontsize=50:fontfile=arial.ttf,split[txt3][txt3out];[txt3]drawtext=text=text4:x=400/2:y=400:fontsize=50:fontfile=arial.ttf[txt4];[txt1out][txt2out][txt3out][txt4]streamselect=4:map=1[out]" -t 10 -map "[out]" mapping2.mp4


Hinweis:
Das Hinzufügen fontfile=arial.ttfwar erforderlich, damit es drawtextunter Windows funktioniert.

verwandte Informationen