← Volver al blog
Guías #radio

Receta: montar una radio 24/7 sin transcodificar

Una playlist en bucle empujada como RTMP, remuxada directo a HLS sin re-codificar, sonando las 24 horas. La vía passthrough, los compromisos que hace, y el bucle autoDJ que la alimenta.

4 min de lectura
Read in English

Por qué una radio por passthrough

Una estación 24/7 es la única carga donde no querés que el servidor transcodifique: el audio (y una imagen de portada estática) ya vienen codificados, la CPU debería estar casi ociosa, y nunca debe parar. El passthrough RTMP de StreamHub remuxa tu feed directo a HLS con ffmpeg -c copy — sin re-codificar, CPU mínima — así una máquina chica puede sostener una estación que corre para siempre.

La arquitectura en palabras

El passthrough es una vía distinta que evita LiveKit: un RTMP entrante (video H.264 + audio AAC) se remuxa a segmentos HLS en disco y se sirve público. No hay sala WebRTC, ni escalera adaptativa, ni grabación en el servidor — cambiás todo eso por CPU casi nula y una salida HLS firme como una roca. La fuente es un "autoDJ": un push ffmpeg en bucle de tu playlist más una imagen de la estación, que es una técnica que corrés vos, no una función de StreamHub.

1. Habilitar passthrough en el servidor

El passthrough viene apagado por defecto. Seteá dos variables de entorno y reiniciá el core:

STREAMHUB_RTMP_PASSTHROUGH_ENABLE=on
STREAMHUB_RTMP_PASSTHROUGH_PORT=1937      # NO el 1935 de LiveKit

2. Poner la app en modo passthrough

Aplicá el preset (activa rtmp.passthrough y apaga transcode, adaptativo y grabación), o parcheá la config directo:

export BASE="https://your-server.example.com/api/v1"
export TOKEN="sk_...."

curl -s -X POST $BASE/apps/radio/presets/rtmp-passthrough/apply -H "Authorization: Bearer $TOKEN"
# o: curl -s -X PATCH $BASE/apps/radio/config -H "Authorization: Bearer $TOKEN" \
#      -H 'Content-Type: application/json' -d '{"rtmpPassthrough": true}'

3. Crear la ingesta passthrough

curl -s -X POST $BASE/apps/radio/ingress -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"inputType":"rtmp","room":"fm1","mode":"passthrough"}'

La respuesta te da una URL de push passthrough (rtmp://your-server.example.com:1937/radio/<key>) y las URLs públicas de reproducción:

hls_url:    /hls/radio/fm1/index.m3u8
player_url: /play/radio/fm1

4. Alimentarla con un bucle autoDJ

Repetí tu playlist para siempre con ffmpeg, emparejando el audio con una imagen de portada fija para que la salida sea un stream H.264/AAC válido que el remux pueda copiar:

ffmpeg -re -stream_loop -1 -i playlist.mp3 \
  -loop 1 -i cover.png \
  -c:v libx264 -tune stillimage -pix_fmt yuv420p -r 2 \
  -c:a aac -b:a 128k -shortest -f flv \
  rtmp://your-server.example.com:1937/radio/<key>

OBS con una fuente de medios en bucle funciona igual de bien. Si la fuente se cae, el gestor de remux se re-arma y una fuente en bucle reconecta sola.

Qué deberías ver

La estación suena en /hls/radio/fm1/index.m3u8 con cerca de dos segmentos de latencia, la CPU queda casi ociosa porque nada se re-codifica en el servidor, y el stream sigue corriendo mientras el bucle empuje.

Resolución de problemas

  • 400 al crear la ingesta — el passthrough rechaza transcodificación, claves de backup, solo-audio, WHIP y entradas URL; tiene que ser un push RTMP (o SRT) plano en mode: passthrough.
  • 503 al crear la ingesta — la función del servidor está apagada; seteá STREAMHUB_RTMP_PASSTHROUGH_ENABLE=on y reiniciá.
  • Sin reproducción — la fuente ya tiene que ser H.264/AAC (no hay red de seguridad de transcode); el comando ffmpeg con imagen de portada de arriba lo garantiza.
  • Necesitás WebRTC, chat o grabación — no existen en la vía passthrough. Si los querés más CPU baja, usá la vía LiveKit con transcoding.enabled: false en lugar de rtmp.passthrough.

¿Audio interactivo en su lugar?

Si en realidad querés una radio en vivo, hablada (un locutor al micrófono, sub-segundo, con un embed público de "escuchar"), eso es el plugin radio aparte — audio WebRTC con un listen-token público. El passthrough es para una difusión continua alimentada por archivo; el plugin radio es para un programa en vivo.

Cierre

Una estación por passthrough es casi lo más barato que hay en streaming, y es toda tuya. Si querés programación, inserción de publicidad, o una página de "suena ahora" con tu marca conectada a esto, nuestro equipo las construye alrededor del core open source como servicio de consultoría.