Beim Aufräumen meiner Musikbibliothek bin ich auf einige WMA-Datein gestoßen, die ich gern in das MP3-Format umwandeln wollte. Das ganze soll weitestgehend automatisch im Hintergrund auf meinem Synology NAS laufen und möglichst wenig Interaktion erfordern. Für so ein Vorhaben benötigt man nicht unbedingt eine kostenpflichtige Software, denn das Ganze lässt sich auch mittels ffmpeg
realisieren. ffmpeg wird von Synology bei deren NAS-Geräten über das Betriebssystem DSM direkt mitgeliefert. Aber auch auf dem Raspberry Pi stellt das Fehlen in der Standardinstallation kein Problem dar. Hier lässt sich ffmpeg ohne weiteres nachinstallierten:
$ sudo apt-get install ffmpeg
Eigentlich benötigt man nicht unbedingt ein Script dafür, es vereinfacht jedoch das Handling und ermöglicht es, eine Vielzahl von Dateien mit nur einem Befehl zu konvertieren.
Die Syntax für ffmpeg lautet:
ffmpeg -i <Quelldatei> -codec:a <Codec> -qscale:a <Qualität> <Zieldatei>
In unserem Fall:
ffmpeg -i input.wma -codec:a libmp3lame -qscale:a 2 output.mp3
Wundert Euch nicht, wenn Ihr die Meldung angezeigt bekommt, dass sich der Befehl ffmpeg
nur noch aus Kompatibilitätsgründen aufrufen lässt. Der neue Befehl heißt avconv
, funktioniert auch genauso, ist jedoch auf meinem Synology NAS noch nicht verfügbar.
Sollte es irgendwann soweit sein, dass sich ffmpeg
nicht mehr aufrufen lässt, muss im Script auf Zeile 30 stattdessen einfach avconv
eingesetzt werden.
Das Script
Da Python meine bevorzugte Programmiersprache ist, hab ich damit schnell ein Script gebastelt. Das durchsucht alle Dateien im aktuellen Verzeichnis nach der Dateiendung .wma
und wandelt sie durch einen entsprechenden Aufruf von ffmpeg in MP3-Dateien um. Die neuen Dateien tragen dann den gleichen Namen wie die alten, nur mit anderer Endung.
#!/usr/bin/env python #coding: utf8 import dircache import os import re #------------------------------------------------------------------------------- # Arbeitsverzeichnis workdir = './' # Ausgangsmaterial, nach dem gesucht werden soll srctype = 'wma' #------------------------------------------------------------------------------- # Dateilisten filesInWorkdir = dircache.listdir(workdir) for file in filesInWorkdir: # nur WMA-Dateien bearbeiten if str(file).split('.')[-1] == srctype: # Neuen Dateinamen aus dem Alten bilden newFileName = str(file).split('.' + srctype)[0] + '.mp3' # Mit ffmpeg umwandeln os.popen("ffmpeg -i " + re.escape(workdir + "/" + file) + " -codec:a libmp3lame -qscale:a 2 " + re.escape(workdir + "/" + newFileName) + " 1&> /dev/null") print file + " umgewandelt -> " + newFileName #------------------------------------------------------------------------------- # Terminal-Befehl für ffmpeg: # DS> ffmpeg -i input.wma -codec:a libmp3lame -qscale:a 2 output.mp3 # Average kbit/s | Bitrate range kbit/s | ffmpeg option # ---------------+----------------------+------------------------------------------- # 320 | 320 CBR (non VBR) | -b:a 320k (NB this is 32KB/s, or its max) # 245 | 220-260 | -q:a 0 (NB this is VBR from 22 to 26 KB/s) # 225 | 190-250 | -q:a 1 # 190 | 170-210 | -q:a 2 # 175 | 150-195 | -q:a 3 # 165 | 140-185 | -q:a 4 # 130 | 120-150 | -q:a 5 # 115 | 100-130 | -q:a 6 # 100 | 80-120 | -q:a 7 # 85 | 70-105 | -q:a 8 # 65 | 45-85 | -q:a 9
Anwendung
Einfach das Script in einen Texteditor kopieren, als wma2mp3.py
abspeichern und ausführbar machen:
$ chmod +x wma2mp3.py
Anschließend die Datei ins Verzeichnis mit den .wma Dateien kopieren und mit folgendem Befehl ausführen:
$ ./wma2mp3.py
Funktionsweise im Detail
Zeile 11 – Arbeitsverzeichnis festlegen: In dem Verzeichnis, welches hier angegeben wird, sucht das Script nach den Dateien, die umgewandelt werden sollen. ./
steht dabei für das aktuelle Verzeichnis.
Zeile 14 – Ausgangsmaterial: Hier wird festgelegt, welche Dateien umgewandelt werden sollen. In meinem Fall sind das WMA-Dateien.
Zeile 19 – Dateistruktur im Arbeitsverzeichnis einlesen
Zeile 21 – Schleife über alle Dateien im Arbeitsverzeichnis
Zeile 24 – Der Name der aktuell bearbeiteten Datei wird an den Stellen gesplittet, die einen Punkt enthalten. So entstehen mehrere Strings. Der letzte wird mit dem Inhalt der Variable srctype
(also wma
)verglichen. Wenn es sich also um eine Datei mit der Endung wma
handelt, werden die nachfolgenden Befehle abgearbeitet, sonst geht die Schleife zur nächsten Datei über.
Zeile 27 – Neuen Dateinamen bilden: Es wird wieder der gesamte Dateiname hergenommen und die Endung inkl. Punkt (.wma
) abgetrennt. Anschließend wird .mp3
angehängt.
Zeile 30 – Der eigentliche Konvertierungsbefehl wird abgesetzt. Dabei bedeutet os.popen(...
, dass ein externes Programm (hier eben ffmpeg) aufgerufen wird. Damit ffmpeg richtig arbeiten kann, müssen noch weitere Argumente angegeben werden. -i
steht für die Quelldatei, gefolgt vom Dateinamen der Quelldatei, der aus Verzeichnis und dem eigentlichen Dateinamen besteht. -codec:a libmp3lame
ist der zu nutzende Codec und vom Grunde her die Angabe, in welches Format konvertiert werden soll, nämlich mp3
. Anschließend folgt -qscale:a 2
für die Bitrate der Zieldatei. Im Script ist ganz unten auch eine Tabelle enthalten, welche Angaben zu welchen Ergebnissen führen. Danach folgt die Zieldatei, wieder bestehend aus dem Zielverzeichnis + dem berechneten Dateinamen. 1&> /dev/null
bedeutet, dass alle Ausgaben, die man auf der Kommandozeile sonst zusehen bekommen würde, „ausgeblendet“ werden sollen. Das sind nämlich recht viele Zeilen je Datei.
Zeile 32 – Ausgabe, welche Datei umgewandelt wurde (erscheint dann im Terminal)
Das Script kann man natürlich noch weiter anpassen, aber für meinen Bedarf hat es gereicht. Weiterführende Dokumentation zu ffmpeg findet Ihr hier: https://www.ffmpeg.org/documentation.html
- Proxmox: „Failed to connect to Server“ mit Safari auf MacOS - 28. Januar 2023
- Loxone: Benachrichtigung per Telegram - 15. Januar 2022
- Telegram: Nachrichten per Bot von der Heimautomation aufs Handy - 2. Januar 2022
2 Comments