Domingo, Septiembre 4, 2005

Grabando de la radio en mp3 al vuelo

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.

posteado por PpluX @ 7:08 pm tags:Programación  

29 Comentarios »

  1. Según la versión que tengáis de MPlayer puede ser que donde pone:

    mplayer $emisora -ao pcm:file=/tmp/radio_pipe 2>/dev/null 1>/dev/null  </dev/null &

    tengáis que poner:

    mplayer $emisora -ao pcm -aofile /tmp/radio_pipe 2>/dev/null 1>/dev/null  </dev/null &

    Comentario por PpluX — Septiembre 4, 2005 @ 7:30 pm

  2. Te ha quedado mucho más compacto, la verdad :)

    Voy a actualizar mis post.

    Comentario por Fernando — Septiembre 4, 2005 @ 8:51 pm

  3. [...] Actualización En Sopa de Ganso podéis encontrar un script más sofisticado, y es que donde hay nivel, hay nivel. El enlace es este: Grabando de la radio mp3 al vuelo. [...]

    Pingback por La Taberna del Turco » Crear tus podcast de programas de radio automáticamente en Linux — Septiembre 4, 2005 @ 10:03 pm

  4. Si en lugar de usar mplayer usais mencoder, puede que podais usar el parámetro “-endpos” para el tiempo de grabación y “-oac lavc –lavcopts acodec:mp3″ o “-oac lame” para comprimir directamente a mp3. Así os ahorrais crear pipes y jugar con los jobs de bash, y de paso el script es multiplataforma :P.

    Comentario por kanuso — Septiembre 5, 2005 @ 5:46 pm

  5. me encantaría poder usar mencoder :), peeero no hemos (varios, yo entre ellos) conseguido que se pueda usar sin stream de video. Si lo consigues, avisa :D

    Comentario por PpluX — Septiembre 5, 2005 @ 6:45 pm

  6. Estoy como Pplux, si no tiene stream de video no he podido. Este script es buenísimo. Está bueno que se pueda usar también con protocolo rtsp://. Alguien sabe como bajar el rtsp:// pelado (es decir hacer un dump del stream)?

    Comentario por Tessonec — Septiembre 15, 2005 @ 7:09 pm

  7. Muy bueno el script ;) Voy a ver si consigo modificarlo para que grabe en OGG-Vorbis.

    Comentario por Carlos — Octubre 10, 2005 @ 11:03 pm

  8. Si no funciona, a parte de comprobar que estén instalados los programas que necesita (mplayer, lame…), se puede probar a cambiar la ruta donde se crea la tubería (/tmp/) por otra con mejor acceso (”.” por ejemplo).

    Comentario por jao — Octubre 11, 2005 @ 12:13 am

  9. Yo el problema que tengo es que el mplayer se queda en “Cache fill: xx%” y subre muuuuuuy lentamente, y eso que simplemente quería probarlo con 1 minuto. O sea, que pasa el minuto y sigue subiendo el cache fill. Sabéis por qué puede ser?

    Sin embargo, pasandole al Kaffeine la direccion mms, se pone a reproducir en 5 segundos, pero no se guardar a un flujo… :(

    Comentario por carpelo — Enero 12, 2006 @ 10:07 am

  10. Por cierto, ahora que caigo: no hay “&” al final de la linea de mplayer? Lo he copiado tal cual y no aparece, y acabo de leer que estaba en segundo plano… Claro, el mplayer se quedaba abierto y el kill se cargaba el lame :(

    Comentario por carpelo — Enero 12, 2006 @ 1:34 pm

  11. Solucionado:
    aparte del “&” he añadido “- nocache” como opción a la linea del mplayer :)))

    Comentario por carlos — Enero 12, 2006 @ 2:58 pm

  12. sí cierto, faltan cosas en el script que no se ve por culpa de que al actualizar el wordpress se ha perdido el plugin que coloreaba (y arreglaba los problemas de visualización) del código. Sorry!!

    Y sí, lo de -nocache ayuda, pero claro algo de cache siempre viene bien (se puede ajustar el tamaño de la cache, y creo que estaba pero el wordpress se lo ha zampao)

    Intentaré arreglarlo cuando pueda.
    :)

    Comentario por PpluX — Enero 13, 2006 @ 9:18 am

  13. ¿Sabe alguien como oir y sobreo todo grabar m80 ahora?

    Parece que la url ha cambiado, ahora parece ser:

    http://www.los40.com/nuevo_player/player_radio_listen_m80.html

    por lo menos, poniendo eso en el ReplayRadio en windows funciona, y en el internet explorer también, pero en el firefox (en linux) no.

    Comentario por antonio — Enero 19, 2006 @ 5:00 pm

  14. Entonces el scrip este funciona?
    ——————–
    PpluX Jan 13th, 2006 at 9:18 am

    sí cierto, faltan cosas en el script que no se ve por culpa de que al actualizar el wordpress se ha perdido el plugin que coloreaba (y arreglaba los problemas de visualización) del código. Sorry!!

    Y sí, lo de -nocache ayuda, pero claro algo de cache siempre viene bien (se puede ajustar el tamaño de la cache, y creo que estaba pero el wordpress se lo ha zampao)

    Intentaré arreglarlo cuando pueda.

    Comentario por tupacamaru — Enero 30, 2006 @ 5:53 pm

  15. Copiado tal cual y añadiendo un & al mplayer me crea un fichero llamado audiodump.wav, el lame se arranca pero no hace su tarea.

    Aquí hay otro script aunque parece que el mplayer era más viejo y las opciones del mplayer son distintas:

    http://www.jayraldyn.net/index.php?zona=tekky/grabarradio.html

    Comentario por tupacamaru2 — Enero 31, 2006 @ 1:28 pm

  16. Perdona! estoy un poco liado ahora mismo para comprobarlo, déjame que lo mire esta tarde o mañana y dejo colgado el script en el servidor para que no haya ningún tipo de duda.

    Un saludo y perdona por la espera.

    Comentario por PpluX — Enero 31, 2006 @ 1:31 pm

  17. [...] Nik probak 5 minutuko emisioakin egin ditut. Gabaz ordu erdi edo ordubeteko saioa grabatuko det. Honi buruz beste artikulu on bat hemen [...]

    Pingback por Irrati programak grabatzen - TOLON — Febrero 8, 2006 @ 6:51 pm

  18. creo que he logrado echar andar el script con la opcion de conversión directa desde el mplayer:

    #emisora
    emisora=mms://sistemachiapaneco.dyn.nu:8000/listen.pls
    #numero de minutos
    minutos=120

    #Nombre del programa
    programa=XHTGU

    #Directorio donde grabarlo (’.’ = actual)

    dir=.

    # Nombre del fichero
    nombre=${dir}/${programa}_`date %y_%m_%d_%H:%M`.mp3

    #————————————————#

    #mplayer (el demuxer para forzar grabacion a MP3
    mplayer -demuxer 17 -dumpaudio -dumpfile $nombre -cache 200 -playlist $emisora 2>/dev/null&

    #Esperamos el tiempo marcado
    sleep $(($minutos * 60))

    #acabamos con el mplayer
    kill %1

    # y eso sería todo…..

    Comentario por icarus — Abril 18, 2006 @ 12:32 am

  19. Después de mucho tiempo he depurado el script que se había mal-formado al editar la noticia y he dejado un enlace permamente al fichero mplayer-al-vuelo.sh

    Un saludo.

    Comentario por PpluX — Junio 10, 2006 @ 8:47 pm

  20. Me he permitido el lujo de modificar el script para que en conjuncion con el cron me permita grabar cualquier programa, de la duración que sea, permitiendo poner el nombre del mismo al grabarlo en el directorio que deseemos.

    Espero que a alguien le sirva de ayuda, un saludo.
    ———————8

    # Radio Galega: mms://85.91.64.23/RadioGalega
    # Onda Cero: mms://a562.l507241195.c5072.e.lm.akamaistream.net/D/562/5072/v0001/reflector:41195

    if [ $# != "3" ]
    then
    echo “Sintaxis: radio.sh ”
    exit
    fi

    #emisora
    emisora=$1
    #numero de minutos
    minutos=$2
    #Nombre del programa
    programa=$3
    #Directorio donde grabarlo (?.? = actual)
    dir=/mnt/temporais
    pipe=${dir}/${programa}_pipe
    # Nombre del fichero
    nombre=${dir}/${programa}_`date +%y%m%d`.mp3
    #????????????????#
    #Creamos un pipe
    [ -e $pipe ] && rm $pipe
    mkfifo $pipe
    #Lame
    lame $pipe $nombre 2>/dev/null 1>/dev/null &
    #mplayer
    mplayer $emisora -cache 64 -ao pcm:file=$pipe 2>/dev/null

    Comentario por Estribiyo — Agosto 1, 2006 @ 12:52 am

  21. Bueno, acabo de intentar subir el script, pero los filtros lo han jodido completamente, si a alguien le interesa, que me avise y se lo mando. Hasta otra

    Comentario por Estribiyo — Agosto 1, 2006 @ 12:54 am

  22. Comentario poco constuctivo y desesperado:

    ¡Por qué leches no me graba ningún mp3 cuando lo lanzo desde cron! :)

    Este es el problema.

    Uso una ubuntu edgy… le he dado permisos a todo dios para escribir en la carpeta etc etc

    Si alguien me puede ayudar, lo agradecería ;)

    Comentario por Manuel — Diciembre 6, 2006 @ 4:33 am

  23. perdón, se me olvidaba comentar que la tubería sí que la crea y que en el log de sistema aparece lanzado el proceso…

    Me “Funciona”, pero sólo a medias.

    Comentario por Manuel — Diciembre 6, 2006 @ 4:36 am

  24. Bueno, parece que al fin y al cabo la cosa es culpa de la Kubuntu edgy, de kde o de cron:

    La cuestión es que si reinicio cron desde el panel de control de kde (como administrador) la cosa funciona, sinembargo si lo hago desde la consola (”sudo /etc/init.d/cron restart”)
    No funciona…

    ¿Se os ocurre algo?

    Comentario por Manuel — Diciembre 6, 2006 @ 7:38 am

  25. SOLUCIONADO

    No sé lo que habrá sido, pero creo que está relacionado con mailx… y ¿por qué creo esta tontería?…

    Pues porque lo instalé (no se me instaló por defecto) para ver los errores que me daba, y aunque no me daba ningún error… RESULTA QUE EN REALIDAD NO HABIA ERROR, SE HABIA ARREGLADO…

    No lo entiendo, ¿es mailx necesario para que esto funcione?

    Saludos.

    Comentario por Manuel — Diciembre 7, 2006 @ 2:36 am

  26. Hola Manuel,
    no tengo ni la más remota idea de qué te puede estar pasando :P , si me pasara a mi sospecharía del orden en el que se lanzan las tareas de cron o de ver si cuando se inicializa el cron al arrancar también se intenta lanzar el script y eso lo bloquea, o… ni idea, básicamente para mi tienes un poltergeist en el ordenador XD.

    Un saludo

    Comentario por PpluX — Diciembre 7, 2006 @ 10:33 am

  27. Fantástico el script

    Comentario por alejandro — Agosto 5, 2007 @ 12:28 pm

  28. Creo que una forma facil de hacerlo es instalar el programa StreamRipper (esta en los repositorios de ubuntu) e instalar la interfaz de KDE KStreamRipper.
    luego le das añadir, pones la direccion http que se encuentra en el archivo pls (lo ves abriendo con cualquier editor de texto el archivo pls) le pones un nombre y comentario y pulsas ok.
    luego inicias a rippear y el te baja los archivos en una carpeta donde le dijiste con sus IDTags en archivos separados.
    ojala les sirva.
    Luis

    Comentario por Luis Becerra — Septiembre 25, 2007 @ 1:21 am

  29. [...] pplux Posted in Aplicaciones, General | Leave a [...]

    Pingback por debian-ar.org » Blog Archive » Como escuchar radios en debian — Marzo 27, 2008 @ 4:36 am

Suscripción RSS a los comentarios de la entrada. URI para TrackBack.

Deja un comentario

Gestionado con WordPress