[Linux] Audiodateien automatisiert konvertieren

Bei mir haben sich in meinem Musikverzeichnis von früher Dateien in unpraktischen Formaten angesammelt. Vor allem Windows Media Audio die ich durch das Rippen von CDs über den Windows Mediaplayer bekam. Ein großes Problem ist, das Android Handys diese nicht abspielen.

Deshalb wollte ich diese Altlasten aufräumen, und alle Dateien auf ein Format bringen. In meinem Fall hab ich mich für MP3 entschieden. Das folgende Beispiel lässt sich aber auch Problemlos auf andere Formate übertragen.

Wer auf Erklärungen verzichten kann oder zu ungeduldig ist, sollte nach unten scrollen ;)

Zur Konvertierung benutze ich ffmpeg. Dieses hat einen relativ einfachen Syntax zum Konvertieren:

ffmpeg -i <INPUTFILE> -acodec <CODEC> -ab <BITRATE> <OUTPUTFILE>

Zum aufspüren meiner Dateien rufe ich find in meinem Musikordner auf:

cd /users/foobar/Musik # Beispiel Ordner :)
find -type f -name "*.wma"

Dieser Befehl listet mir alle .wma Dateien rekursiv auf, die sich in meinem Ordner befinden. Um mit den ausgegebenen Dateien weiter zu arbeiten, pipe ich den Befehl nach xargs. Damit kann ich einen beliebigen Befehl ausführen, der sich irgendwie aus der Ausgabe zusammensetzten kann.

find -type f -name "*.wma" | xargs -I{} echo {}

Das hinter -I angebene pattern ({}) wird in dem Befehl mit den Zeilen aus der Ausgabe von find ersetzt. Es wird also echo {} für jede gefundene Datei ausgeführt. (Die Ausgabe ändert sich nicht zum vorherigen Befehl.)

Der ffmpeg Befehl will bei <OUTPUTFILE> den Namen der mp3 datei. In der Ausgabe habe ich aber die Endung .wma. Deshalb habe ich mit sed die Endung entfernt:

find -type f -name "*.wma" | xargs -I{} echo {} | sed "s/.wma/./g"

Jetzt werden nur noch die Pfade, ohne Endung angegeben. Jetzt kann ich damit ffmpeg aufrufen. Als Bitrate nehme ich 128k.

find -type f -name "*.wma" | xargs -I{} echo {} | sed "s/.wma/./g" | xargs -I{} ffmpeg -i {}wma -acodec mp3 -ab 128k {}mp3

Das sollte die Dateien erfolgreich konvertieren, somit können die alten gelöscht werden. Falls man nochmal checken will, ob wirklich alles gut ging, kann man mit du schauen, ob die Dateien wirklich existieren und auch eine realistische Größe haben. (nicht 0 Byte)

find -type f -name "*.wma" | xargs -I{} echo {} | sed "s/.wma/./g" | xargs -I{} du {}mp3 #Überprüfen
find -type f -name "*.wma" -exec rm {} \; #Löschen 

Achtung: xargs kann Ausgaben, die ein ‚ (single quote) Zeichen enthalten, nicht richtig handlen, deshalb solltet ihr darauf achten, das kein Track eins enthält.

Zusammenfassung:

cd /users/foobar/Musik # Beispiel Ordner :)
find -type f -name "*.wma" | xargs -I{} echo {} | sed "s/.wma/./g" | xargs -I{} ffmpeg -i {}wma -acodec mp3 -ab 128k {}mp3
find -type f -name "*.wma" | xargs -I{} echo {} | sed "s/.wma/./g" | xargs -I{} du {}mp3 #Überprüfen / Optional
find -type f -name "*.wma" -exec rm {} \; #Löschen