Hoy Fer nos cuenta cómo grabar programas de radio en mp3 con linux, una genial idea para grabar esos programas que no siempre podemos escuchar en directo (concretamente Arus en la 100 que empieza a las 6:00 de la mañana).
Hablando con fer hemos comentado la posibilidad de mejorar ligeramente el script, un pequeño problema que tiene es que hay que grabar primero el asf, luego convertir a wav (que ocupa horrores!!!!) y finalmente convertirlo a mp3. Otro pequeño inconveniente es que realmente si el mplayer es capaz de reproducir el stream de audio, ¿No podrÃa bastar para hacerlo todo?. Finalmente la respuesta es casi-sÃ, con el MPlayer y Lame (que suele ser una dependencia de mencoder) podemos:
¡¡¡ Grabar en MP3 al vuelo directamente del MPlayer !!!
después de darle unas cuantas vueltas el script resultante queda asÃ.
update: el script lo puedes bajar de aquÃ
#!/bin/bash
# Script para la grabacion de un programa de radio por internet.
# Idea original de fer (www.tabernadelturco.com)
#
# Pplux (www.pplux.com)
#emisora
emisora=mms://live.c100.edgestreams.net/reflector:34743
#numero de minutos
minutos=1
#Nombre del programa
programa=arus
#Directorio donde grabarlo ('.' = actual)
dir=.
# Nombre del fichero
nombre=${dir}/${programa}_`date +%y_%m_%d`.mp3
#------------------------------------------------#
#Creamos un pipe
[ -e /tmp/radio_pipe ] && rm /tmp/radio_pipe
mkfifo /tmp/radio_pipe
#Lame
lame /tmp/radio_pipe $nombre 2>/dev/null 1>/dev/null &
#mplayer
mplayer $emisora -cache 32 -ao pcm:file=/tmp/radio_pipe 2>/dev/null </dev/null &
#Esperamos el tiempo marcado
sleep $(($minutos * 60))
#acabamos con el mplayer
kill %2
#borramos el pipe
rm /tmp/radio_pipe
Cosas raras del script para los más avispados:
- Como MPlayer no puede sacar el audio por la salida estándar (lo que nos permitirÃa usar Lame directamente con un pipe entre comandos) utilizamos mkfifo para crear un pipe con nombre. La función es la misma que el pipe entre comandos, solo que con un fichero intermedio
- Para que MPlayer pueda funcionar en background hay que usar el <dev/null para que no de problemas.
- Primero lanzamos Lame y luego MPlayer, ¿No deberÃa ser al revés? Lame es capaz de quedarse esperando a recibir sonido por el fichero o por la entrada estandar, y además es más rápido que el MPlayer produciendo sonido(si no, no se podrÃa hacer al vuelo). MPlayer podrÃa dar problemas si se lanza primero a escribir sobre un pipe del que no está esperando leer nadie.
- kill %2 ¿Qué es eso? , Tiene que ver con la gestión de tareas(jobs) del BASH (mirar man bash, para más info). Cuando lanzamos tareas en background con el bash ocurre esto:
pplux$ commando & [1] 14592
El [1] es el número de tarea, y el 14592 el PID (identificador de proceso) del commando lanzado en background. Una de las muchas opciones de control de tareas que podemos realizar es precisamente la de mandar señales a las tareas, eso se realiza con kill y para mandar una señal a una tarea (sin necesidad de conocer su PID) podemos usar %n donde n es el nuestro número de la tarea. En este caso como hemos lanzado el MPlayer en segundo lugar en background con %2 le mandamos a él la señal.
- ¿Y hace falta lanzar el MPlayer en background realmente? Jejeje, pues no lo se, pero no he encontrado la forma de decirle al MPlayer que lea del stream de audio durante x minutos y luego pare, asà que la opción es lanzarlo en backround, hacer un sleep del tiempo necesario y luego pararlo mandándole una señal (que por defecto kill manda la señal de parar ordenadamente)
- $((5+5)) esta sintáxis de doble paréntesis permite realizar operaciones matemáticas en el BASH, muy útil para multiplicar el número de minutos $minutos por 60 segundos para pasárselo al sleep (que solo entiende de segundos)
Todo lo demás, de cómo usar el cron se puede leer en el blog de fer… Para otro post queda ese aspecto interesante del cron que es poder programar tareas a nivel de usuario y no como root siempre.
