Wie kombiniert man ffmpeg vf-Befehle zur Größenänderung und Farbkorrektur?

Ich verwende derzeit das folgende Batch-Skript, um einen ffmpeg-Befehl auszuführen:

@echo off
title Convert videos to Mp4 h.264 with FFMPEG. 
echo This script will find all video files of a given extension then make an mp4 h.264 file out of them.
set /p folder="Enter the folder path (cannot contain spaces; must have trailing slash \): "
set /p ft="Enter file type extension: "
set /p abitrate="Enter the audio bitrate in kbps (usually 48): "
set /p size="Enter video width and height (w:h) (usually 852:480): "
set /p vcrf="Enter the video crf value (usually 24): "
for %%f in (%folder%*.%ft%) do ffmpeg -i "%%f" -vf "scale=%size%,setsar=1" -crf %vcrf% -c:a aac -b:a %abitrate%k -ac 1 -movflags +faststart "%folder%%%~nf.mp4"
pause

Das Skript sagt, was es in der Beschreibung oben tut. Ich habe es gebaut, um HDV .m2t-Dateien in webfähige mp4-Dateien zu konvertieren. Wenn ich den ffmpeg-Befehl aus der Skriptschleife extrahiere, sieht das so aus:

 ffmpeg -i input.m2t -vf "scale=852:480,setsar=1" -crf 24 -c:a aac -b:a 48k -ac 1 -movflags +faststart output.mp4

Ich habe einige Videos, die eine Farbkorrektur benötigen, also möchte ich sie nur mit einem Filter versehen, bevor ich sie kodiere. Ich habe mit ffplay herumgespielt und festgestellt, dass das gewünschte Aussehen den folgenden Befehl erfordert, der von dieser Antwort geändert wurde :

 -vf eq=brightness=0.1:saturation=1.5

Das Problem, das ich habe, ist die Integration dieser neuen -vfZeile in den Hauptbefehl. Wenn ich es separat setze, ignoriert ffmpeg das erste für das zweite. Wenn es sie in Anführungszeichen zusammenfügt, werden Fehler ausgegeben. Ich gehe davon aus, dass dies ein Syntaxproblem ist, aber vielleicht auch nicht. Der Hauptbefehl scheint Kommas als Trennzeichen zu verwenden, aber dieser neue Befehl verwendet Doppelpunkte.

Antworten (2)

Filterkomplex wird nicht benötigt. Wenn eine Reihe von Filtern nacheinander auf einen einzelnen Eingang angewendet werden sollen, müssen sie durch ein Komma getrennt und als einzelne Filterkette ( -vf, -af) weitergegeben werden. Das hast du schon mit dem setar gemacht. Damit,

 ffmpeg -i input.m2t -vf "scale=852:480,setsar=1,eq=brightness=0.1:saturation=1.5" -crf 24 -c:a aac -b:a 48k -ac 1 -movflags +faststart output.mp4
Hmmm. Ich dachte, ich hätte es versucht, aber ich werde es noch einmal überprüfen. Was wäre der Unterschied bei der Verwendung -vfanstelle von -filter_complex?
filter_complex dient zum Filtern mehrerer Streams in einer Kombination aus seriellen und/oder parallelen Sequenzen. Sie können diese mehreren Streams auch kombinieren, wie bei der Verwendung von overlayFiltern. Für diesen speziellen Fall gibt es keinen Unterschied, aber die richtige Antwort für Ihr Problem ist nicht, dass filter_complex benötigt wird.

Durch Ausprobieren, Nachahmen der Syntax verschiedener Personen, die in ähnlichen Befehlen verwendet wird, und auf Vorschlag einer ffmpeg-Fehlermeldung bin ich auf Folgendes gekommen, und es hat wie erwartet funktioniert:

 ffmpeg -i input.m2t -filter_complex "scale=852:480,setsar=1","eq=brightness=0.1:saturation=1.5" -crf 24 -c:a aac -b:a 48k -ac 1 -movflags +faststart output.mp4

Die erste Änderung -vfmuss in geändert werden -filter_complex. ffmpeg schlug dies in einer Fehlermeldung vor. Danach reichte es aus, die beiden Befehle einfach mit einem Komma zu trennen und dann auch den neuen Befehl zu zitieren. Die Syntax ähnelt also sehr stark einer CSV-Datei.

Wenn Sie mehr Einblick haben, posten Sie bitte eine Antwort.