Wie konvertiert man ein ganzes Verzeichnis/Ordner mit ffmpeg über die Kommandozeile oder mit einem Batch-Skript?
Antworten
Zu viele Anzeigen?Ich weiß, dass dies vielleicht überflüssig ist, aber ich verwende dieses Skript zur Stapelkonvertierung von Dateien.
old_extension=$1
new_extension=$2
for i in *."$old_extension";
do ffmpeg -i "$i" "${i%.*}.$new_extension";
done
Es braucht 2 Argumente, um es flexibler zu machen:
- die Erweiterung, von der Sie konvertieren möchten
- die neue Erweiterung, in die Sie konvertieren möchten
Ich habe einen Alias dafür erstellt, aber Sie können ihn auch manuell wie folgt verwenden:
sh batch_convert.sh mkv mp4
Dadurch würden alle mkv
Dateien in mp4
Dateien.
Wie Sie sehen können, ist es etwas vielseitiger. Solange ffmpeg
konvertieren können, können Sie zwei beliebige Erweiterungen angeben.
Das folgende Skript funktioniert bei mir gut in einer Bash unter Windows (es sollte also auch unter Linux und Mac funktionieren). Es behebt einige Probleme, die ich mit einigen anderen Lösungen hatte:
- Verarbeitet Dateien in Unterordnern
- Ersetzt die Quell-Erweiterung durch die Ziel-Erweiterung, anstatt sie nur anzuhängen
- Funktioniert mit Dateien mit mehreren Leerzeichen und mehreren Punkten im Namen (Siehe diese Antwort für Details).
- Kann ausgeführt werden, wenn die Zieldatei vorhanden ist, wobei vor dem Überschreiben eine Abfrage erfolgt
ffmpeg-batch-convert.sh
:
sourceExtension=$1 # e.g. "mp3"
targetExtension=$2 # e.g. "wav"
IFS=$'\n'; set -f
for sourceFile in $(find . -iname "*.$sourceExtension")
do
targetFile="${sourceFile%.*}.$targetExtension"
ffmpeg -i "$sourceFile" "$targetFile"
done
unset IFS; set +f
Beispielanruf:
$ sh ffmpeg-batch-convert.sh mp3 wav
Wenn Sie möchten, dass die Quelldateien gelöscht werden, können Sie das Skript wie folgt ändern:
sourceExtension=$1 # e.g. "mp3"
targetExtension=$2 # e.g. "wav"
deleteSourceFile=$3 # "delete" or omitted
IFS=$'\n'; set -f
for sourceFile in $(find . -iname "*.$sourceExtension")
do
targetFile="${sourceFile%.*}.$targetExtension"
ffmpeg -i "$sourceFile" "$targetFile"
if [ "$deleteSourceFile" == "delete" ]; then
if [ -f "$targetFile" ]; then
rm "$sourceFile"
fi
fi
done
unset IFS; set +f
Beispielanruf:
$ sh ffmpeg-batch-convert.sh mp3 wav delete
Ich verwende es, um Untertitel für Fernsehsendungen oder Filme unter Windows hinzuzufügen.
Erstellen Sie einfach einen "subbed"-Ordner und eine Bat-Datei im Video- und Unterverzeichnis, geben Sie den Code in die Bat-Datei ein und führen Sie sie aus.
for /R %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
ffmpeg.exe -i "%%~f" -i "%%~nf.srt" -map 0:v -map 0:a -map 1:s -metadata:s:a language=eng -metadata:s:s:1 language=tur -c copy ./subbed/"%%~nf.mkv"
)
Es wird ein bisschen wie Code-Golf hier, aber da fast alle Antworten bisher bash sind (mit Ausnahme einer einsamen cmd-Antwort), ist hier eine Windows plattformübergreifend Befehl, der Powershell verwendet (weil genial):
ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}
Sie können *.avi in eine Datei ändern, die Ihrem Quellmaterial entspricht.