Hace
unos días necesitaba bajar la calidad de audio de algunos archivos
mp3 a 128kb/s, por lo que recordé la herramienta avconv
que pertenece al proyecto Libav
y que
es la
que sustituye a ffmpeg en la actualidad. Sabia que avconv
era capaz de hacer este trabajo, pero lo que no sabia es que
solamente podía hacerlo uno por uno y esto resultaba muy engorroso
para mi, pues tenia cerca de unos 100 archivos, debido a esto decidí
buscar una pequeña solución vía la madre de todas las sabidurías
google.com.
Primero
pensé que avconv
tendría alguna forma de especificar un directorio de salida para los
archivos convertidos (algo así como un -o <directorio>), pero
aparentemente esto no es así, y la solución que encontré en
unix.stackexchange
fue crear un pequeño script bash para eso.
Para realizar la prueba se necesita tener instalado libav-tools, mediante el siguiente comando en la terminal:
sudo apt-get install libav-tools
Originalmente
el script bash que probé
fue:
guarde el archivo en formato .sh (shell script) y procedí a realizar una prueba.#!/bin/bash for i in *.mp3 ; do avconv -i "$i" -ab 128k "./mp3/$i".mp3 done
Lo primero que se debe hacer para poder ejecutar el script es darle permisos de ejecución con el comando chmod:
sudo chmod +x mp3_test.sh
Mi carpeta de prueba contiene
tres archivos mp3 y el script bash. Para ejecutar un script bash se
utiliza ./<nombre de script>. Ejecute el script bash y……
ERROR! Entonces me di cuenta que el script recorría todos los
archivos pero para cada archivo dio el error:
./mp3/Gorillaz-stylo.mp3.mp3: No such file or directory
Esto era debido a que la carpeta
mp3 no estaba creada, esto se resolvía creando una carpeta
manualmente, pero mi intensión era que el script fuera un poco mas
“inteligente” para facilitar el trabajo. Ademas estaba agregando
.mp3 al final de cada nombre de cada archivo, por lo que procedí a modificar el script
quedando de la siguiente forma:
#!/bin/bash if [ ! -d "mp3" ]; then mkdir "mp3" fi for i in *.mp3 ; do avconv -i "$i" -ab 128k "./mp3/$i" done
Básicamente lo que agregue fue
una validación que verifica si la carpeta mp3 no esta creada, se
creara automáticamente, luego de esto ejecute el script nuevamente y
la carpeta ahora es creada automáticamente por el script y los mp3 tendran un
bitrate de 128kb/s que fue lo especificando en el script.
El objetivo hasta aquí ya se
había logrado pero pensé: ¿Que tal si desea otra carpeta de salida
o definir otro bitrate para los mp3? Por lo que procedí a modificar
un poco el script:
#!/bin/bash # Mostramos un mensaje en la terminal solicitando la carpeta de salida # y almacenamos el nombre en una variable outputFolder con un read echo 'Output folder (create folder first):' read outputFolder # Mostramos un mensaje en la terminal solicitando el bitrate del mp3 # y almacenamos el numero en una variable bitrate con un read echo 'Bitrate (Eg. 96, 128, 320):' read bitrate # Se valida si el usuario no ingreso un nombre se establece por defecto mp3 if [ -z "$outputFolder" ] then outputFolder=mp3 fi # Se valida si el usuario no ingreso un bitrate se establece por defecto 128 if [ -z "$bitrate" ] then bitrate=128 fi # Se valida si no existe el folder, lo crea automaticamente if [ ! -d "$outputFolder" ]; then mkdir $outputFolder fi # Recorre cada mp3 de la carpeta y procede a convertirlo for i in *.mp3 ; do avconv -i "$i" -ab "$bitrate"k "$outputFolder/$i" done
Nota: El script es bien básico y
no acepta nombre de carpetas con espacios por lo que dará un error.
Si se desea profundizar acerca de el funcionamiento de un script bash
se puede leer algunos recursos que me han servido a mi:
Ojala les sea de utilidad, les dejo el link de descarga del script comentado junto con los links que me fueron utiles para realizarlo: Descargar script bash.