Comprimiendo MP3 con la Raspberry

Hace algún tiempo monté una radio casera emitiendo 24x7 desde una Raspberry, básicamente es un contenedor de Docker con un simple servidor Icecast2 contra el que se envía el flujo de sonido en directo, y me preguntaba si la compresión que realiza del MP3 (al vuelo) podría ir más rápido que con el típico compresor LAME, ya que son máquinas pequeñas con recursos limitados. En compresión de vídeo el procesador de la Raspberry soporta diversos codificadores de forma nativa, en cambio para audio no hay mucha información, por suerte buscando encontré una librería que solía usarse con máquinas de arquitectura ARM y que mejora el rendimiento de la codificación en archivos de sonido MP3.

Shine es un compresor minimalista de MP3 mucho más eficiente que LAME con procesadores de arquitectura ARM, pero que resta un poco de calidad al resultado, con una pérdida casi imperceptible solamente soporta el formato de compresión MP3 CBR o lo que es lo mismo bitrate constante. Otra limitación es que nada más convierte desde formato WAV a MP3 no pudiendo usarse con otros formatos de origen.

Para instalarlo desde los repositorios de Debian GNU/Linux ejecutamos el comando:

# apt install shineenc

Una vez instalado ya podríamos comprimir archivos de sonido:

$ shineenc  
Usage: shineenc [options] <infile> <outfile>

Options:
-h            this help message
-b <bitrate>  set the bitrate [8-320], default 128kbit
-m            force encoder to operate in mono
-c            set copyright flag, default off
-j            encode in joint stereo (stereo data only)
-d            encode in dual-channel (stereo data only)
-q            quiet mode
-v            verbose mode

Otra forma es hacer la conversión con el programa ffmpeg y su implementación de libshine, y así transmitir el sonido directamente al servidor Icecast2 con el comando:

$ ffmpeg -i input.wav -ice_name "Nombre del Stream" -ice_genre "Género" -ice_description "Descripción" -ice_url "http://url.mp3" -ice_public 1 -vn -ac 2 -ar 44100 -c:a libshine -b:a 128k -map_metadata 0 icecast://source:xxx@ip:port/endpoint.mp3

Esto nos da libertad a la hora de convertir otros formatos que no sean WAV a MP3. Tendremos las mismas limitaciones que con el comando original, como son el bitrate constante no pudiendo seleccionarse el bitrate variable VBR.

Por lo demás es un compresor bastante eficiente y consume muchos menos recursos que LAME, en sistemas limitados lo recomiendo.

Nos leemos en la próxima entrada 🔖