Wie konvertiert man ein ganzes Verzeichnis/Ordner mit ffmpeg über die Kommandozeile oder mit einem Batch-Skript?
Antworten
Zu viele Anzeigen?@Linux Um einen Haufen zu konvertieren, ist mein One-Liner zum Beispiel dieser (.avi nach .mkv) im gleichen Verzeichnis:
for f in *.avi; do ffmpeg -i "${f}" "${f%%.*}.mkv"; done
bitte beachten Sie das doppelte "%%" in der Ausgabeanweisung. Damit erhalten Sie nicht nur das erste Wort oder den Namen der Eingabedatei, sondern alles vor dem letzten Punkt.
Für alle, die eine Stapelkonvertierung mit ffmpeg durchführen wollen, aber eine bequeme Windows-Oberfläche wünschen, habe ich dieses Front-End entwickelt:
https://sourceforge.net/projects/ffmpeg-batch
Es fügt ffmpeg eine fensterähnliche Oberfläche, Fortschrittsbalken und Informationen über die verbleibende Zeit hinzu, Funktionen, die ich bei der Verwendung von ffmpeg immer vermisst habe.
Natürlich gibt es jetzt PowerShell, die speziell dafür entwickelt wurde, genau so etwas zu machen extrem einfach.
Und, ja, PowerShell ist auch verfügbar auf anderen Betriebssystemen als nur Windows, aber es ist auf Windows vorinstalliert, so dass dies für jeden nützlich sein sollte.
Zuerst wollen Sie alle Dateien im aktuellen Verzeichnis auflisten, also beginnen wir mit:
ls
Sie können auch Folgendes verwenden ls -Recurse
wenn Sie auch alle Dateien in Unterverzeichnissen rekursiv konvertieren wollen.
Dann filtern wir diese nur nach dem Dateityp, den wir konvertieren wollen - z. B. "avi".
ls | Where { $_.Extension -eq ".avi" }
Danach übergeben wir diese Informationen an FFmpeg durch eine ForEach
.
Für die Eingabe von FFmpeg verwenden wir die FullName
- das ist der gesamte Pfad zur Datei. Und für die Ausgabe von FFmpeg verwenden wir die Name
- sondern Ersetzen von die .avi
am Ende mit .mp3
. Es wird also in etwa so aussehen:
$_.Name.Replace(".avi", ".mp3")
Fassen wir also all das zusammen, und das ist das Ergebnis:
ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }
Damit werden alle ".avi"-Dateien durch FFmpeg in ".mp3"-Dateien umgewandelt. Ersetzen Sie einfach die drei Dinge in Anführungszeichen, um zu entscheiden, welche Art der Umwandlung Sie wünschen, und fügen Sie ruhig weitere Argumente für FFmpeg innerhalb der ForEach
.
Sie könnten noch einen Schritt weiter gehen und Folgendes hinzufügen Remove-Item
am Ende, um die alten Dateien automatisch zu löschen.
Wenn ffmpeg
nicht in Ihrem Pfad ist und es sich in dem Verzeichnis befindet, in dem Sie sich gerade befinden, schreiben Sie ./ffmpeg
dort statt nur ffmpeg
.
Ich hoffe, das hilft allen.
Wenn Sie GNU parallel Sie können alle folgenden .avi-Dateien konvertieren vid_dir
zu mp4 parallel, wobei alle bis auf einen Ihrer CPU-Kerne mit
find vid_dir -type f -name '*.avi' -not -empty -print0 |
parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4
Zur Konvertierung von/zu anderen Formaten ändern Sie '*.avi'
o .mp4
nach Bedarf. GNU parallel ist in den meisten Linux-Distributionen in einem Paket enthalten, das normalerweise parallel
.