RTMP Streaming Server con OBS y Nginx

La transmisión de video en vivo es algo cada vez más popular en Internet y plataformas como Twitch o YouTube proporcionan una infraestructura para consumir interminables horas de medios en vivo y grabados. Si bien estos servicios proporcionan una solución básica de forma gratuita, contienen contenido generalmente detrás de anuncios sin una suscripción paga. Para tener un control total sobre sus contenidos y gracias a las soluciones de código abierto, es fácil configurar un servidor de transmisión en vivo que utilice el protocolo RTMP.

Así que manos a la obra:

apt update && apt upgrade -y
apt install build-essential libpcre3 libpcre3-dev libssl-dev nginx libnginx-mod-rtmp ffmpeg -y

Editamos el archivo de configuración de nginx y colocamos esta sección al final.

rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                notify_method get;

                application live {
                             on_publish http://localhost/auth;
                             live on;
                             #Si quieres grabar cambia "record" a "all"
                             record off;
                             #Se define el directorio para grabar
                             record_path /var/www/html/recordings;
                             record_unique on;
                             #Se define canal de transmision
                             push rtmp://localhost/youtube;
                }
                # YouTube Stream Application  
                      application youtube {
                          live on;
                          record off;
                          #Only allow localhost to publish
                          allow publish 127.0.0.1;
                          deny publish all;
                          # Push URL with the YouTube stream key
                          push rtmp://a.rtmp.youtube.com/live2/<TU_LLAVE_API>;
                      }
        }
}

Creamos el directorio de grabaciones:

mkdir -p /var/www/html/recordings
chown -R www-data:www-data /var/www/html/recordings/

Se configura el canal de transmisión hacia nginx

nano /etc/nginx/sites-enabled/default

En la sección «server» después de definir los puertos «listen» debe ir lo siguiente:

location /auth {
        if ($arg_pwd = 'una_contraseña_evitar_simbolos') {
            return 200;
            }
            return 401;
}

Y reiniciamos el servicio nginx:

systemctl restart nginx.service

Configurando OBS con nuestro servidor NGINX

En la sección Controles de la interfaz, haga clic en «Ajustes» o «Configuración» para ingresar a la interfaz de configuración de OBS.

Ingrese la pestaña «Emisión» e ingrese la Información sobre su instancia de transmisión:

  • Servicio: Personalizado
  • Server: rtmp://ip_publica_servidor/live
  • Clave de transmisión: nombre_stream?pwd=una_contraseña_evitar_simbolos

Guarde la configuración y configure su escena en OBS Studio.

Cuando esté listo, comience a transmitir al servidor haciendo clic en Iniciar transmisión en la sección Controles de OBS.

Configurar canales MultiStreaming

Abrir el archivo de configuración de nginx:

nano /etc/nginx/nginx.conf

Buscar la sección «Stream Application» y ajustar URL’s y API_KEYS según corresponda:

# Youtube Stream Application  
application youtube {
  live on;
  record off;
  #Only allow localhost to publish
  allow publish 127.0.0.1;
  deny publish all;
  # Push URL with the YouTube stream key
  push rtmp://a.rtmp.youtube.com/live2/<TU_LLAVE_API>;
}

Agregar canales extra (si es necesario), en caso contrario ir al final para reiniciar servicios

apt-get install stunnel4 -y
sudo nano /etc/default/stunnel4

Aquí cambia ENABLE de 0 a 1

ENABLED=1

Editamos ahora el stunnel

nano /etc/stunnel/stunnel.conf

Y colocamos lo siguiente:

pid = /var/run/stunnel4/stunnel.pid
output = /var/log/stunnel4/stunnel.log


setuid = stunnel4
setgid = stunnel4

# https://www.stunnel.org/faq.html
socket = r:TCP_NODELAY=1
socket = l:TCP_NODELAY=1

debug = 4

[fb-live]
client = yes
accept = 127.0.0.1:1936
connect = live-api-s.facebook.com:443
verifyChain = no

Iniciamos servicios:

systemctl enable stunnel4.service
systemctl restart stunnel4.service
systemctl status stunnel4.service

Agregamos el canal de Facebook por rtmps

nano /etc/nginx/nginx.conf

En la sección donde se define la aplicación «live» se debe adicionar:

push rtmp://localhost/facebook;

Y debajo de la aplicación ya creada, en este caso YouTube, después de que finaliza la sección ponemos:

# Facebook Stream Application  
application facebook {
  live on;
  record off;

  #Only allow localhost to publish
  allow publish 127.0.0.1;
  deny publish all;
  # Push URL with the Facebook stream key
  push rtmp://127.0.0.1:1936/rtmp/<facebook_stream_key>;
}

Reiniciamos servicio de nginx:

systemctl restart nginx.service
systemctl status nginx.service

Desde un nivel alto, Stunnel y NGINX ahora deberían funcionar así:

 ____________        ____________        ____________        ____________  
| Streaming  |      |            |      |            |      |  Facebook  | 
|   Source   | ---> |   NGINX    | ---> |   stunnel  | ---> |    Live    | 
|____________|      |____________|      |____________|      |____________|

 

Si requieres adicionar más canales de Streaming, puedes hacerlo del mismo modo siguiendo el esquema anterior. Al final ya estarás transmitiendo desde OBS pasando por un proxy NGINX hacia los canales necesarios:

Se puede probar el Live en Streaming por ejemplo usando VLC, colocando la URL de nuestro servidor:

rtmp://ip_servidor_o_dominio/live/nombre_stream

En mi caso para la prueba era:

rtmp://streaming.flisolbogota.org/live/flisol