Cómo transmitir en vivo desde OBS a tu propio servidor RTMP en VPS

Configura un servidor RTMP propio en VPS Linux con Nginx y envía tu directo de OBS sin depender de Twitch o YouTube. Paso a paso técnico.

Transmitir por Twitch o YouTube funciona hasta que necesitas control: menor latencia, retención de video según tus reglas, retransmisión simultánea a múltiples destinos, o simplemente independencia de una plataforma que puede banear el canal. Ejecutar un servidor RTMP propio en una VPS resuelve todo eso por una fracción de lo que cuesta un plan comercial de streaming dedicado.

Este tutorial cubre el camino completo: levantar Nginx con el módulo RTMP en una VPS Ubuntu, configurar OBS Studio para publicar allí, validar la transmisión en un reproductor externo y endurecer el servidor para producción. El perfil objetivo es el streamer técnico que ya maneja OBS pero nunca administró un servidor de medios.

Tiempo estimado de ejecución: 40 a 60 minutos, contando descarga de paquetes y la primera prueba de transmisión.

Requisitos previos

Antes de empezar, confirma el entorno. RTMP es un protocolo sensible a la latencia de red — una VPS con subida baja o enlace congestionado va a degradar la calidad del directo independientemente de la configuración del servidor.

Requisitos previos

Ubuntu 24.04 LTS (o 22.04) con acceso root vía SSH, ~500 MB libres para la compilación de Nginx y paquetes auxiliares, IP pública accesible desde tu máquina local. Banda mínima de 100 Mbps en el servidor para 1080p60 sin cuello de botella. OBS Studio 30.x o superior instalado en la máquina de origen.

Puerto RTMP estándar 1935/tcp
Puerto HLS (opcional) 8080/tcp
Bitrate sugerido 1080p60 6000 kbps
Códec de video h.264

Instalación de Nginx con módulo RTMP

El módulo nginx-rtmp-module no viene en los repositorios oficiales de Ubuntu como módulo dinámico cargable. La forma más limpia en distribuciones actuales es instalar el paquete libnginx-mod-rtmp, que ya entrega el módulo compilado contra la versión de Nginx de apt — sin necesidad de compilar desde cero.

01

Actualiza el índice de paquetes e instala Nginx junto con el módulo RTMP:

sudo apt update
sudo apt install -y nginx libnginx-mod-rtmp

El paquete libnginx-mod-rtmp añade el archivo /etc/nginx/modules-enabled/50-mod-rtmp.conf que carga el módulo automáticamente. Confirma que se cargó:

nginx -V 2>&1 | grep -o rtmp

Si la salida es rtmp, el módulo está disponible.

02

Crea el archivo de configuración de RTMP. El bloque rtmp va fuera del bloque http — edita /etc/nginx/nginx.conf y añade al final del archivo:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        allow publish 127.0.0.1;
        allow publish TU_IP_DE_CASA;
        deny publish all;
        allow play all;

        application live {
            live on;
            record off;
        }
    }
}

Sustituye TU_IP_DE_CASA por la IP pública desde donde OBS va a publicar. Sin esa restricción, cualquiera en internet puede publicar streams en tu servidor consumiendo banda y CPU.

03

Prueba la configuración y recarga Nginx:

sudo nginx -t
sudo systemctl reload nginx

Si nginx -t se queja de unknown directive "rtmp", el módulo no se cargó — revisa el paso 01 y confirma que /etc/nginx/modules-enabled/50-mod-rtmp.conf existe.

Apertura en el firewall

Por defecto la VPS viene con firewall activo o bloqueando puertos no estándar. RTMP usa TCP 1935 — sin regla explícita, OBS se va a topar con un timeout silencioso.

04

Abre el puerto 1935 en UFW:

sudo ufw allow 1935/tcp
sudo ufw reload

Si usas iptables directo sin UFW, la regla equivalente es:

sudo iptables -A INPUT -p tcp --dport 1935 -j ACCEPT

Y persiste con iptables-save o el método de tu proveedor.

Cuidado con el firewall del proveedor

Algunas VPS tienen una capa extra de firewall en el panel del proveedor (security groups, network policies) que opera antes del iptables de la máquina. Si telnet TU_IP 1935 desde tu casa da timeout pero dentro de la VPS funciona en localhost, el bloqueo es externo — abre el puerto también en el panel.

Configuración de OBS Studio

Con el servidor listo, ahora OBS necesita apuntar hacia él. El endpoint sigue el patrón rtmp://IP_DEL_SERVIDOR/application y la stream key es el nombre del stream que el reproductor va a consumir.

05

Abre OBS Studio y ve a Archivo → Configuración → Emisión. Selecciona:

  • Servicio: Personalizado
  • Servidor: rtmp://IP_DE_TU_SERVIDOR/live
  • Clave de retransmisión: elige un nombre — puede ser micanal, prueba01, cualquier cadena sin espacios ni caracteres especiales.

Haz clic en Aceptar para guardar.

06

Ajusta el codificador en Configuración → Salida → Modo avanzado → Emisión:

  • Codificador: x264 (CPU) o NVENC H.264 (si tienes GPU NVIDIA)
  • Tasa de bits: 4500 kbps para 1080p30, 6000 kbps para 1080p60
  • Intervalo de keyframe: 2 segundos
  • Perfil: main
  • Preajuste: veryfast (CPU) o Quality (NVENC)

Keyframe cada 2s es importante para un HLS futuro — los segmentos sin keyframe no funcionan bien en reproductores HTML5.

07

Haz clic en Iniciar transmisión en el panel principal de OBS. El indicador en la esquina inferior derecha debe pasar a verde con bitrate activo. Si se pone rojo o aparece “Failed to connect”, revisa la sección de resolución de problemas más abajo.

Verificación de la transmisión

Ahora confirma que el stream está llegando realmente al servidor y se puede consumir. VLC es la forma más rápida — habla RTMP nativo sin plugin.

08

En el servidor, verifica que Nginx está aceptando la conexión:

sudo tail -f /var/log/nginx/error.log

Cuando OBS conecta, verás líneas como client connected '...' y publish started.

09

En tu máquina local, abre VLC y ve a Medio → Abrir ubicación de red. Pega:

rtmp://IP_DE_TU_SERVIDOR/live/micanal

Donde micanal es la clave que definiste en OBS. Haz clic en Reproducir — el directo debe aparecer con una latencia de 2 a 5 segundos. Si aparece “no se pudo abrir”, verifica que OBS realmente está transmitiendo (indicador verde) y que la clave coincide exactamente con la URL.

Añade HLS para distribución en navegador

Si quieres incrustar el directo en un sitio web, añade en la application live del nginx.conf:

hls on;
hls_path /var/www/hls;
hls_fragment 2s;
hls_playlist_length 10s;

Crea /var/www/hls con permiso para www-data, sirve vía bloque HTTP normal, y apunta un reproductor hls.js a http://IP/hls/micanal.m3u8.

Resolución de problemas

OBS conecta pero se desconecta tras pocos segundos

Casi siempre es falta de banda de subida en tu casa o en el servidor. Reduce el bitrate de OBS a 2500 kbps y prueba de nuevo. Si se estabiliza, el cuello de botella era la banda — calcula la subida sostenida real con speedtest-cli en tu máquina y dimensiona el bitrate para quedar por debajo del 70% de la subida disponible.

Error “RTMP_ReadPacket, failed to read RTMP packet header”

Síntoma típico de timeout entre el cliente RTMP (VLC, reproductor) y el servidor. Aumenta los timeouts en el bloque rtmp de Nginx:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        timeout 30s;
        ping 30s;
        ping_timeout 10s;
        # ... resto
    }
}

Recarga con sudo systemctl reload nginx.

Latencia muy alta en VLC (más de 10 segundos)

VLC tiene un buffer de red agresivo por defecto. En Herramientas → Preferencias → Entrada/Códecs, reduce “Caché de red” a 500 ms. RTMP puro entrega latencia sub-3s — si aún excede eso, el problema es el reproductor, no el servidor.

Próximos pasos

Con el servidor RTMP funcionando, vale la pena considerar:

  • Añadir HLS para navegador: el bloque hls on en nginx-rtmp expone el stream como segmentos .ts consumibles por hls.js — necesario para un reproductor HTML5 en tu sitio.
  • Configurar grabación automática: la directiva record all guarda cada directo como FLV en /var/recordings, útil para retención y reproducción bajo demanda.
  • Retransmitir a Twitch/YouTube en paralelo: la directiva push rtmp://... dentro de la application reenvía el stream a otros destinos sin coste extra de subida desde OBS.
  • Endurecer con RTMPS vía stunnel: para exponer la publicación públicamente sin texto plano, stunnel delante de nginx-rtmp termina TLS en el puerto 1936.
  • Migrar a VPS dedicada a streaming: si pasas de 50 espectadores simultáneos o quieres entregar 4K, la CPU se convierte en cuello de botella en el transcoding. Una VPS Hostini con vCPU dedicada y enlace de 1 Gbps simétrico soporta bastante más carga que un servidor compartido.

Preguntas frecuentes

¿Cuál es la diferencia entre RTMP y RTMPS para OBS?

RTMP corre en texto plano en el puerto 1935; RTMPS añade TLS por encima, normalmente en el 443 o 1936. OBS Studio soporta ambos — RTMPS exige certificado válido en el servidor (Let's Encrypt lo resuelve) y configuración de stunnel o proxy TLS, ya que el módulo nginx-rtmp no habla TLS nativamente. Para producción expuesta a internet, prefiere RTMPS.

¿Cuánto ancho de banda necesito para transmitir 1080p60 desde OBS?

En h.264 con bitrate de 6.000 kbps (estándar de Twitch para 1080p60), consumes ~750 KB/s de subida continua. Multiplica por el número de espectadores si el servidor va a redistribuir — 10 espectadores simultáneos en 1080p60 ya son 7.5 MB/s de salida. Dimensiona la VPS pensando en subida, no en bajada.

¿Puedo usar el mismo servidor RTMP para grabar y retransmitir al mismo tiempo?

Sí. El módulo nginx-rtmp permite combinar directivas `record` y `push` en la misma `application` — grabas el stream en disco como FLV y simultáneamente lo reenvías a Twitch, YouTube u otro endpoint. Es útil para tener respaldo local de la transmisión sin coste extra de banda de OBS.

¿Por qué mi directo en OBS da 'failed to connect to server'?

Tres causas comunes: puerto 1935 bloqueado en el firewall de la VPS (ufw o iptables), nginx-rtmp no está escuchando en la interfaz pública (verifica `ss -tlnp | grep 1935`), o la stream key tiene caracteres especiales que OBS escapa. Prueba primero con `telnet IP 1935` desde tu máquina — si conecta, el problema es la configuración de OBS.

¿Se puede entregar el directo en HTML5 sin Flash?

Sí, pero RTMP puro no corre en navegador moderno. La solución estándar es convertir a HLS en el propio nginx — añade `hls on; hls_path /tmp/hls;` en la application RTMP y sirve el directorio vía bloque HTTP. El reproductor en el sitio usa hls.js o video.js apuntando al `.m3u8`. La latencia sube de ~2s (RTMP) a ~10-20s (HLS), lo cual es normal.

¿La stream key tiene que ser secreta incluso en servidor propio?

Sí. Quien tenga la stream key puede publicar contenido en tu servidor si no restringes publish por IP o token. Usa la directiva `allow publish` con IPs específicas, o implementa autenticación vía callback `on_publish` hacia un endpoint HTTP que valide el token antes de aceptar el stream.

Temas:
Próximos pasos Infraestructura optimizada para transmisión en vivo, grabación y VOD.Monta tu servidor de streaming en Hostini →
¿Te resultó útil este tutorial?
Hablar por WhatsApp