Bash - Alle Videodateien in einem Verzeichnis nach .mp4 konvertieren
Folgendes, einfaches Beispiel konvertiert alle FLV-Dateien zu MP4. FFMPEG muss natürlich installiert und im Pfad verfügbar sein.
for i in *.flv; do ffmpeg -i "$i" "${i%.*}.mp4"; done
die Parameter Expansion ${i%.*} entfernt den kürzesten match nach dem Punkt und entfernt so die Erweiterung aus dem Namen, die hinten als ".mp4" wieder angefügt wird. Ein großes Problem ist, dass das ganze nur bei Dateinamen ohne Leerzeichen funktioniert, weil "for" die sonst zerlegt.
Präziser geht es mit "find". An den -exec-Parameter lassen sich ganze Skripte anhängen, wenn man sie mit Semikola zu Einzeilern zusammenfügt. Das folgende Beispiel erzeugt ein Unterverzeichnis "conv" und konvertiert alle FLV-Dateien in den Container MP4, Video Codec h.264, Pixelformat yuv420p und audio codec aac mit einer Bitrate von 2 Mbit/s.
mkdir ./conv
find -maxdepth 1 -iname "*.flv" -exec bash -c 'file_src="{}"; file_dst=./conv/${file_src:2}; echo "---------------------------------------------------------------------------"; echo "SRC File:$file_src"; echo "DST File: $file_dst"; echo "---------------------------------------------------------------------------"; ffmpeg -y -hwaccel cuda -vsync 0 -i "$file_src" -pix_fmt yuv420p -c:a aac -c:v h264_nvenc -b:v 2M "$file_dst"' \;
Let's break it down:
Verzeichnis erzeugen:mkdir ./conv
Suche im aktuellen Verzeichnis...find -maxdepth 1
...Dateien mit der Endung flv...-iname "*.flv"
... und führe für jede gefundene Datei einen bash command aus:bash -c '
file_src ist der Pfad der gefundenen Datei, file_dst der Name ohne "./", stattdessen mit "./conv/" vorne. Also eine Datei mit gleichem Namen im Unterverzeichnisfile_src="{}"; file_dst=./conv/${file_src:2};
Die echo-Zeilen zeigen nur die Namen zum debuggen zwischen zwei "Linien" an.
Das Programm ffmpeg...ffmpeg
... überschreibe Dateien (Falls Dinge bei längeren Batches schief gehen)...-y
... verwende CUDA als Hardwarebeschleunigung ...-hwaccel cuda
... übernehme Zeitstempel ...-vsync 0
... in der gefundenen Quelldatei ...-i "$file_src"
... mit Pixelformat yuv420p ...-pix_fmt yuv420p
... h.264 video codec mit beschleunigtem encoder und aac als audio codec ...-c:a aac -c:v h264_nvenc
... einer Videobitrate von 2 MBit/s ... -b:v 2M
... in die Ausgabedatei."$file_dst"
Schließe bash ab und sende nach einem Leerzeichen ein escaped Semikolon. Das ist notwendig, damit -exec abgeschlossen wird.' \;