Icecast es un servidor de streaming multimedia de código abierto desarrollado y mantenido por la Fundación Xiph.org, publicado bajo licencia GNU GPLv2 y disponible de forma totalmente gratuita. Fue creado en 1998 con el objetivo de ofrecer una alternativa libre a los servidores de radio por internet comerciales de la época.
¿Qué hace exactamente?
Icecast actúa como intermediario entre el emisor y los oyentes/espectadores: recibe un flujo de audio o vídeo de una fuente (llamada source) y lo redistribuye simultáneamente a todos los clientes conectados. La analogía más directa es una emisora de radio: hay una cabina de emisión (la fuente) y miles de radios que reciben la señal (los clientes), pero ningún cliente habla directamente con otro.
Por otro lado está FFmpeg que, como hemos visto, es una colección de herramientas y bibliotecas de código abierto que permite grabar, convertir (transcodificar) y hacer streaming de prácticamente cualquier formato de audio y vídeo que existe.
Implementación de servidor Multimedia con Icecast2 + FFMPEG
Escenario del laboratorio
Simularéis una plataforma de streaming corporativa de la empresa empresa.local. El esquema de máquinas es el siguiente, con una red NAT o interna:
Máquina
SO
Rol
IP ejemplo
servidor
Ubuntu Server 24.04
Icecast2 (audio + vídeo)
192.168.1.10
cliente1
Ubuntu Desktop 24.04
VLC + navegador (receptor)
192.168.1.20
cliente2
Ubuntu Desktop 24.04
FFMPEG (emisor/fuente)
192.168.1.21
La idea pedagógica es que el servidor es solo el distribuidor (Icecast2), y los clientes pueden ser tanto emisores (con FFMPEG) como receptores (con VLC o navegador), cubriendo así el ciclo completo de RA7 y RA8.
PARTE 1 — Instalación y configuración de Icecast2
Vamos con el servidor ubuntu, donde instalaremos este servidor de streaming:
Paso 1: Instalar Icecast2
Durante la instalación aparece un asistente de configuración. Selecciona Sí y rellena:
Hostname:servidor.empresa.local
Source password:source123 (la usará FFMPEG para publicar)
Relay password:relay123
Admin password:admin123
Si quieres saltarte el asistente y configurar manualmente después:
Paso 2: Configurar /etc/icecast2/icecast.xml
Este archivo es
Ajusta o verifica estas secciones clave:
Paso 3: Activar y arrancar Icecast2
Abre el firewall:
Verifica desde el navegador del cliente que el panel de control de Icecast es accesible:
Deberías ver la página de estado de Icecast2 con los mountpoints vacíos todavía.
PARTE 2 — Instalar FFMPEG en los clientes
En Ubuntu Desktop (cliente1 y cliente2):
Verifica la instalación:
PARTE 3 — Streaming de Audio 📻
🎵 Emitir un stream de audio con FFMPEG
Desde el cliente2 (el emisor), usamos un fichero de audio como fuente.
Puedes crear o descarga un fichero de prueba:
Y ahora emitir el stream hacia Icecast2:
Explicación:
-re = reproduce en tiempo real (como si fuera una radio)
-i input.mp3 = archivo de entrada
-c:a libmp3lame = codifica en MP3
-b:a 128k = bitrate del audio
-f mp3 = formato del stream
De la cadena de conexión, cambia:
source123 → tu contraseña de source en icecast.xml
IP→ IP local o pública de tu servidor
/radio.mp3 → el mount point definido
O bien pudieras enviar toda una carpeta en loop:
Esto tomará una canción al azar en bucle infinito (puedes combinarlo con scripts para rotación aleatoria).
También, para emitir en formato OGG/Vorbis (libre y sin patentes):
Aquí tienes un script Bash listo para lanzar automáticamente un stream de audio a Icecast usando FFmpeg, ideal para una radio casera o personal:
A estas alturas deberias saber usar el script pero por si acaso:
Guarda el script:
(Pega el contenido y guarda con Ctrl+O, Enter, Ctrl+X)
Hazlo ejecutable:
Ejecuta el script:
🎧 Abre en tu móvil o navegador:
Algunos extras que puedes añadir:
Auto-stop tras X canciones o tiempo.
Logs de reproducción.
Añadir jingles entre canciones.
Transiciones suaves con ffmpeg (fundido cruzado).
🎙️Streaming de audio en vivo (micrófono)
Para el streaming en vivo (también tipo radio) pero que se puede usar para captar audios en directo puedes realizarlo con ALSA o bien a través de Pulse Audio.
Si es con ALSA, primero, encuentra tu dispositivo con:
Ejemplo para usar el dispositivo por defecto:
Ahora bien, con PulseAudio seria:
También puedes hacer streaming de lo que esté saliendo por tus altavoces con pulse usando el monitor de tu tarjeta:
Tip Extra: Metadata y título
Puedes añadir información del stream con el parámetro -metadata por ejemplo:
Escuchar el stream de audio
Para escuchar los streamings anteriores puedes hacerlo desde varias aplicaciones:
Desde VLC (cliente1):
Desde el navegador (Firefox/Chromium en cliente1) — navega a:
Desde el panel de Icecast para ver los mountpoints activos:
PARTE 4 — Streaming de Vídeo 📹
Paso 6: Preparar un fichero de vídeo de prueba
Si no tienes un vídeo, genera uno con FFMPEG:
Paso 7: Emitir el stream de vídeo con FFMPEG (RA8.2)
Para emitir en WebM (compatible con más navegadores modernos):
Paso 8: Reproducir el stream de vídeo
De nuevo para reproducir el stream de video lo hariamos desde:
Desde VLC (cliente1):
Desde el navegador (Firefox soporta OGG Theora nativamente):
PARTE 5 — Sindicación RSS/Atom 📰
Ya por último podemos montar un servicio de RSS, RSS (Really Simple Syndication) es un formato basado en XML que permite distribuir y suscribirse a contenidos de sitios web de forma automática, sin necesidad de visitar la página manualmente cada vez.
Cómo funciona técnicamente
El servidor publica un fichero de texto en formato XML (el feed o fuente), que contiene una lista estructurada de los últimos contenidos disponibles: título, descripción, fecha y enlace. El cliente usa un programa llamado lector RSS o agregador que consulta ese fichero periódicamente y muestra las novedades al usuario.
Paso 9: Crear un feed RSS para el stream
Crea manualmente un fichero XML de sindicación en el servidor que los clientes pueden suscribir:
Con el siguiente contenido:
El feed queda accesible en:
Los alumnos pueden suscribirse desde VLC (Medios → Servicios de internet → Podcasts) o desde cualquier lector RSS como Thunderbird (que ya tienen instalado de la práctica anterior).
#!/bin/bash
# CONFIGURACIÓN DEL STREAM
ICECAST_HOST="192.168.1.10"
ICECAST_PORT="8000"
ICECAST_PASSWORD="source123"
ICECAST_MOUNT="/stream.mp3"
# CONFIGURACIÓN DE AUDIO
BITRATE="128k"
CODEC="libmp3lame"
CONTENT_TYPE="audio/mpeg"
FORMAT="mp3"
# DIRECTORIO CON MÚSICA
MUSIC_DIR="$HOME/Music"
# LOGO
echo "🎵 Iniciando stream de radio con FFmpeg..."
# COMPROBAR FFmpeg
if ! command -v ffmpeg &> /dev/null; then
echo "❌ FFmpeg no está instalado."
exit 1
fi
# COMPROBAR QUE HAY MÚSICA
if [ ! -d "$MUSIC_DIR" ]; then
echo "❌ No se encontró el directorio de música: $MUSIC_DIR"
exit 1
fi
# INICIAR EL STREAM (loop aleatorio)
while true; do
echo "🔁 Reproduciendo nuevo archivo..."
FILE=$(find "$MUSIC_DIR" -type f \( -iname "*.mp3" -o -iname "*.ogg" \) | shuf -n 1)
if [ -z "$FILE" ]; then
echo "⚠️ No se encontraron archivos de audio."
sleep 10
continue
fi
echo "🎧 Reproduciendo: $FILE"
ffmpeg -re -i "$FILE" \
-c:a $CODEC -b:a $BITRATE \
-content_type $CONTENT_TYPE \
-f $FORMAT \
icecast://source:$ICECAST_PASSWORD@$ICECAST_HOST:$ICECAST_PORT$ICECAST_MOUNT
echo "🛑 FFmpeg se detuvo. Reiniciando en 5 segundos..."
sleep 5
done