lame
se adapta perfectamente a esta tarea, pero voy a usar ffmpeg
y ffprobe
para esta respuesta, porque los conozco como el dorso de mi mano y porque pueden generalizarse a más que solo MP3. Ante todo:
sudo apt-get install ffmpeg
No conozco ninguna herramienta que pueda leer archivos multimedia y luego sobrescribir la entrada de inmediato: debe usar un archivo intermedio. Para un solo archivo, podría hacer:
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3
mv temp.mp3 file.mp3
Puede combinarlos en una sola línea:
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3
el &&
no significa que el mv
comando no se ejecutará a menos ffmpeg
salidas con un estado de 0 (que significa el éxito).
Para verificar qué velocidad de bits tiene un archivo, puede usar ffprobe
:
ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000'
-show_streams
le dice ffprobe
que muestre información sobre transmisiones individuales; -select_streams
dice que el que cuáles seleccionar, y a:0
la primera corriente de audio significa'(esto es importante para los archivos MP3 en el caso del arte de la cubierta, que se almacena como una secuencia de vídeo). El pipe ( |
) toma la salida estándar de ffprobe
y la alimenta grep
. grep
solo imprimirá aquellas líneas que coincidan con un patrón dado; en este caso, las líneas que contienen la cadena bit_rate=320000
. Si ejecuta esto en un MP3 de 320k kbps, obtendrá una línea como esta:
bit_rate=32000
Si lo ejecuta en cualquier cosa con una velocidad de bits diferente, no obtendrá ningún resultado en absoluto; grep no podrá hacer una coincidencia y saldrá con un estado de 1. Esto significa que puede encadenar ese comando con el comando 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
O, un poco más legible:
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
Eso solo actuará en MP3 de 320 kbps. Pruébelo con un par de archivos de prueba.
El siguiente paso es hacer que esto funcione con múltiples archivos. Hay dos formas estándar de hacerlo: un for
bucle y el find
comando. Lo siguiente actuará en cada MP3 en un directorio:
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
Esto no entrará en subdirectorios; Para hacerlo, debe configurar la globstar
opción de 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
Con 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"' '{}' \;
Todos estos se ejecutarán estrictamente secuencialmente: solo convertirán un archivo a la vez. Sin embargo, su procesador es casi seguro capaz de más que eso; para acelerar las cosas, podrías usar 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
O:
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
es uno de los mejores que puedes encontrar para hacer esta tareaPuedes usar el comando
lame -b 192 input.mp3 output.mp3
No soy bueno con los comandos de tuberías, pero puede usar
exiftool
para obtener la velocidad de bits del archivo mp3pero aún necesita una forma de canalizar los comandos para encontrar archivos mp3, verificar la tasa de bits y convertir ...
fuente