Montag, 1. November 2010

Flac-Dateien mit Lame codieren.

Da ich die Archivierung meiner Audio-CDs speziell der Hörbücher im verlustlosen Flac-Format mache, stellt sich bei der Wiedergabe im Auto das Problem, dass nur die wenigsten Auto-Radios das Flac-Format unterstützen. Daher müssen die Daten für die Wiedergabe im Auto umgewandelt werden.

Ich gruppiere die Audio-Tracks meiner Hörbücher nach CDs. Dadurch ergibt sich eine zweistufige Ordnerstruktur. Auf der obersten Ebene werden die Verzeichnisse nach Autor und Titel benannt, darunter befinden sich die Ordner für die einzelnen CDs und darin befinden sich die Tracks der jeweiligen CD. Das sieht folgendermaßen aus:


Bei der Codierung für das Auto muss diese Ordnerstruktur natürlich erhalten bleiben. Außerdem müssen die Attribute (Tags) der einzelnen Tracks erhalten bleiben, damit im Auto nicht nur kryptische Dateinamen angezeigt werden.

Insgesamt benötigt man die drei Programme flac, metaflac und lame, um die Codierung durchführen zu können. Die Decodierung übernimmt flac, die Attribute werden mit metaflac ausgelesen und lame codiert alles zu entsprechenden MP3-Dateien, die von jedem MP3-fähigen Autoradio abgespielt werden können.

Mittels metaflac können die Tags eines jeden Tracks ermittelt werden:
$ metaflac --export-tags-to=- CD1/01\ -\ Nordemoor\ CD1_01_Die\ Worte\ Waren\ Mit\ Bleistift....flac 
TITLE=Nordemoor CD1_01_Die Worte Waren Mit Bleistift...
ARTIST=Arnaldur Indridason
TRACKNUMBER=1
TRACKTOTAL=16
ALBUM=Nordermoor
ARTISTSORT=Arnaldur Indridason
DISCNUMBER=1
DISCID=01102e10
MUSICBRAINZ_DISCID=KJNYnzSmMvZBLYakHUtVxKAy5uw-
Dabei entsteht eine einfache Liste, die aus dem Tag-Namen, dem Gleichheitszeichen und dem jeweiligen Tag-Wert besteht.

Dekodiert man die Flac-Datei mit dem Befehl
$ flac -dcs
kann die Ausgabe direkt in den Lame-Codierer gepipet werden. Beim Aufruf von Lame müssen die zuvor ermittelten Tags als Komandozeilenargumente angegeben werden:
$ lame -S -b $BITRATE -h --tt "$TITLE" --tn "$TRACKNUMBER" \
--ty "$DATE" --ta "$ARTIST" --tl "$ALBUM" --add-id3v2 - "$MP3"
Das muss für jede Datei gemacht werden und die Verzeichnishierarchie muss erhalten bleiben. Man will das also nicht per Hand machen. Es bietet sich an, dafür ein kleines Bash-Script zu erstellen. Mit dem Script f2m kann die Umwandlung problemlos für viele Hörbücher in einem Rutsch durchgeführt werden:
$ f2m ~/Audio/Hörbuch/*
Dabei werden für alle Verzeichnisse in den Komandozeilenargumenten entsprechende Verzeichnisse für die MP3-Dateien erstellt.
Alle Flac-Dateien werden unter Beibehaltung der Tags in entsprechende MP3-Dateien
umgewandelt.

Der Quellcode des Scriptes ist in einem Mercurial-Repository auf Google-Code zu finden.