domingo, 23 de agosto de 2015

Bajar la calidad de varios mp3 en una carpeta usando avconv y un script bash nivel noob en ubuntu




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:

#!/bin/bash
for i in *.mp3 ; do 
    avconv -i "$i" -ab 128k "./mp3/$i".mp3
done
guarde el archivo en formato .sh (shell script) y procedí a realizar una prueba.



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
de ahora en adelante el script mostrara dos mensajes:




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.