Mass .flac -> .mp3-Transcodierung: Wie schreibe ich ein Shell-Skript, das ID3-Tag-Informationen beibehält?

9

In den letzten Wochen bin ich von einem ziemlich praktischen Ansatz zur .flac -> .mp3-Transcodierung zu einem Ansatz übergegangen, der weitaus mehr "Set & Forget" ist.

Der erste Schritt wurde unter Verwendung eines GUI - Frontend (Audacity mit LAME Plug-in) und stattdessen das Verfahren zu stoppen I skizzierte hier .

Der zweite Schritt bestand darin, ein Bash-Shell-Skript zu finden, mit dem diese Befehlsschleife rekursiv arbeiten kann, sodass Verzeichnisse mit vielen Unterverzeichnissen, die FLAC-Dateien enthalten, in einem einfachen Schritt transkodiert werden können. Diese Antwort wurde von einem Benutzer auf askubuntu.com bereitgestellt.

Jetzt möchte ich lernen, wie man Dinge weiter verfeinert, damit die ID3-Tag-Informationen erhalten bleiben. Die Methoden, die mit den obigen ID3-Tag-Daten verknüpft sind, lassen das absolute Minimum übrig (dh es bleibt nur das Titelfeld übrig).

Kann mir jemand beibringen, wie man ein solches Shell-Skript schreibt?


Das Shell-Skript wurde folgendermaßen aktualisiert:

#!/bin/bash
file="$1"
flac -cd "$file" | lame --preset fast extreme - "${file%.flac}.mp3"
id3cp "$file" "${file%.flac}.mp3"

Wenn Sie find . -name '*.flac' -exec ~/bin/flac2mp3 '{}' \;in ~ / Desktop / stack arbeiten, wird die folgende Ausgabe ausgegeben:

01 - Amon Tobin - Chomp Samba.flac: done         
LAME 3.98.4 64bits (http://www.mp3dev.org/)
Using polyphase lowpass filter, transition band: 19383 Hz - 19916 Hz
Encoding <stdin> to ./01 - Amon Tobin - Chomp Samba.mp3
Encoding as 44.1 kHz j-stereo MPEG-1 Layer III VBR(q=0)
Parsing ./01 - Amon Tobin - Chomp Samba.flac: done.  Copying to ./01 - Amon Tobin - Chomp Samba.mp3: done

id3info für die ursprüngliche .flac und die resultierende .mp3 ergibt jeweils:

*** Tag information for 01 - Amon Tobin - Chomp Samba.flac

(dh nichts);

*** Tag information for 01 - Amon Tobin - Chomp Samba.mp3
*** mp3 info
MPEG1/layer III
Bitrate: 128KBps
Frequency: 44KHz

Die .flac hat definitiv Tag-Informationen. Ich kann dies überprüfen, indem ich EasyTAG öffne. EasyTAG bezeichnet dies als "FLAC Vorbis Tag", aber als "ID3 Tag" für die MP3-Datei. Ist das das Problem?

boehj
quelle
Haben Sie versucht, zu verwenden ffmpeg?
Hallo71
Nein, habe ich nicht. Um ehrlich zu sein, habe ich es noch nie zuvor in der CLI verwendet. Jemand hat mir von diesem Perl-Skript erzählt . Ich werde das morgen versuchen und mich melden, da es jetzt spät ist.
Boehj

Antworten:

7
#!/bin/sh

file="$1"
outfile=${file%.flac}.mp3

eval $(metaflac --export-tags-to - "$file" | sed "s/=\(.*\)/='\1'/")

flac -cd "$file" | lame --preset fast extreme \
        --add-id3v2 --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" \
        --ty "$DATE" --tn "$TRACKNUMBER" --tg "$GENRE" \
        - "$outfile"
Kambus
quelle
Danke Kambus! Das macht so ziemlich den Trick. Die meisten Tags, die ich möchte, sind jetzt dort, Post-Transcode: Titel, Album, Künstler, Jahr, Titelnummer. Das CD-Feld (1/1, 1/2 usw.) hat es nicht geschafft, und das Feld für die 'Track Number Of ' hat es auch nicht geschafft . Aber das stört mich nicht wirklich. Interessanterweise habe ich dieses Skript in einem Verzeichnis mit 'Trip Hop'-Musik ausprobiert. Die Tags wurden beibehalten, aber das Skript änderte das Genre von "Trip Hop" in "Trip-Hop". Ich denke, es basiert auf einer Datenbank bekannter Genres. Nochmals vielen Dank für Ihre Eingabe!
Boehj
@pedrogent: Ich bin froh, dass ich helfen konnte! Sie können die anderen Tags mit "metaflac --export-tags-to - file" manuell überprüfen und auf die gleiche Weise wie $ TITLE und die anderen verwenden. Das Problem ist jedoch, dass in id3 AFAIK keine entsprechenden Felder für sie vorhanden sind. Vielleicht kannst du sie in das Kommentar-Tag einfügen. Ja, es gibt eine vordefinierte Liste von Genres: Link
Kambus
Hallo Kambus. Ja, ich denke, ein Teil des Problems besteht darin, dass es keinen klaren Standard für ID3-Tag-Daten gibt. Das Kommentar-Tag wird von Spieler zu Spieler sehr unterschiedlich interpretiert (oder überhaupt nicht). Dein Skript ist großartig. Danke noch einmal.
Boehj
1

Wie man mp3fs benutzt, um flac in mp3 zu massenkodieren

Anstatt ein Programm zum Konvertieren von flac-Dateien in MP3 zu verwenden, können Sie mp3fs verwenden, um sie als virtuelle MP3s darzustellen, und ein Programm, das Kopieraufträge in die Warteschlange stellen kann. Es funktioniert wunderbar gut für mich.

MP3fs und Ultracopier herunterladen und installieren:

sudo apt-get install mp3fs ultracopier

Erstellen Sie ein Paar flac- und mp3-Verzeichnisse für jedes mp3fs, das Sie ausführen möchten. Ich habe eine Dual-Core-CPU, also laufe ich zwei. Wenn Sie die flac-Verzeichnisse auf der Partition behalten, auf der sich Ihre flac-Dateien befinden, können Sie diese schnell verschieben. Diese Partition heißt auf meinem System "Speicher".

cd /media/Storage
mkdir mp3fs mp3fs/flac_1 mp3fs/mp3_1 mp3fs/flac_2 mp3fs/mp3_2

Sie können die Verzeichnisse über die Befehlszeile oder durch Hinzufügen zu einfügen /etc/fstab. Sie können auch die Bitrate und den Codierungsalgorithmus der virtuellen MP3s beim Mounten konfigurieren. Ich möchte MP3s mit einer konstanten Bitrate von 320 kbps, und Lame braucht möglicherweise die ganze Zeit, um die bestmöglichen MP3s zu produzieren.

Auf der Kommandozeile:

mp3fs -b 320 -oquality=0 /media/Storage/mp3fs/flac_1 /media/Storage/mp3fs/mp3_1 -o allow_other,ro
mp3fs -b 320 -oquality=0 /media/Storage/mp3fs/flac_2 /media/Storage/mp3fs/mp3_2 -o allow_other,ro

Wenn sich die Sicherung beschwert, wie

fusermount: /etc/fuse.conf konnte nicht geöffnet werden: Berechtigung verweigert
fusermount: Option allow_other nur zulässig, wenn in etc / fuse.conf 'user_allow_other' festgelegt ist

Kommentieren Sie dann die user_allow_otherOption aus /etc/fuse.confund / oder machen Sie sie mit lesbar

sudo chmod 644 /etc/fuse.conf

Oder von /etc/fstab:

mp3fs#/media/Storage/mp3fs/flac_1 /media/Storage/mp3fs/mp3_1 fuse user,ro,allow_other,bitrate=320,quality=0 0 0
mp3fs#/media/Storage/mp3fs/flac_2 /media/Storage/mp3fs/mp3_2 fuse user,ro,allow_other,bitrate=320,quality=0 0 0

Nachdem Sie die Verzeichnisse hinzugefügt haben /etc/fstab, können Sie sie mithilfe von bereitstellen

sudo mount -a

Getan! Starten Sie den Ultracopier. Es wird ein Indikatorsymbol in Ihrem Gnome-Panel oder was auch immer Sie verwenden, platzieren. Klicken Sie darauf und wählen Sie Kopie hinzufügen. Ich habe das zweimal gemacht, um zwei Kerne zu verwenden. Verwenden Sie Ihren Dateibrowser, um einige Flacs in flac_1 zu verschieben. Navigieren Sie zum Verzeichnis mp3_1 und ziehen Sie Ihre MP3s in eines der Ultracopier-Fenster, um eine Kopierwarteschlange zu starten. Ultracopier fragt nach dem Ziel der Dateien. Sie haben jetzt einen Kern damit beschäftigt, eine Reihe von Flacs in MP3 zu codieren.

Um den anderen Kern zu verwenden, verschieben Sie flac-Dateien nach flac_2 und ziehen Sie die MP3s von mp3_2 in das zweite Ultracopier-Fenster.

Update: Anstelle von Ultracopier verwende ich jetzt MiniCopier, es ist etwas einfacher zu bedienen. Siehe Kommentare unten.

Arjan Drieman
quelle
Es scheint einen Fehler in der Verzeichnisliste mit den neuesten Versionen von mp3fs und fuse zu geben: sourceforge.net/tracker/…
Ophidian
@Ophidian: Interessant. Ich habe einige Tests auf einigen Computern mit unterschiedlichen Distributionen durchgeführt. Ich ließ sie innerhalb einer Minute ohne Fehler laufen. Die mp3fs-Version, die ich verwendet habe, ist dieselbe, 0.30. Ich habe Kernel 2.3.38, 2.3.39 und 3.0.0, libfuse-Versionen 2.8.4 und 2.8.6 verwendet. Die in den Fehlerberichten erwähnte Libfuse ist 2.8.5. Das reicht bei weitem nicht aus, um zu dem Schluss zu kommen, dass die Sicherung der Schuldige ist. Es kann sich jedoch lohnen, eine andere Version auszuprobieren, wenn Sie bei der Verwendung von 2.8.5 auf Probleme stoßen. Hast du vielleicht mp3fs ausprobiert? Auf welchem ​​Kernel und mit welcher libfuse? Haben Sie Probleme gehabt?
Arjan Drieman
Anstelle von Ultracopier verwende ich jetzt MiniCopier , es ist etwas einfacher zu bedienen. Es ist eine Java-App, es erfordert keine Installation, aber eine JRE. Es hat ein Korbsymbol und ein Boxsymbol. Sie können eine oder mehrere Quellen aus einem Dateimanager auf das Warenkorbsymbol und ein Zielverzeichnis auf das Boxsymbol ziehen. Dies ist alles, was Sie tun müssen, um der Warteschlange einen Kopierauftrag hinzuzufügen. MiniCopier verfügt über eine separate Registerkarte für fehlerhafte Elemente. MiniCopier verwendet weniger CPU-Zyklen als Ultracopier, 1% gegenüber 3% auf meinem System. Das könnte nur 12 Minuten in einer 10-Stunden-Warteschlange sparen
;-)
Wenn Sie eine Shell-basierte Kopierwarteschlange möchten, habe ich bei Superuser eine Lösung gefunden . Ohne Anpassungen können Sie nicht zwei Warteschlangen damit ausführen, und ich bin nicht sicher, was es mit Fehlern tun wird.
Arjan Drieman
0

id3cpkann nicht funktionieren, da FLAC ID3 nicht verwendet; Stattdessen werden Vorbis-Tags verwendet.

avconvhat die Option, Tags durch Konvertierung zu pflegen. Es ist etwas launisch, sein Wert hängt von der Kombination der Codecs ab , aber in Ihrem Fall funktioniert es so (Version 9.16-6):

avconv -i in.flac -map_metadata 0:g:0 out.mp3

Das Anwenden aller FLAC-Dateien in einem Ordner (rekursiv) ist so einfach: (using bash)

for f in */**/*.flac; do
  avconv -i "${f}" -map_metadata 0:g:0 "`echo "${f}" | sed -e s/flac$/mp3/`";
done

Beachten Sie, dass avconvlame automatisch verwendet wird. Es gibt weitere Optionen zur Qualitätskontrolle und so weiter. Überprüfen Sie man avconvauf Details.

Raphael
quelle