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.