328 Stimmen

Wie kann man ein ganzes Verzeichnis mit ffmpeg konvertieren?

Wie konvertiert man ein ganzes Verzeichnis/Ordner mit ffmpeg über die Kommandozeile oder mit einem Batch-Skript?

6voto

Alexander Luna Punkte 4937

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:

  1. die Erweiterung, von der Sie konvertieren möchten
  2. 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.

6voto

Marco Eckstein Punkte 3675

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

4voto

Teknoist Punkte 41

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"
    )

3voto

stib Punkte 3011

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.

3voto

Janghou Punkte 1283

Bei Verwendung mehrerer Kerne ist dies der schnellste Weg (mit parallel ):

parallel "ffmpeg -i {1} {1.}.mp4" ::: *.avi

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X