Wie kombiniere und optimiere ich ffmpeg-Filter, um eine mehrfache Codierung zu vermeiden?

Ich habe noch nie mit ffmpeg gearbeitet und frage mich, welche Optimierung ich für meine Situation nehmen kann.

In einer Schleife habe ich mehrere input.mp4-Dateien, die ich zuerst einzeln konvertiere, um mit diesem Befehl eine gemeinsame Skalierung und Audiorate zu haben:

ffmpeg -i input_01.mp4 -vf 'scale=1280:720,setdar=16/9' -ar 44100 -ac 1 input_01_tmp.mp4

Später füge ich wieder nacheinander Bilder zu jeder input.mp4-Datei hinzu:

ffmpeg -i input_01_tmp.mp4 -i input_01_logo.png -filter_complex "[0:v][1:v]overlay=10:10:enable='between(t,2,11)',fade=t=in:start_time=1.5:d=0.5:alpha=1,fade=t=out:start_time=10.5:d=0.5:alpha=1[fg];[0][fg]overlay=format=auto,format=yuv420p" -c:a copy input_01_unified.mp4

Schließlich kombiniere ich sie nach der Schleife mit mkvmerge:

mkvmerge -o output.mkv \+ input_01_unified.mp4 +\ input_02_unified.mp4 ...

Ich bin mir sicher, dass dies nicht die optimale Lösung ist und frage mich, wie ich es ändern soll.

Ist es möglich, all dies in einem Befehl zu tun? Entweder für jede Datei oder für den gesamten Vorgang.

Kann in einem Befehl ausgeführt werden. Teilen Sie den gesamten Befehl für den 1. und 2. Schritt
@Gyan danke! die fehlenden Teile zu den Befehlen in der Frage hinzugefügt

Antworten (1)

Der einzelne Befehl wird lang sein, aber hier ist ein Beispiel für 3 Eingaben.

ffmpeg -i input_01.mp4 -loop 1 -t 11 -i input_01_logo.png
       -i input_02.mp4 -loop 1 -t 11 -i input_02_logo.png
       -i input_03.mp4 -loop 1 -t 11 -i input_03_logo.png
       -filter_complex
        "[0]scale=1280:720,setsar=1[0v];
         [1]fade=t=in:st=1.5:d=0.5:alpha=1,fade=t=out:st=10.5:d=0.5:alpha=1[0l];
         [2]scale=1280:720,setsar=1[1v];
         [3]fade=t=in:st=1.5:d=0.5:alpha=1,fade=t=out:st=10.5:d=0.5:alpha=1[1l];
         [4]scale=1280:720,setsar=1[2v];
         [5]fade=t=in:st=1.5:d=0.5:alpha=1,fade=t=out:st=10.5:d=0.5:alpha=1[2l];
         [0v][0l]overlay=10:10:format=auto:enable='between(t,2,11)'[0vl];
         [1v][1l]overlay=10:10:format=auto:enable='between(t,2,11)'[1vl];
         [2v][2l]overlay=10:10:format=auto:enable='between(t,2,11)'[2vl];
         [0]pan=1c,aresample=r=44100[0a];
         [2]pan=1c,aresample=r=44100[1a];
         [4]pan=1c,aresample=r=44100[2a];
         [0vl][0a][1vl][1a][2vl][2a]concat=n=2:v=1:a=1[v][a]"
        -map "[v]" -map "[a]" -pix_fmt yuv420p output.mkv

mapAbhängig von Ihrer Shell benötigen Sie möglicherweise einfache Anführungszeichen .

Verwenden Sie eine aktuelle Version von ffmpeg, mindestens 4.0

Danke dir! Ich werde das heute ausprobieren und die Antwort akzeptieren. Hat dies neben der Zeitersparnis irgendwelche Auswirkungen auf eine bessere Qualität im Vergleich zu dem, was ich getan habe?
Danke @Gyan, ich habe die Antwort nicht vergessen und akzeptiert. Vielen Dank für Ihre Hilfe <3
Zur Verdeutlichung, ist es sinnvoll, solche Filter zu kombinieren? Stellt es sicher, dass alles in einer Codierung durchgeführt wird, oder wird es immer noch mehrmals codiert, so wie jede Operation separat ausgeführt wird?
Ja, dies ist die Standardmethode und führt nach der gesamten Filterung nur eine einzige Codierungsoperation durch.
Was ist, wenn wir einige Hundert Eingabedateien haben und die Beschränkungen der Befehlszeilenzeichen überwinden (z. B. in Windows sind es 8192 Zeichen). Der "filter_complex" könnte in eine Datei geschrieben werden und stattdessen "-filter_complex_script" verwenden. Aber was ist mit den "-loop"-Befehlen? Gibt es eine Möglichkeit, die Schleifen irgendwie zu "schrumpfen"? Oder eine andere Möglichkeit, dasselbe Ergebnis mit einer kürzeren Befehlszeile zu erzielen? Ich frage, weil ich gerade dieses spezielle Problem habe...