Lame: cómo volver a codificar todos los mp3 de 320 kbps a 192 kbps

9

Según el título Tengo muchos MP3 en formato de 320 kbps que necesito convertir a 192 kbps. Actualmente estoy usando lame --mp3input -b 192que crea un archivo con el mismo nombre pero con una extensión .mp3 adicional. Así que termino con foo.mp3.mp3.

Necesito poder ingresar a un directorio, escanear los subdirectorios en busca de 320 kbps y convertirlos a 192 kbps y sobrescribir si se encuentran. ¿Es Lame incluso la mejor herramienta para esto?

Gracias

Moif Murphy
fuente

Respuestas:

12

lamese adapta perfectamente a esta tarea, pero voy a usar ffmpegy ffprobepara 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 mvcomando no se ejecutará a menos ffmpegsalidas 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_streamsle dice ffprobeque muestre información sobre transmisiones individuales; -select_streamsdice que el que cuáles seleccionar, y a:0la 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 ffprobey la alimenta grep. grepsolo 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 forbucle y el findcomando. 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 globstaropció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 {}' 
maldad
fuente
Espectacular respuesta. He improvisado algo juntos usando cojo, pero daré esto hace tiempo. Informaré de nuevo.
Moif Murphy
Recibo este error: Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
Moif Murphy
con avconv, reemplácelo por:avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}
lepe
2

Lame es uno de los mejores que puedes encontrar para hacer esta tarea

Puedes usar el comando lame -b 192 input.mp3 output.mp3

No soy bueno con los comandos de tuberías, pero puede usar exiftoolpara obtener la velocidad de bits del archivo mp3

exiftool -AudioBitrate File.mp3 

pero aún necesita una forma de canalizar los comandos para encontrar archivos mp3, verificar la tasa de bits y convertir ...

AdigaJo
fuente
editado dos veces, arreglando el comando y agregando bitrate
AdigaJo