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

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Instalación y configuración de Nginx-RTMP
  • Paso 2: Envío de video a su servidor RTMP
  • Paso 3: Transmisión de video a su servidor a través de OBS (opcional)
  • Paso 4: agregar monitoreo a su configuración (opcional)
  • Paso 5: creación de transmisiones modernas para navegadores (opcional)
  • Conclusió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:

    1. sudo apt update
    2. 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 nanosu editor de texto favorito, abra el archivo de configuración principal de Nginx, /etc/nginx/nginx.confy agregue este bloque de configuración al final del archivo:

    1. 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 1935significa que RTMP estará escuchando conexiones en el puerto 1935, que es estándar.
    • chunk_size 4096significa que RTMP enviará datos en bloques de 4 KB, lo que también es estándar.
    • allow publish 127.0.0.1y deny publish allsignifica que el servidor solo permitirá que se publiquen videos desde el mismo servidor, para evitar que otros usuarios publiquen sus propias transmisiones.
    • application livedefine un bloque de aplicación que estará disponible en la /liveruta URL.
    • live onHabilita 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 offdeshabilita 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, Yy 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 ufwcomo parte de la configuración inicial de su servidor, ejecute el siguiente comando.

    1. sudo ufw allow 1935/tcp

    Ahora puedes recargar Nginx con tus cambios:

    1. 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:

    1. sudo apt install python3-pip

    A continuación, utilice pippara instalar youtube-dl:

    1. sudo pip install youtube-dl

    Ahora puedes youtube-dldescargar un vídeo de YouTube. Si no tienes ninguno en mente, prueba este vídeo que presenta la plataforma de aplicaciones de DigitalOcean:

    1. youtube-dl https://www.youtube.com/watch?v=iom_nhYQIYk

    Verá una salida que youtube-dlcombina 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:

    1. sudo apt install ffmpeg

    Y usa ffmpegpara enviarlo a tu servidor RTMP:

    1. 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 ffmpegcomando realiza algunas acciones para preparar el video para un formato compatible con la transmisión. No se trata de un ffmpegtutorial, por lo que no es necesario que lo examines con demasiado detalle, pero puedes entender las distintas opciones de la siguiente manera:

    • -reespecifica 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:vestá configurado en copy, lo que significa que estás copiando el formato de video que obtuviste de YouTube de forma nativa.
    • -c:atiene otros parámetros, a saber aac -ar 44100 -ac 1, porque necesita volver a muestrear el audio a un formato compatible con RTMP. aaces un códec de audio ampliamente compatible, 44100hz es una frecuencia común y -ac 1especifica la primera versión de la especificación AAC para fines de compatibilidad.
    • -f flvenvuelve el vídeo en un flvcontenedor de formato para una máxima compatibilidad con RTMP.

    El video se envía rtmp://localhost/live/streamporque definió el livebloque de configuración en el Paso 1 y streames una URL elegida arbitrariamente para este video.

    Nota: Puede obtener más información sobre ffmpeglas opciones en ffmprovisr , un catálogo de ejemplos de comandos mantenido por la comunidad ffmpeg, o consultar la documentación oficial .

    Mientras ffmpegse 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 ffmpegla 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= 25incrementos exactos.

    Mientras ffmpeg se está ejecutando, puedes conectarte a tu transmisión RTMP desde un reproductor de video. Si tienes VLC, mpvu 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/streamffmpeg-stream_loop -1ffmpeg

    Nota: También puedes transmitir directamente a, por ejemplo, Facebook Live ffmpegsin necesidad de usar Nginx-RTMP en absoluto, reemplazando rtmp://localhost/live/streamen tu ffmpegcomando 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-keyrtmp://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 ffmpeges 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_streames 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.confy agrega una entrada adicional allow publishpara 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:

    1. 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:

    1. sudo systemctl reload nginx.service

    ¡Ahora deberías poder cerrar el menú de configuración de OBS y hacer clic Start Streamingdesde 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.confarchivo principal, Nginx le permite agregar configuraciones por sitio a archivos individuales en un subdirectorio llamado sites-available/. En este caso, creará uno llamado rtmp:

    1. 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.xslarchivo 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-rtmpbiblioteca que instaló anteriormente, pero viene comprimido de manera predeterminada, por lo que deberá descomprimirlo y colocarlo en el /var/www/html/rtmpdirectorio 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/rtmpdirectorio y luego descomprime el stat.xsl.gzarchivo con los siguientes comandos:

    1. sudo mkdir /var/www/html/rtmp
    2. 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 listendirectiva 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:

    1. 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:

    1. sudo ln -s /etc/nginx/sites-available/rtmp /etc/nginx/sites-enabled/rtmp

    Ahora puedes volver a cargar Nginx para procesar tus cambios:

    1. 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.

    Paso 5: creación de transmisiones modernas para navegadores (opcional)

    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 rtmpbloque en su nginx.confarchivo. Ábralo /etc/nginx/nginx.confcon nanoo con su editor preferido y luego agregue las siguientes directivas resaltadas:

    1. 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:

    1. 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:

    1. sudo ufw allow 8088/tcp

    Por último, crea un streamdirectorio 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:

    1. sudo mkdir /var/www/html/stream

    Recargue Nginx nuevamente:

    1. 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.m3u8http://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.

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion