3 Februar 2014 22:54

Musik verlustlos aufteilen

Sollte man mal in die Situation kommen, mehrere Musikstücke oder ein ganzes Hörspiel/Hörbuch in einer Datei zu haben und möchte man die Teile voneinander trennen, dann gibt es mehrere Möglichkeiten.

Entweder man nimmt ein Audioprogramm (wie z.B. Audacity), lädt dort die Datei hinein und trennt sie anhand der Wellenform (und dem Gehörten) auf. Das funktioniert einfach und schnell, macht aber nur Sinn, wenn das Programm die Datei verlustlos wieder speichern kann.

Denn beim erneuten Codieren geht einiges an Qualität verloren. Oftmals mag man es gar nicht hören, aber schon eine einzige Neucodierung kann sich an manchen Stellen bemerkbar machen (und wenn man ein gutes Gehör und es gutes Wiedergabesystem hat, auch überall).

Ich habe mir eine Lösung auf der Kommandozeile ausgedacht. Benötigt wird das Programm ffmpeg, das so ziemlich alles im Bereich Audio und Video machen kann.

Pausen finden

Zuerst muss man die Stellen finden, an denen ein Teil endet und der nächste beginnt. ffmpeg bietet dafür den Filter silencedetect. Der Aufruf sieht insgesamt folgendermaßen aus:

$ ffmpeg -i original.xyz -af silencedetect=noise=0.0001 -f null -

Der Filter hat noch zwei Optionen, mit denen man zum einen die minimale Länge der Pause und zum anderen den Schwellenwert der Lautstärke angeben kann. Die Standardwerte erfordern eine Pause von zwei Sekunden, was eventuell zu lang ist. Man kann die Pause über silencedetect=d=<s> angeben.

Verlustlos aufteilen

Jetzt kommt der spannende Teil. Im vorherigen Schritt wurden die Pausen gefunden (Ausgabe in Sekunden), jetzt muss an diesen Stellen getrennt werden. Meine Lösung ist leider noch nicht sehr elegant (geschweige denn automatisiert), aber sie funktioniert.

Zur Vorbereitung sollte man die Länge der jeweiligen Abschnitte ausrechnen. Anschließend kann man jeden Teil für sich über folgenden Befehl extrahieren:

$ ffmpeg -i original.xyz -ss <Start> -t <Länge> -c:a copy <Nummer>.xyz

-ss ist die Startzeit in Sekunden, -t die Länge, ebenfalls in Sekunden (man kann auch absolute Werte in hh:mm:ss[.xxx] angeben). Und das war's auch schon.

Kommentare

Powered by BetaBlog
Login | RSS Beiträge RSS Kommentare Impressum