IPTV casera: FFmpeg y HLS paso a paso

Aprende a montar tu propia IPTV casera con FFmpeg y HLS: guía paso a paso para transmitir video en tu red local.

Si estás buscando una solución ligera y funcional para distribuir señal de televisión en tu red local o hacia internet, montar una infraestructura IPTV con FFmpeg y HLS es una opción sólida, gratuita y con resultados profesionales. Aquí te cuento cómo hacerlo paso a paso, basado en mi experiencia real en despliegues domésticos y pequeños entornos corporativos.

Requisitos previos y captura de señal

Lo primero es tener una fuente de vídeo. Puede ser una tarjeta sintonizadora DVB, una cámara IP, o incluso un archivo de vídeo para pruebas. En mi caso, uso un sintonizador USB DVB-T con Linux. Asegúrate de tener instalado FFmpeg y un servidor web como Nginx o Apache para servir los segmentos HLS.

sudo apt update && sudo apt install ffmpeg nginx

Para verificar que tu dispositivo de captura es detectado:

ffmpeg -hide_banner -sources dvb

Creación del flujo HLS con FFmpeg

El protocolo HLS (HTTP Live Streaming) divide el vídeo en pequeños segmentos .ts y genera un archivo de lista de reproducción .m3u8. FFmpeg lo hace de forma sencilla. Este comando toma la señal del sintonizador DVB-T y la convierte en HLS:

ffmpeg -i dvb://canal_ejemplo -c:v libx264 -preset ultrafast -crf 23 -c:a aac -b:a 128k -f hls -hls_time 4 -hls_list_size 10 -hls_flags delete_segments /var/www/html/live/stream.m3u8

Explicación rápida:

  • -preset ultrafast: reduce la carga de CPU, ideal si tienes hardware limitado.
  • -hls_time 4: cada segmento dura 4 segundos.
  • -hls_list_size 10: mantiene solo los últimos 10 segmentos en la lista.
  • delete_segments: limpia segmentos antiguos para no llenar el disco.

Si tu fuente es una URL RTMP o UDP, solo cambia la entrada. Por ejemplo:

ffmpeg -i udp://@239.0.0.1:1234 -c copy -f hls -hls_time 4 /var/www/html/live/stream.m3u8

Configuración del servidor web para servir HLS

Nginx necesita una configuración mínima para servir los archivos HLS correctamente. Edita /etc/nginx/sites-available/default y añade:

server {
    listen 80;
    server_name tu_dominio_o_ip;

    location /live {
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }
        alias /var/www/html/live;
        add_header Cache-Control no-cache;
    }
}

Recarga Nginx:

sudo systemctl reload nginx

Ahora tu flujo es accesible desde http://tu_ip/live/stream.m3u8. Puedes probarlo con VLC o cualquier reproductor compatible con HLS.

Automatización y monitorización básica

Para que el sistema funcione 24/7, te recomiendo ejecutar FFmpeg como un servicio systemd. Crea /etc/systemd/system/iptv-stream.service:

[Unit]
Description=IPTV HLS Stream
After=network.target

[Service]
ExecStart=/usr/bin/ffmpeg -i dvb://canal_ejemplo -c:v libx264 -preset ultrafast -crf 23 -c:a aac -b:a 128k -f hls -hls_time 4 -hls_list_size 10 -hls_flags delete_segments /var/www/html/live/stream.m3u8
Restart=always
User=www-data

[Install]
WantedBy=multi-user.target

Habilítalo e inícialo:

sudo systemctl enable iptv-stream.service
sudo systemctl start iptv-stream.service

Para monitorizar, puedes usar journalctl -u iptv-stream -f o integrar un script que reinicie el servicio si detecta que el archivo m3u8 está desactualizado.

Conclusión

Con FFmpeg, HLS y Nginx tienes una infraestructura IPTV funcional, estable y sin costes de licencia. Es ideal para distribuir señal en redes locales, probar conceptos o incluso como base para un servicio más grande. Ajusta los parámetros según tu ancho de banda y hardware, y tendrás un sistema que aguanta el día a día sin complicaciones.