En algún momento puede interesarnos difundir audio por una red tcp/ip. Puede ser en una red local o en internet, puede proceder de ficheros grabados o ser generado en tiempo real, puede ser nuestra voz o la salida de audio de un equipo de radioaficionado. Hay abundantes guías sobre todo esto disponible en la web. Yo recojo en unas breves notas mi experiencia personal.
Experimento 1
PC, entorno gráfico, pulse audio, emisora convencional conectada a tarjeta de sonido. El programa vlc, además de ser un reproductor multimedia muy completo, tiene otras prestaciones como la difusión en streaming. Se puede lanzar desde línea de comandos con todas las opciones que deseamos, así:
vlc -vvv pulse://alsa_input.pci-0000_00_1b.0.analog-stereo --sout '#transcode{acodec=mp3,ab=128}:standard{access=http,mux=mp3,dst=192.168.1.1:8080}'
Ejecutar antes «pacmd list-sources» para elegir la fuente. Cada uno pondrá la dirección IP de su equipo. A modo de ejemplo pongo «192.168.1.1».
Pero el navegador no lo interpreta como un streaming sino como un fichero para descargar. Parece que sí lo detecta bien si añadimos un nombre a la url, así:
vlc -vvv pulse://alsa_input.pci-0000_00_1b.0.analog-stereo --sout '#transcode{acodec=mp3,ab=128}:standard{access=http,mux=mp3,dst=192.168.1.1:8080/mp3}'
Desde el navegador de pc o dispositivo móvil accedemos a http://192.168.1.1:8080/mp3 y se debe oir el audio. Suele haber unos segundos de retardo, entiendo que debidos al propio navegador, que guarda un búfer para evitar que la reproducción se entrecorte por problemas en la red.
Experimento 2
Lanzamos el comando prescindiendo del entorno gráfico.
cvlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=48000 pulse://alsa_input.pci-0000_00_1b.0.analog-stereo --sout '#transcode{acodec=mp3,ab=128,channels=2}:standard{access=http,mux=mp3,dst=192.168.1.1:8080/live.mp3}'
Otra opción que puede ser interesante es que cvlc tome el audio no a través de pulse sino por otro camino. Por ejemplo el programa de SDR Gqrx puede hacerlo por udp. No verificado por mí:
cvlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=48000 udp://@:7355 --sout '#transcode{acodec=mp3,ab=128,channels=2}:standard{access=http,dst=192.168.1.1:8080/live.mp3}'
Experimento 3
Para no dejar un transceptor encendido mucho tiempo y al tratarse solamente de recepción lo ideal es utilizar un receptor SDR como los dongle rtl.
Por pasos, en primer lugar reproducir audio en el mismo pc o Raspberry Pi desde la línea de comandos para asegurarnos de que la demodulación funciona:
rtl_fm -M wbfm -f 89.0M -g 30 | play -r 32k -t raw -e s -b 16 -c 1 -V1 -
rtl_fm -M fm -f 145.3375M -g 30 | play -r 24k -t raw -e s -b 16 -c 1 -V1 –
En fm estrecha el samplerate no es 32 sino 24 kHz. Con 32 se oye la voz aguda y hay cortes periódicos en el búfer.
Una vez tenemos resuelta la recepción con rtl_fm intentamos difundir el flujo mp3 enviando la salida a cvlc mediante un pipe, en un solo comando. En cvlc hay que poner la opción ‘-‘ para que tome la fuente de stdin:
rtl_fm -M wbfm -f 89.0M -g 30 | cvlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=32000 - --sout '#transcode{acodec=mp3,ab=128,channels=2}:standard{access=http,mux=mp3,dst=192.168.1.1:8080/live.mp3}'
Si la fuente de audio no es de alta definición podemos reducir la tasa binaria de 128 a 32 bits y ahorrar ancho de banda:
rtl_fm -M fm -f 145.3375M -g 30 | cvlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=32000 - --sout '#transcode{acodec=mp3,ab=32,channels=1}:standard{access=http,mux=mp3,dst=192.168.1.1:8080/live.mp3}'
Hay bastantes parámetros que se pueden ajustar para el caso de uso de cada uno. La ganancia (-g 30) puede requerir ajustes, incluso puede funcionar mejor si se deja automática. También se puede ajustar el silenciador squelch:
rtl_fm -M fm -f 145.3375M | cvlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=32000 - --sout '#transcode{acodec=mp3,ab=32,channels=1}:standard{access=http,mux=mp3,dst=192.168.1.1:8080/live.mp3}'
Experimento 4
Además de no dejar encendido un transceptor tampoco queremos dejar encendido un ordenador. Intentamos esto en una Raspberry Pi pero no funciona, obtenemos este error:
rtlsdr_write_reg failed with -4
Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.
Reading samples in async mode…
Allocating 15 zero-copy buffers
Failed to allocate zero-copy buffer for transfer 5
Falling back to buffers in userspace
Failed to submit transfer 0
Please increase your allowed usbfs buffer size with the following command:
echo 0 > /sys/module/usbcore/parameters/usbfs_memory_mb
O funciona durante unos segundos y después se para con el mensaje
[b3702e40] main mux warning: late buffer for mux input (252354)
Por otra parte, en Rpi sí funciona esto para emitir como stream un fichero:
cvlc audio.wav -vvv --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=11025 --sout '#transcode{acodec=mp3,ab=32,channels=1}:standard{access=http,dst=192.168.1.1:8080/live.mp3}'
y funcionaba la escucha directa de rtl_fm por su salida de audio. Lo que no funciona es el SDR y el stream juntos. El mensaje de error daba una pista de cómo solucionarlo. Debemos ejecutar:
sudo su
echo 0 > /sys/module/usbcore/parameters/usbfs_memory_mb
Podemos lanzar este comando que se seguirá ejecutando aunque cerremos la sesión:
nohup rtl_fm -M fm -f 145.3375M -g 30 | cvlc -vvv --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=24000 - --sout '#transcode{acodec=mp3,ab=32,channels=1}:standard{access=http,mux=mp3,dst=192.168.1.1:8080/radio.mp3}' &
En la RPi modelo B con SoC BCM2835 y cpu ARM1176JZF-S a 700 MHz, la primera que salió al mercado en 2012, rtl_fm consume 40% de cpu y cvlc 23%.

Experimento 5
Si deseamos oir este audio por internet, fuera de nuestra LAN, y si estamos experimentando desde casa, deberemos redirigir el puerto 8080 del router hacia el dispositivo. En caso de que nuestro router no tenga una IP pública sino CGNAT tendríamos que utilizar una aplicaciones de túneles como ngrok. Yo no lo he probado pero parece adecuado. También puede ser práctico un servicio de DNS dinámico, para acceder a nuestro servidor aunque cambie de dirección IP.
Utilidad, sentido, oportunidad, sugerencias
Podemos preguntarnos por el sentido del streaming en mp3. En el año 2000 solía usarse más pero ahora parece una tecnología obsoleta, superada por aplicaciones específicas o grandes plataformas (youtube, discord, etc). Me parece ventajoso emplear un sistema que es estandarizado, abierto y eficiente y no una solución cerrada ni dependiente de servicios una empresa, de pago o con publicidad. Por otra parte requiere un hardware propio, una red y saber configurar unos programas. Y si nos gusta experimentar, ése es ya un argumento definitivo.
La utilidad o la oportunidad de uso puede ser desde un monitor de bebés dentro de un hogar, la difusión de un evento o la monitorización de señales de radioaficionados. Recordemos que difundir señales de radio privadas o pertenecientes a servicios gubernamentales o de seguridad está prohibida. En el ámbito de la radioafición existen aplicaciones versátiles como echolink o websdr pero son casos diferentes. Echolink requiere un software específico y un registro. Websdr funciona desde un navegador web pero consume más ancho de banda y procesamiento y el servidor tiene un software más complejo. En una casa particular o en un radioclub es fácil montar un streaming para difundir frecuencias concretas como un repetidor, frecuencias de llamada DX (por ejemplo, también en HF y SSB) o de charla local habitual.
Oct 19 2023
Streaming de voz
En algún momento puede interesarnos difundir audio por una red tcp/ip. Puede ser en una red local o en internet, puede proceder de ficheros grabados o ser generado en tiempo real, puede ser nuestra voz o la salida de audio de un equipo de radioaficionado. Hay abundantes guías sobre todo esto disponible en la web. Yo recojo en unas breves notas mi experiencia personal.
Experimento 1
PC, entorno gráfico, pulse audio, emisora convencional conectada a tarjeta de sonido. El programa vlc, además de ser un reproductor multimedia muy completo, tiene otras prestaciones como la difusión en streaming. Se puede lanzar desde línea de comandos con todas las opciones que deseamos, así:
vlc -vvv pulse://alsa_input.pci-0000_00_1b.0.analog-stereo --sout '#transcode{acodec=mp3,ab=128}:standard{access=http,mux=mp3,dst=192.168.1.1:8080}'
Ejecutar antes «pacmd list-sources» para elegir la fuente. Cada uno pondrá la dirección IP de su equipo. A modo de ejemplo pongo «192.168.1.1».
Pero el navegador no lo interpreta como un streaming sino como un fichero para descargar. Parece que sí lo detecta bien si añadimos un nombre a la url, así:
vlc -vvv pulse://alsa_input.pci-0000_00_1b.0.analog-stereo --sout '#transcode{acodec=mp3,ab=128}:standard{access=http,mux=mp3,dst=192.168.1.1:8080/mp3}'
Desde el navegador de pc o dispositivo móvil accedemos a http://192.168.1.1:8080/mp3 y se debe oir el audio. Suele haber unos segundos de retardo, entiendo que debidos al propio navegador, que guarda un búfer para evitar que la reproducción se entrecorte por problemas en la red.
Experimento 2
Lanzamos el comando prescindiendo del entorno gráfico.
cvlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=48000 pulse://alsa_input.pci-0000_00_1b.0.analog-stereo --sout '#transcode{acodec=mp3,ab=128,channels=2}:standard{access=http,mux=mp3,dst=192.168.1.1:8080/live.mp3}'
Otra opción que puede ser interesante es que cvlc tome el audio no a través de pulse sino por otro camino. Por ejemplo el programa de SDR Gqrx puede hacerlo por udp. No verificado por mí:
cvlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=48000 udp://@:7355 --sout '#transcode{acodec=mp3,ab=128,channels=2}:standard{access=http,dst=192.168.1.1:8080/live.mp3}'
Experimento 3
Para no dejar un transceptor encendido mucho tiempo y al tratarse solamente de recepción lo ideal es utilizar un receptor SDR como los dongle rtl.
Por pasos, en primer lugar reproducir audio en el mismo pc o Raspberry Pi desde la línea de comandos para asegurarnos de que la demodulación funciona:
rtl_fm -M wbfm -f 89.0M -g 30 | play -r 32k -t raw -e s -b 16 -c 1 -V1 -
rtl_fm -M fm -f 145.3375M -g 30 | play -r 24k -t raw -e s -b 16 -c 1 -V1 –
En fm estrecha el samplerate no es 32 sino 24 kHz. Con 32 se oye la voz aguda y hay cortes periódicos en el búfer.
Una vez tenemos resuelta la recepción con rtl_fm intentamos difundir el flujo mp3 enviando la salida a cvlc mediante un pipe, en un solo comando. En cvlc hay que poner la opción ‘-‘ para que tome la fuente de stdin:
rtl_fm -M wbfm -f 89.0M -g 30 | cvlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=32000 - --sout '#transcode{acodec=mp3,ab=128,channels=2}:standard{access=http,mux=mp3,dst=192.168.1.1:8080/live.mp3}'
Si la fuente de audio no es de alta definición podemos reducir la tasa binaria de 128 a 32 bits y ahorrar ancho de banda:
rtl_fm -M fm -f 145.3375M -g 30 | cvlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=32000 - --sout '#transcode{acodec=mp3,ab=32,channels=1}:standard{access=http,mux=mp3,dst=192.168.1.1:8080/live.mp3}'
Hay bastantes parámetros que se pueden ajustar para el caso de uso de cada uno. La ganancia (-g 30) puede requerir ajustes, incluso puede funcionar mejor si se deja automática. También se puede ajustar el silenciador squelch:
rtl_fm -M fm -f 145.3375M | cvlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=32000 - --sout '#transcode{acodec=mp3,ab=32,channels=1}:standard{access=http,mux=mp3,dst=192.168.1.1:8080/live.mp3}'
Experimento 4
Además de no dejar encendido un transceptor tampoco queremos dejar encendido un ordenador. Intentamos esto en una Raspberry Pi pero no funciona, obtenemos este error:
O funciona durante unos segundos y después se para con el mensaje
Por otra parte, en Rpi sí funciona esto para emitir como stream un fichero:
cvlc audio.wav -vvv --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=11025 --sout '#transcode{acodec=mp3,ab=32,channels=1}:standard{access=http,dst=192.168.1.1:8080/live.mp3}'
y funcionaba la escucha directa de rtl_fm por su salida de audio. Lo que no funciona es el SDR y el stream juntos. El mensaje de error daba una pista de cómo solucionarlo. Debemos ejecutar:
sudo su
echo 0 > /sys/module/usbcore/parameters/usbfs_memory_mb
Podemos lanzar este comando que se seguirá ejecutando aunque cerremos la sesión:
nohup rtl_fm -M fm -f 145.3375M -g 30 | cvlc -vvv --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=24000 - --sout '#transcode{acodec=mp3,ab=32,channels=1}:standard{access=http,mux=mp3,dst=192.168.1.1:8080/radio.mp3}' &
En la RPi modelo B con SoC BCM2835 y cpu ARM1176JZF-S a 700 MHz, la primera que salió al mercado en 2012, rtl_fm consume 40% de cpu y cvlc 23%.
Experimento 5
Si deseamos oir este audio por internet, fuera de nuestra LAN, y si estamos experimentando desde casa, deberemos redirigir el puerto 8080 del router hacia el dispositivo. En caso de que nuestro router no tenga una IP pública sino CGNAT tendríamos que utilizar una aplicaciones de túneles como ngrok. Yo no lo he probado pero parece adecuado. También puede ser práctico un servicio de DNS dinámico, para acceder a nuestro servidor aunque cambie de dirección IP.
Utilidad, sentido, oportunidad, sugerencias
Podemos preguntarnos por el sentido del streaming en mp3. En el año 2000 solía usarse más pero ahora parece una tecnología obsoleta, superada por aplicaciones específicas o grandes plataformas (youtube, discord, etc). Me parece ventajoso emplear un sistema que es estandarizado, abierto y eficiente y no una solución cerrada ni dependiente de servicios una empresa, de pago o con publicidad. Por otra parte requiere un hardware propio, una red y saber configurar unos programas. Y si nos gusta experimentar, ése es ya un argumento definitivo.
La utilidad o la oportunidad de uso puede ser desde un monitor de bebés dentro de un hogar, la difusión de un evento o la monitorización de señales de radioaficionados. Recordemos que difundir señales de radio privadas o pertenecientes a servicios gubernamentales o de seguridad está prohibida. En el ámbito de la radioafición existen aplicaciones versátiles como echolink o websdr pero son casos diferentes. Echolink requiere un software específico y un registro. Websdr funciona desde un navegador web pero consume más ancho de banda y procesamiento y el servidor tiene un software más complejo. En una casa particular o en un radioclub es fácil montar un streaming para difundir frecuencias concretas como un repetidor, frecuencias de llamada DX (por ejemplo, también en HF y SSB) o de charla local habitual.
By EA4GMZ • Operativa •