Transcodage de masse .flac -> .mp3: comment écrire un script shell qui préserve les informations de balise ID3?

9

Ces dernières semaines, je suis passé d'une approche assez «pratique» au transcodage .flac -> .mp3 à une approche beaucoup plus «définie et oubliée».

La première étape a consisté à cesser d'utiliser une interface graphique (Audacity avec un plug-in LAME) et à la place utiliser la méthode que j'ai décrite ici .

La deuxième étape consistait à trouver un script shell bash qui indiquerait à cette boucle de commande de fonctionner récursivement, permettant aux répertoires contenant de nombreux sous-répertoires contenant des fichiers .flac d'être transcodés en une seule étape simple. Cette réponse a été fournie par un utilisateur de askubuntu.com.

Maintenant, je souhaite apprendre à affiner davantage les choses afin que les informations de balise ID3 soient préservées. Les méthodes liées aux données de balise ID3 ci-dessus, laissant le strict minimum (c'est-à-dire qu'il ne reste que le champ de titre).

Quelqu'un peut-il m'apprendre à écrire un tel script shell?


Le script shell a été mis à jour ainsi:

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

Faire find . -name '*.flac' -exec ~/bin/flac2mp3 '{}' \;dans ~ / Desktop / stack donne la sortie suivante:

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 pour le .flac original et le .mp3 résultant donne respectivement:

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

(c'est-à-dire rien);

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

Le .flac a définitivement des informations sur les balises. Je peux le vérifier en ouvrant EasyTAG. EasyTAG se réfère à cela comme «FLAC Vorbis Tag» mais «ID3 Tag» pour le .mp3. Est-ce le problème?

boehj
la source
Avez-vous essayé d'utiliser ffmpeg?
Hello71
Non, je ne l'ai pas fait. Pour être honnête, je ne l'ai jamais vraiment utilisé auparavant sur la CLI. Quelqu'un m'a parlé de ce script Perl. J'essaierai cela demain et je ferai rapport car il est tard maintenant.
boehj

Réponses:

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
la source
Merci Kambus! Cela fait à peu près l'affaire. La majorité des balises que je veux sont maintenant là, post-transcodées: titre, album, artiste, année, numéro de piste. Le champ CD (1/1, 1/2, etc.) n'a pas traversé, ni le champ pour le «numéro de piste de ». Mais cela ne me dérange pas vraiment. Fait intéressant, j'ai essayé ce script sur un répertoire contenant de la musique «Trip Hop». Les balises sont restées intactes, mais le script a changé le genre de «Trip Hop» en «Trip-Hop». Je suppose donc que cela repose sur une base de données de genres connus. Merci encore une fois pour votre contribution!
boehj
@pedrogent: Je suis content d'avoir pu aider! Vous pouvez vérifier manuellement quelles sont les autres balises avec "metaflac --export-tags-to - file" et les utiliser de la même manière que $ TITLE et les autres, mais le problème est qu'il n'y a pas de champs équivalents pour elles dans id3 AFAIK. Vous pouvez peut-être les mettre dans la balise de commentaire. Oui, il existe une liste prédéfinie de genres: lien
Kambus
Salut Kambus. Oui, je pense qu'une partie du problème ici est qu'il n'y a pas de «standard» clair pour les données de balises ID3. La balise Commentaire est interprétée très différemment d'un joueur à l'autre (ou pas du tout). Votre script est génial. Merci encore.
boehj
1

Comment utiliser mp3fs pour coder en masse flac en mp3

Au lieu d'utiliser un programme pour convertir des fichiers flac en mp3, vous pouvez utiliser mp3fs pour les présenter comme des mp3 virtuels, et un programme qui peut mettre en file d'attente les travaux de copie. Cela fonctionne à merveille pour moi.

Téléchargez et installez mp3fs et ultracopier:

sudo apt-get install mp3fs ultracopier

Créez une paire de répertoires flac et mp3 pour chaque mp3fs que vous souhaitez exécuter. J'ai un processeur dual core donc j'en lance deux. Si vous conservez les répertoires flac sur la partition où se trouvent vos fichiers flac, vous pouvez les déplacer rapidement. Cette partition est appelée "Stockage" sur mon système.

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

Vous pouvez monter les répertoires à partir de la ligne de commande ou en les ajoutant à /etc/fstab. Vous pouvez également configurer le bitrate et l'algorithme de codage des mp3 virtuels au moment du montage. Je veux des mp3 avec un débit constant de 320 kbps, et boiteux peut prendre tout le temps nécessaire pour produire le meilleur mp3 possible.

Sur la ligne de commande:

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

Si le fusible se plaint, comme

fusermount: impossible d'ouvrir /etc/fuse.conf: autorisation refusée
fusermount: option allow_other uniquement autorisée si 'user_allow_other' est défini dans etc / fuse.conf

puis décommentez l' user_allow_otheroption dans /etc/fuse.confet / ou rendez-la lisible avec

sudo chmod 644 /etc/fuse.conf

Ou de /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

Après avoir ajouté les répertoires à /etc/fstab, vous pouvez les monter en utilisant

sudo mount -a

Terminé! Démarrez ultracopier. Il placera une icône d'indicateur dans votre panneau de gnome ou quoi que ce soit que vous utilisez. Cliquez dessus, sélectionnez ajouter une copie. Je l'ai fait deux fois pour utiliser deux cœurs. Utilisez votre navigateur de fichiers pour déplacer des flacs dans flac_1. Accédez au répertoire mp3_1 et faites glisser vos mp3 vers l'une des fenêtres ultracopier pour démarrer une file d'attente de copie. Ultracopier demandera la destination des fichiers. Vous avez maintenant un cœur occupé à encoder un lot de flacs en mp3.

Pour utiliser l'autre noyau, déplacez les fichiers flac vers flac_2 et faites glisser les mp3 de mp3_2 vers la deuxième fenêtre ultracopier.

Mise à jour: Au lieu d'ultracopier, j'utilise maintenant MiniCopier, c'est un peu plus facile à utiliser. Voir les commentaires ci-dessous.

Arjan Drieman
la source
Il semble y avoir un bug avec la liste des répertoires avec les versions récentes de mp3fs et de fusible: sourceforge.net/tracker/…
Ophidian
@Ophidian: Intéressant. J'ai effectué des tests sur certaines machines utilisant différentes distributions. Je les ai fait courir, en moins d'une minute chacun, sans aucune erreur. La version mp3fs que j'utilise est la même, 0,30. J'ai utilisé les noyaux 2.3.38, 2.3.39 et 3.0.0, les versions libfuse 2.8.4 et 2.8.6. Libfuse mentionné dans les rapports de bogues est 2.8.5. Ce n'est pas suffisant pour conclure que le fusible est le coupable, cependant, il pourrait être utile d'essayer une version différente si vous rencontrez des problèmes lors de l'utilisation de la 2.8.5. Avez-vous peut-être essayé des mp3fs? Sur quel noyau et avec quel libfuse? Avez-vous rencontré des problèmes?
Arjan Drieman
Au lieu d'ultracopier, j'utilise maintenant MiniCopier , c'est un peu plus facile à utiliser. C'est une application java, elle ne nécessite aucune installation mais nécessite un JRE. Il a une icône de panier et une icône de boîte. Vous pouvez faire glisser une ou plusieurs sources d'un gestionnaire de fichiers sur l'icône de panier, un répertoire de destination sur l'icône de boîte, et c'est tout ce que vous devez faire pour ajouter un travail de copie à la file d'attente. MiniCopier a un onglet séparé pour les éléments ayant échoué. MiniCopier utilise moins de cycles cpu que ultracopier, 1% vs 3% sur mon système. Cela pourrait peut-être économiser 12 minutes sur une file d'attente de 10 heures ;-)
Arjan Drieman
Si vous voulez une file d'attente de copie basée sur le shell, j'ai trouvé une solution au superutilisateur . Sans ajustements, vous ne pourrez pas exécuter 2 files d'attente avec, et je ne suis pas sûr de ce qu'il fera avec les erreurs.
Arjan Drieman
0

id3cpne peut pas fonctionner car FLAC n'utilise pas ID3; il utilise des balises Vorbis à la place.

avconva une option pour conserver les balises lors de la conversion. C'est un peu capricieux, sa valeur dépend de la combinaison de codecs , mais cela fonctionne comme ça dans votre cas (version 9.16-6):

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

L'application de tous les fichiers FLAC dans un dossier (récursivement) est aussi simple que cela: (utilisation bash)

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

Notez que avconvutilise lame automatiquement; d'autres options existent pour contrôler la qualité et ainsi de suite. Vérifiez les man avconvdétails.

Raphael
la source