Saltar a contenido

rtmp: Módulo RTMP de NGINX

Instalación

Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:

  • RedHat Enterprise Linux 7, 8, 9 y 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 y Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-rtmp
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-rtmp

Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:

load_module modules/ngx_rtmp_module.so;

Este documento describe nginx-module-rtmp v1.2.2 lanzado el 05 de julio de 2025.


nginx-rtmp-module

Blog del proyecto

http://nginx-rtmp.blogspot.com

Manual de Wiki

https://github.com/arut/nginx-rtmp-module/wiki/Directives

Grupo de Google

https://groups.google.com/group/nginx-rtmp

https://groups.google.com/group/nginx-rtmp-ru (Ruso)

Características

  • Transmisión en vivo RTMP/HLS/MPEG-DASH

  • Video bajo demanda RTMP FLV/MP4, reproduciendo desde el sistema de archivos local o HTTP

  • Soporte para retransmisión de flujos para streaming distribuido: modelos push y pull

  • Grabación de flujos en múltiples FLVs

  • Soporte para H264/AAC

  • Transcodificación en línea con FFmpeg

  • Callbacks HTTP (publicar/reproducir/grabar/actualizar, etc.)

  • Ejecución de programas externos en ciertos eventos (exec)

  • Módulo de control HTTP para grabar audio/video y desconectar clientes

  • Técnicas avanzadas de almacenamiento en búfer para mantener las asignaciones de memoria al mínimo nivel para una transmisión más rápida y bajo consumo de memoria

  • Comprobado que funciona con Wirecast, FMS, Wowza, JWPlayer, FlowPlayer, StrobeMediaPlayback, ffmpeg, avconv, rtmpdump, flvstreamer y muchos más

  • Estadísticas en XML/XSL en formato legible por máquina y humano

  • Linux/FreeBSD/MacOS/Windows

Limitaciones de Windows

El soporte para Windows es limitado. Estas características no son compatibles:

  • execs
  • pulls estáticos
  • auto_push

Formato de URL RTMP

rtmp://rtmp.example.com/app[/name]

app - debe coincidir con uno de los bloques application {} en la configuración

name - interpretado por cada aplicación puede estar vacío

Transmisión en vivo con múltiples trabajadores

El módulo soporta transmisión en vivo con múltiples trabajadores a través de la transmisión automática a los trabajadores de nginx. Esta opción se activa con la directiva rtmp_auto_push.

Ejemplo de nginx.conf

rtmp {

    server {

        listen 1935;

        chunk_size 4000;

        # Modo TV: un publicador, muchos suscriptores
        application mytv {

            # habilitar transmisión en vivo
            live on;

            # grabar los primeros 1K del flujo
            record all;
            record_path /tmp/av;
            record_max_size 1K;

            # añadir la marca de tiempo actual a cada flv
            record_unique on;

            # publicar solo desde localhost
            allow publish 127.0.0.1;
            deny publish all;

            #allow play all;
        }

        # Transcodificación (se necesita ffmpeg)
        application big {
            live on;

            # En cada flujo publicado ejecutar este comando (ffmpeg)
            # con sustituciones: $app/${app}, $name/${name} para el nombre de la aplicación y del flujo.
            #
            # Esta llamada a ffmpeg recibe el flujo de esta aplicación y
            # reduce la resolución a 32x32. El flujo se publica en
            # la aplicación 'small' (ver abajo) bajo el mismo nombre.
            #
            # ffmpeg puede hacer cualquier cosa con el flujo como transcodificación de video/audio,
            # redimensionamiento, alteración de parámetros de contenedor/códec, etc.
            #
            # Se pueden especificar múltiples líneas exec.

            exec ffmpeg -re -i rtmp://localhost:1935/$app/$name -vcodec flv -acodec copy -s 32x32
                        -f flv rtmp://localhost:1935/small/${name};
        }

        application small {
            live on;
            # Video con resolución reducida llega aquí desde ffmpeg
        }

        application webcam {
            live on;

            # Transmitir desde la webcam local
            exec_static ffmpeg -f video4linux2 -i /dev/video0 -c:v libx264 -an
                               -f flv rtmp://localhost:1935/webcam/mystream;
        }

        application mypush {
            live on;

            # Cada flujo publicado aquí
            # se envía automáticamente a
            # estas dos máquinas
            push rtmp1.example.com;
            push rtmp2.example.com:1934;
        }

        application mypull {
            live on;

            # Extraer todos los flujos de la máquina remota
            # y reproducir localmente
            pull rtmp://rtmp3.example.com pageUrl=www.example.com/index.html;
        }

        application mystaticpull {
            live on;

            # La extracción estática se inicia al iniciar nginx
            pull rtmp://rtmp4.example.com pageUrl=www.example.com/index.html name=mystream static;
        }

        # video bajo demanda
        application vod {
            play /var/flvs;
        }

        application vod2 {
            play /var/mp4s;
        }

        # Muchos publicadores, muchos suscriptores
        # sin comprobaciones, sin grabación
        application videochat {

            live on;

            # Las siguientes notificaciones reciben todas
            # las variables de sesión así como
            # argumentos de llamada particulares en la solicitud HTTP POST

            # Hacer solicitud HTTP y usar el código de retorno HTTP
            # para decidir si permitir la publicación
            # desde esta conexión o no
            on_publish http://localhost:8080/publish;

            # Lo mismo con la reproducción
            on_play http://localhost:8080/play;

            # Fin de publicación/reproducción (se repite al desconectar)
            on_done http://localhost:8080/done;

            # Todas las notificaciones mencionadas anteriormente reciben
            # argumentos estándar de connect() así como
            # los de play/publish. Si se envían argumentos
            # con sintaxis estilo GET para reproducir y publicar
            # estos también se incluyen.
            # Ejemplo de URL:
            #   rtmp://localhost/myapp/mystream?a=b&c=d

            # grabar 10 fotogramas clave de video (sin audio) cada 2 minutos
            record keyframes;
            record_path /tmp/vc;
            record_max_frames 10;
            record_interval 2m;

            # Notificación asíncrona sobre un flv grabado
            on_record_done http://localhost:8080/record_done;

        }

        # HLS

        # Para que HLS funcione, por favor crea un directorio en tmpfs (/tmp/hls aquí)
        # para los fragmentos. El contenido del directorio se sirve a través de HTTP (ver
        # sección http{} en la configuración)
        #
        # El flujo entrante debe estar en H264/AAC. Para iPhones usa el perfil H264
        # de base (ver ejemplo de ffmpeg).
        # Este ejemplo crea un flujo RTMP de una película lista para HLS:
        #
        # ffmpeg -loglevel verbose -re -i movie.avi  -vcodec libx264
        #    -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1
        #    -f flv rtmp://localhost:1935/hls/movie
        #
        # Si necesitas transcodificar un flujo en vivo, usa la función 'exec'.
        #
        application hls {
            live on;
            hls on;
            hls_path /tmp/hls;
        }

        # MPEG-DASH es similar a HLS

        application dash {
            live on;
            dash on;
            dash_path /tmp/dash;
        }
    }
}

# HTTP puede ser utilizado para acceder a estadísticas RTMP
http {

    server {

        listen      8080;

        # Esta URL proporciona estadísticas RTMP en XML
        location /stat {
            rtmp_stat all;

            # Usa esta hoja de estilo para ver XML como página web
            # en el navegador
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            # Hoja de estilo XML para ver estadísticas RTMP.
            # Copia stat.xsl donde quieras
            # y pon la ruta completa del directorio aquí
            root /path/to/stat.xsl/;
        }

        location /hls {
            # Servir fragmentos HLS
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
            add_header Cache-Control no-cache;
        }

        location /dash {
            # Servir fragmentos DASH
            root /tmp;
            add_header Cache-Control no-cache;
        }
    }
}

Ejemplo de transmisión con múltiples trabajadores

rtmp_auto_push on;

rtmp {
    server {
        listen 1935;

        application mytv {
            live on;
        }
    }
}

GitHub

Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-rtmp.