Cómo configurar un servidor de transmisión de vídeo con Nginx-RTMP en Ubuntu 20.04

Introducción
Existen muchos casos de uso para la transmisión de video. Los proveedores de servicios como Twitch son muy populares para gestionar los aspectos de descubrimiento web y gestión de la comunidad de la transmisión, y el software gratuito como OBS Studio se usa ampliamente para combinar superposiciones de video de múltiples fuentes de transmisión diferentes en tiempo real. Si bien estas plataformas son muy potentes, en algunos casos es posible que desee poder alojar una transmisión que no dependa de otros proveedores de servicios.
En este tutorial, aprenderá a configurar el servidor web Nginx para alojar una transmisión de video RTMP independiente que se pueda vincular y ver en diferentes aplicaciones. RTMP, el protocolo de mensajería en tiempo real , define los fundamentos de la mayoría de las transmisiones de video por Internet. También aprenderá a alojar transmisiones HLS y DASH que admiten plataformas más modernas que utilizan la misma tecnología.
Prerrequisitos
Para completar esta guía, necesitarás:
- Un servidor Ubuntu 20.04 y un usuario no root con privilegios sudo. Puede obtener más información sobre cómo configurar un usuario con estos privilegios en nuestra guía Configuración inicial del servidor con Ubuntu 20.04 .
- Nginx instalado, siguiendo Cómo instalar Nginx en Ubuntu 20.04 .
En este tutorial se utilizará el nombre de dominio de reserva your_domain para las URL y los nombres de host. Sustitúyalo por su propio nombre de dominio o dirección IP a medida que avance en el tutorial.
Paso 1: Instalación y configuración de Nginx-RTMP
La mayoría de las herramientas de streaming modernas admiten el protocolo RTMP, que define los parámetros básicos de una transmisión de vídeo por Internet. El servidor web Nginx incluye un módulo que permite proporcionar una transmisión RTMP con una configuración mínima desde una URL dedicada, al igual que proporciona acceso HTTP a páginas web de forma predeterminada. El módulo RTMP de Nginx no está incluido automáticamente con Nginx, pero en Ubuntu 20.04 y la mayoría de las demás distribuciones de Linux puedes instalarlo como un paquete adicional.
Comience ejecutando los siguientes comandos como usuario no root para actualizar sus listados de paquetes e instalar el módulo Nginx:
- sudo apt update
- sudo apt install libnginx-mod-rtmp
La instalación del módulo no comenzará a proporcionar una transmisión automáticamente. Deberá agregar un bloque de configuración a su archivo de configuración de Nginx que defina dónde y cómo estará disponible la transmisión.
Usando nano
su editor de texto favorito, abra el archivo de configuración principal de Nginx, /etc/nginx/nginx.conf
y agregue este bloque de configuración al final del archivo:
- sudo nano /etc/nginx/nginx.conf
/etc/nginx/nginx.conf
. . .rtmp { server { listen 1935; chunk_size 4096; allow publish 127.0.0.1; deny publish all; application live { live on; record off; } }}
listen 1935
significa que RTMP estará escuchando conexiones en el puerto 1935, que es estándar.chunk_size 4096
significa que RTMP enviará datos en bloques de 4 KB, lo que también es estándar.allow publish 127.0.0.1
ydeny publish all
significa que el servidor solo permitirá que se publiquen videos desde el mismo servidor, para evitar que otros usuarios publiquen sus propias transmisiones.application live
define un bloque de aplicación que estará disponible en la/live
ruta URL.live on
Habilita el modo en vivo para que varios usuarios puedan conectarse a su transmisión simultáneamente, un supuesto básico de la transmisión de video.record off
deshabilita la funcionalidad de grabación de Nginx-RTMP, de modo que todas las transmisiones no se guarden por separado en el disco de forma predeterminada.
Guarde y cierre el archivo. Si está utilizando nano
, presione Ctrl+X
, luego, cuando se le solicite, Y
y Enter.
Esto proporciona el comienzo de la configuración de RTMP. De manera predeterminada, escucha en el puerto 1935
, lo que significa que deberá abrir ese puerto en su firewall. Si realizó la configuración ufw
como parte de la configuración inicial de su servidor, ejecute el siguiente comando.
- sudo ufw allow 1935/tcp
Ahora puedes recargar Nginx con tus cambios:
- sudo systemctl reload nginx.service
Ahora debería tener un servidor RTMP en funcionamiento. En la siguiente sección, abordaremos la transmisión de video a su servidor RTMP desde fuentes locales y remotas.
Paso 2: Envío de video a su servidor RTMP
Existen varias formas de enviar video a su servidor RTMP. Una opción es usar ffmpeg
, una popular utilidad de línea de comandos de audio y video, para reproducir un archivo de video directamente en su servidor. Si aún no tiene un archivo de video en el servidor, puede descargar uno usando youtube-dl
, una herramienta de línea de comandos para capturar videos de plataformas de transmisión como YouTube. Para usar youtube-dl
, también necesitará una instalación de Python actualizada en su servidor.
Primero, instale Python y su administrador de paquetes pip
:
- sudo apt install python3-pip
A continuación, utilice pip
para instalar youtube-dl
:
- sudo pip install youtube-dl
Ahora puedes youtube-dl
descargar un vídeo de YouTube. Si no tienes ninguno en mente, prueba este vídeo que presenta la plataforma de aplicaciones de DigitalOcean:
- youtube-dl https://www.youtube.com/watch?v=iom_nhYQIYk
Verá una salida que youtube-dl
combina las transmisiones de video y audio que está descargando en un solo archivo: esto es normal.
Output[youtube] iom_nhYQIYk: Downloading webpageWARNING: Requested formats are incompatible for merge and will be merged into mkv.[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4[download] 100% of 32.82MiB in 08:40[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm[download] 100% of 1.94MiB in 00:38[ffmpeg] Merging formats into "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv"Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4 (pass -k to keep)Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm (pass -k to keep)
Ahora deberías tener un archivo de video en tu directorio actual con un título como Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv
. Para transmitirlo, deberás instalar ffmpeg
:
- sudo apt install ffmpeg
Y usa ffmpeg
para enviarlo a tu servidor RTMP:
- ffmpeg -re -i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv" -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream
Este ffmpeg
comando realiza algunas acciones para preparar el video para un formato compatible con la transmisión. No se trata de un ffmpeg
tutorial, por lo que no es necesario que lo examines con demasiado detalle, pero puedes entender las distintas opciones de la siguiente manera:
-re
especifica que la entrada se leerá a su velocidad de cuadros nativa.-i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv"
especifica la ruta a nuestro archivo de entrada .-c:v
está configurado encopy
, lo que significa que estás copiando el formato de video que obtuviste de YouTube de forma nativa.-c:a
tiene otros parámetros, a saberaac -ar 44100 -ac 1
, porque necesita volver a muestrear el audio a un formato compatible con RTMP.aac
es un códec de audio ampliamente compatible,44100
hz es una frecuencia común y-ac 1
especifica la primera versión de la especificación AAC para fines de compatibilidad.-f flv
envuelve el vídeo en unflv
contenedor de formato para una máxima compatibilidad con RTMP.
El video se envía rtmp://localhost/live/stream
porque definió el live
bloque de configuración en el Paso 1 y stream
es una URL elegida arbitrariamente para este video.
Nota: Puede obtener más información sobre ffmpeg
las opciones en ffmprovisr , un catálogo de ejemplos de comandos mantenido por la comunidad ffmpeg
, o consultar la documentación oficial .
Mientras ffmpeg
se transmite el video, se imprimirán los códigos de tiempo:
Outputframe= 127 fps= 25 q=-1.0 size= 405kB time=00:00:05.00 bitrate= 662.2kbits/s speed=frame= 140 fps= 25 q=-1.0 size= 628kB time=00:00:05.52 bitrate= 931.0kbits/s speed=frame= 153 fps= 25 q=-1.0 size= 866kB time=00:00:06.04 bitrate=1173.1kbits/s speed=
Esta es ffmpeg
la salida estándar. Si estuviera convirtiendo un video a un formato diferente, esto podría ser útil para comprender la eficiencia con la que se está remuestreando el video, pero en este caso, solo desea ver que se esté reproduciendo de manera consistente. Con este video de muestra, debería obtener fps= 25
incrementos exactos.
Mientras ffmpeg se está ejecutando, puedes conectarte a tu transmisión RTMP desde un reproductor de video. Si tienes VLC
, mpv
u otro reproductor multimedia instalado localmente, deberías poder ver tu transmisión abriendo la URL en tu reproductor multimedia. Tu transmisión finalizará después de que haya terminado de reproducir el video. Si quieres que siga reproduciéndose indefinidamente, puedes agregar al comienzo de tu comando.rtmp://your_domain/live/stream
ffmpeg
-stream_loop -1
ffmpeg
Nota: También puedes transmitir directamente a, por ejemplo, Facebook Live ffmpeg
sin necesidad de usar Nginx-RTMP en absoluto, reemplazando rtmp://localhost/live/stream
en tu ffmpeg
comando con . YouTube usa URL como . Otros proveedores de transmisión que pueden consumir transmisiones RTMP deberían comportarse de manera similar.rtmps://live-api-s.facebook.com:443/rtmp/your-facebook-stream-key
rtmp://a.rtmp.youtube.com/live2
Ahora que ha aprendido a transmitir fuentes de video estáticas desde la línea de comandos, aprenderá a transmitir video desde fuentes dinámicas usando OBS en una computadora de escritorio.
Paso 3: Transmisión de video a su servidor a través de OBS (opcional)
La transmisión por secuencias ffmpeg
es conveniente cuando tienes un video preparado que quieres reproducir, pero la transmisión en vivo puede ser mucho más dinámica. El software más popular para la transmisión en vivo es OBS , u Open Broadcaster Software: es gratuito, de código abierto y muy potente.
OBS es una aplicación de escritorio y se conectará a su servidor desde su computadora local.
Después de instalar OBS, configurarlo significa personalizar cuáles de las ventanas de su escritorio y fuentes de audio desea agregar a su transmisión y luego agregar credenciales para un servicio de transmisión. Este tutorial no cubrirá su configuración de transmisión, ya que depende de sus preferencias y, de manera predeterminada, puede tener una demostración funcional simplemente transmitiendo todo su escritorio. Para configurar las credenciales de su servicio de transmisión, abra el menú de configuración de OBS, navegue hasta la opción Transmisión e ingrese las siguientes opciones:
Streaming Service: CustomServer: rtmp://your_domain/livePlay Path/Stream Key: obs_stream
obs_stream
es una ruta elegida arbitrariamente; en este caso, su video estaría disponible en . No necesita habilitar la autenticación, pero sí debe agregar una entrada adicional a la lista blanca de IP que configuró en el Paso 1.rtmp://your_domain/live/obs_stream
De vuelta en el servidor, abre el archivo de configuración principal de Nginx /etc/nginx/nginx.conf
y agrega una entrada adicional allow publish
para tu dirección IP local. Si no conoces tu dirección IP local, lo mejor es que vayas a un sitio como What’s my IP, que te puede indicar desde dónde accediste a ella:
- sudo nano /etc/nginx/nginx.conf
/etc/nginx/nginx.conf
. . . allow publish 127.0.0.1; allow publish your_local_ip_address; deny publish all;. . .
Guarde y cierre el archivo, luego vuelva a cargar Nginx:
- sudo systemctl reload nginx.service
¡Ahora deberías poder cerrar el menú de configuración de OBS y hacer clic Start Streaming
desde la interfaz principal! Intenta ver tu transmisión en un reproductor multimedia como antes. Ahora que has visto los aspectos básicos de la transmisión de video en acción, puedes agregar algunas otras funciones a tu servidor para que esté más preparado para la producción.
Paso 4: agregar monitoreo a su configuración (opcional)
Ahora que tiene Nginx configurado para transmitir video mediante el módulo Nginx-RTMP, un próximo paso común es habilitar la página de estadísticas RTMP. En lugar de agregar más y más detalles de configuración a su nginx.conf
archivo principal, Nginx le permite agregar configuraciones por sitio a archivos individuales en un subdirectorio llamado sites-available/
. En este caso, creará uno llamado rtmp
:
- sudo nano /etc/nginx/sites-available/rtmp
Añade el siguiente contenido:
/etc/nginx/sitios-disponibles/rtmp
server { listen 8080; server_name localhost; # rtmp stat location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root /var/www/html/rtmp; } # rtmp control location /control { rtmp_control all; }}
Guarde y cierre el archivo. El stat.xsl
archivo de este bloque de configuración se utiliza para diseñar y mostrar una página de estadísticas RTMP en su navegador. Lo proporciona la libnginx-mod-rtmp
biblioteca que instaló anteriormente, pero viene comprimido de manera predeterminada, por lo que deberá descomprimirlo y colocarlo en el /var/www/html/rtmp
directorio para que coincida con la configuración anterior. Tenga en cuenta que puede encontrar información adicional sobre cualquiera de estas opciones en la documentación de Nginx-RTMP .
Crea el /var/www/html/rtmp
directorio y luego descomprime el stat.xsl.gz
archivo con los siguientes comandos:
- sudo mkdir /var/www/html/rtmp
- sudo gunzip -c /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl.gz /var/www/html/rtmp/stat.xsl
Por último, para acceder a la página de estadísticas que has añadido, tendrás que abrir otro puerto en tu firewall. En concreto, la listen
directiva está configurada con port 8080
, por lo que tendrás que añadir una regla para acceder a Nginx en ese puerto. Sin embargo, es probable que no quieras que otros puedan acceder a tu página de estadísticas, por lo que es mejor permitirlo solo para tu propia dirección IP. Ejecuta el siguiente comando:
- sudo ufw allow from your_ip_address to any port http-alt
A continuación, deberá activar esta nueva configuración. La convención de Nginx es crear enlaces simbólicos (como accesos directos) desde archivos a sites-available/
otra carpeta llamada sites-enabled/
según decida habilitarlos o deshabilitarlos. Utilice rutas completas para mayor claridad y cree ese enlace:
- sudo ln -s /etc/nginx/sites-available/rtmp /etc/nginx/sites-enabled/rtmp
Ahora puedes volver a cargar Nginx para procesar tus cambios:
- sudo systemctl reload nginx.service
Ahora debería poder acceder a la página de estadísticas RTMP desde un navegador. Visite y actualice la página mientras transmite un video y observe cómo cambian las estadísticas de transmisión.http://your_domain:8080/stat
Ya ha visto cómo supervisar su transmisión de vídeo y enviarla a proveedores externos. En la sección final, aprenderá a enviarla directamente a un navegador sin utilizar plataformas de transmisión de terceros ni aplicaciones de reproducción multimedia independientes.
Como paso final, es posible que desee agregar compatibilidad con los protocolos de transmisión más nuevos para que los usuarios puedan transmitir videos desde su servidor mediante un navegador web directamente. Hay dos protocolos que puede usar para crear transmisiones de video basadas en HTTP: HLS de Apple y MPEG DASH . Ambos tienen ventajas y desventajas, por lo que probablemente desee admitir ambos.
El módulo Nginx-RTMP admite ambos estándares. Para agregar compatibilidad con HLS y DASH a su servidor, deberá modificar el rtmp
bloque en su nginx.conf
archivo. Ábralo /etc/nginx/nginx.conf
con nano
o con su editor preferido y luego agregue las siguientes directivas resaltadas:
- sudo nano /etc/nginx/nginx.conf
/etc/nginx/nginx.conf
. . .rtmp { server {. . . application live { live on; record off; hls on; hls_path /var/www/html/stream/hls; hls_fragment 3; hls_playlist_length 60; dash on; dash_path /var/www/html/stream/dash; } }}. . .
Guarde y cierre el archivo. A continuación, agregue lo siguiente al final de su sites-available/rtmp
:
- sudo nano /etc/nginx/sites-available/rtmp
/etc/nginx/sitios-disponibles/rtmp
. . .server { listen 8088; location / { add_header Access-Control-Allow-Origin *; root /var/www/html/stream; }}types { application/dash+xml mpd;}
Nota: El Access-Control-Allow-Origin *
encabezado habilita CORS , o uso compartido de recursos de origen cruzado , que está deshabilitado de manera predeterminada. Esto comunica a cualquier navegador web que acceda a los datos de su servidor que el servidor puede cargar recursos desde otros puertos o dominios. CORS es necesario para lograr la máxima compatibilidad con los clientes HLS y DASH , y es una opción de configuración común en muchas otras implementaciones web.
Guarde y cierre el archivo. Tenga en cuenta que está utilizando el puerto8088Aquí, que es otra opción arbitraria para este tutorial para evitar conflictos con cualquier servicio que pueda estar ejecutando en el puerto 80 o 443. También querrá abrir ese puerto en su firewall por ahora:
- sudo ufw allow 8088/tcp
Por último, crea un stream
directorio en la raíz de tu sitio web que coincida con el bloque de configuración, para que Nginx pueda generar los archivos necesarios para HLS y DASH:
- sudo mkdir /var/www/html/stream
Recargue Nginx nuevamente:
- sudo systemctl reload nginx
Ahora debería tener una transmisión HLS disponible en y una transmisión DASH disponible en . Estos puntos finales generarán los metadatos necesarios sobre su transmisión de video RTMP para admitir las API modernas.http://your_domain:8088/hls/stream.m3u8
http://your_domain:8088/dash/stream.mpd
Conclusión
Las opciones de configuración que utilizó en este tutorial están documentadas en la página Wiki RTMP de Nginx . Los módulos de Nginx suelen compartir una sintaxis común y exponen un conjunto muy amplio de opciones de configuración. Puede revisar su documentación para cambiar cualquiera de sus configuraciones desde aquí.
Casi toda la transmisión de video por Internet se implementa sobre RTMP, HLS y DASH, y al utilizar el enfoque que ha explorado en este tutorial, puede proporcionar su transmisión a través de otros servicios de transmisión o exponerla de cualquier otra manera que elija. A continuación, puede intentar configurar Nginx como un proxy inverso para que algunos de estos diferentes puntos finales de video estén disponibles como subdominios.
Deja una respuesta