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

9

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

J'ai besoin de pouvoir entrer dans un répertoire, scanner les sous-répertoires pour tout 320kbps et convertir en 192kbps et écraser s'il y en a. Lame est-il même le meilleur outil pour cela?

Merci

Moif Murphy
la source

Réponses:

12

lameest parfaitement adapté à cette tâche, mais je vais utiliser ffmpeget ffprobepour cette réponse, parce que je les connais comme le fond 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 et é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 &&il signifie que la mvcommande ne sera exécutée que si elle se ffmpegtermine avec un état de 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_streamsindique ffprobed'afficher des informations sur les flux individuels; -select_streamslui indique lesquels sélectionner, et a:0signifie `` le premier flux audio (cela est important pour les fichiers MP3 dans le cas des jaquettes, qui sont stockées sous forme de flux vidéo). Le tube ( |) prend la sortie standard de ffprobeet l'alimente grep. grepaffichera uniquement les lignes qui correspondent à un modèle donné - dans ce cas, les lignes qui contiennent la chaîne bit_rate=320000. Si vous exécutez cela sur un MP3 à 320 kbps, vous obtiendrez une ligne comme celle-ci:

bit_rate=32000

Si vous l'exécutez sur quelque chose avec un débit binaire différent, vous n'obtiendrez aucune sortie du tout; grep ne parviendra pas à faire une correspondance et se terminera avec un état de 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 lisible:

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.

L'étape suivante consiste à faire fonctionner cela avec plusieurs fichiers. Il existe deux manières standard de procéder: une forboucle et la findcommande. Les éléments suivants agissent sur chaque 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'entrera pas dans les sous-répertoires; pour ce faire, vous devez définir l' globstaroption 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 éléments s'exécuteront 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 {}' 
evilsoup
la source
Réponse spectaculaire. J'ai bricolé quelque chose ensemble en utilisant des boiteux mais je donnerai ça il y a. Je ferai rapport.
Moif Murphy
Je reçois cette erreur: Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
Moif Murphy
avec avconv, remplacez-le par:avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}
lepe
2

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

Im pas bon avec les commandes de tuyauterie mais vous pouvez utiliser exiftoolpour obtenir le débit binaire 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 binaire et de conversion ...

AdigaJo
la source
édité deux fois, fixant la commande et ajoutant le bitrate
AdigaJo