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
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 {}'
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 ...