Python-Script: WMA- in MP3-Dateien umwandeln mit ffmpeg (avconv)

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.

ffmpeg: der neue Befehl zum Konvertieren heißt "avconv"

ffmpeg: der neue Befehl zum Konvertieren heißt „avconv“

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

Sebastian

...ist staatlich geprüfter Techniker für Elektrotechnik, Schwerpunkt Prozessautomatisierung und Energietechnik. Die Themen Automatisierung und Programmierung haben es ihm besonders angetan.
Außerdem ist er für jede technische Spielerei zu haben 😉
Sebastian

2 Comments

  1. Avatar
    Antworten René

    Hallo,
    Dein Post ist zwar schon länger her aber Google hat mich zu Dich geführt, ein Kumpel hat eine Festplatte auf der sehr alte meist von TV Sendungen aufgenommene Lieder sind diese liegen meist in Videoformaten vor mp4 und auch .rec VLC spielt dies .rec problemlos ab nur mein Kumpel ist Comptertechnisch ärger als ein Dino und er hat mich gebeten ob ich ihm diese Festplatte so umkonvertieren kann damit er wieder seine Musik hören kann.

    mein erstes Problem ich habe sehr wenig zeit 🙂 mein zweites Problem diese Daten liegen oft in zick Unterordner und wild durcheinander mein drittes Problem Programmieren 😀 dein Script liest sich so als würde es genau das sein was ich brauche nur meine Begabung sagt, hä bitte was?

    Also ich möchte auf dieser besagten Festplatte alle Mediadatein finden und konvertieren kann ich in Zeile 14
    kann ich die Festplatte vom / mit -r durchsuchen ?
    mehrere Dateien angeben WIE srctype = ‚wma‘ ‚mp4‘ ‚avi‘ usw.?
    und zu guter letzt sollten alle Dateien in ein anderes Verzeichnis gesammelt werden

    falls du es noch liest würde ich mich über etwas Hilfe sehr freuen
    herzliche Grüße aus Österreich
    René

  2. Sebastian
    Antworten Sebastian

    Hi René,

    um dir da vollumfänglich helfen zu können fehlt mir im Moment die Zeit und ohne die Medienbibliothek wird es sowieso schwierig. Ich würde an deiner Stelle so an die Sache heran gehen:
    Bei den vielen Unterordnern würde ich einfach im Dateimanager deiner Wahl das Stammverzeichnis inklusive Unterordner nach Dateien mit den entsprechenden Erweiterungen durchsuchen und die gefundenen Dateien an die entsprechende Stelle verschieben.
    Dann würde ich mal testweise manuell eine Datei umwandeln und schauen, wie das Ergebnis ist – also ob du damit auch zufrieden bist. Dann würde ich das Script entsprechend anpassen (Dateiendung und ggf. den Aufruf von ffmpeg) und so Dateityp für Dateityp abarbeiten.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.