web-dev-qa-db-fra.com

Lame - Comment ré-encoder tous les mp3 320kbps en 192kbps mp3

Selon le titre. J'ai beaucoup de MP3 au format 320kbps que j'ai besoin de convertir en 192kbps. J'utilise actuellement lame --mp3input -b 192 qui crée un fichier du même nom mais avec une extension .mp3 supplémentaire. Je me retrouve donc avec foo.mp3.mp3.

Je dois pouvoir entrer dans un répertoire, analyser les sous-répertoires à la recherche de 320 kbps, les convertir en 192 kbps et les écraser, le cas échéant. Lame est-elle même le meilleur outil pour cela?

Merci

6
Moif Murphy

lame convient parfaitement à cette tâche, mais je vais utiliser ffmpeg et ffprobe pour cette réponse, car je les connais comme le dos de ma main et parce qu'ils peuvent être généralisés. à plus que des MP3. Tout d'abord:

Sudo apt-get install ffmpeg

À ma connaissance, aucun outil ne peut lire les fichiers multimédias, puis écraser immédiatement l’entrée: vous devez utiliser un fichier intermédiaire. Pour un seul fichier, vous pouvez faire:

ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3
mv temp.mp3 file.mp3

Vous pouvez les combiner en une seule ligne:

ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3

le && signifie que la commande mv ne sera exécutée que si ffmpeg se ferme avec un statut égal à 0 (ce qui signifie succès).

Pour vérifier le débit binaire d’un fichier, vous pouvez utiliser ffprobe:

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000'

-show_streams dit à ffprobe d'afficher des informations sur les flux individuels; -select_streams lui dit lequel à sélectionner, et a:0 signifie 'le premier flux audio (important pour les fichiers MP3 dans le cas de la pochette, qui est stockée sous forme de flux vidéo). Le tuyau (|) prend la sortie standard de ffprobe et l'alimente vers grep. grep n'imprimera que les lignes correspondant à un motif donné - dans ce cas, les lignes contenant la chaîne bit_rate=320000. Si vous utilisez ceci sur un MP3 de 320 kbps, vous obtiendrez une ligne comme celle-ci:

bit_rate=32000

Si vous l'exécutez avec un débit binaire différent, vous n'obtiendrez aucune sortie. grep ne trouvera pas de correspondance et quittera avec le statut 1. Cela signifie que vous pouvez chaîner cette commande avec la commande ffmpeg:

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000' && ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3

Ou, un peu plus lisiblement:

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000' &&
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 &&
mv temp.mp3 file.mp3

Cela n'agira que sur les MP3 à 320 kbps. Essayez-le avec quelques fichiers de test.

La prochaine étape consiste à faire fonctionner ce fichier avec plusieurs fichiers. Il existe deux méthodes standard: une boucle for et la commande find. Ce qui suit agira sur tous les MP3 d'un répertoire:

for f in *.mp3; do 
ffprobe -show_streams -select_streams a:0 "$f" | grep -F 'bit_rate=320000' &&
ffmpeg -y -i "$f" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$f"
done

Cela n'ira pas dans les sous-répertoires; pour ce faire, vous devez définir l'option globstar Shell:

shopt -s globstar
for f in **/*.mp3; do
ffprobe -show_streams -select_streams a:0 "$f" | grep -F 'bit_rate=320000' &&
ffmpeg -y -i "$f" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$f"
done

Avec find:

find . -name '*.mp3' -exec sh -c 'ffprobe -show_streams -select_streams a:0 "$0" | grep -F "bit_rate=320000" &&
ffmpeg -y -i "$0" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$0"' '{}' \;

Tous ces programmes seront exécutés de manière strictement séquentielle - ils ne convertiront qu'un fichier à la fois. Votre processeur est presque certainement capable de plus que cela, cependant; pour accélérer les choses, vous pouvez utiliser GNU parallel:

Sudo apt-get install parallel
shopt -s globstar
parallel 'ffprobe -show_streams -select_streams a:0 {} | grep -F "bit_rate=320000" &&
ffmpeg -y -i {} -c:a libmp3lame -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}' ::: **/*.mp3

Ou:

find . -name '*.mp3' | parallel 'ffprobe -show_streams -select_streams a:0 {} | grep -F "bit_rate=320000" &&
ffmpeg -y -i {} -c:a libmp3lame -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}' 
9
evilsoup

Lame est l'un des meilleurs que vous puissiez trouver pour effectuer cette tâche.

Vous pouvez utiliser la commande lame -b 192 input.mp3 output.mp3

je ne suis pas bon avec les commandes de piping mais vous pouvez utiliser exiftool pour obtenir le débit du fichier mp3

exiftool -AudioBitrate File.mp3 

mais vous avez toujours besoin d'un moyen de diriger les commandes de recherche de fichier mp3, de vérification du débit et de la conversion ...

2
AdigaJo