lame
est parfaitement adapté à cette tâche, mais je vais utiliser ffmpeg
et ffprobe
pour 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 mv
commande ne sera exécutée que si elle se ffmpeg
termine 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_streams
indique ffprobe
d'afficher des informations sur les flux individuels; -select_streams
lui indique lesquels sélectionner, et a:0
signifie `` 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 ffprobe
et l'alimente grep
. grep
affichera 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 for
boucle et la find
commande. 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' globstar
option 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 {}'