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 {}'
Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}
Lame
est l'un des meilleurs que vous puissiez trouver pour effectuer cette tâcheVous pouvez utiliser la commande
lame -b 192 input.mp3 output.mp3
Im pas bon avec les commandes de tuyauterie mais vous pouvez utiliser
exiftool
pour obtenir le débit binaire du fichier mp3mais 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 ...
la source