rtmp: Módulo RTMP do NGINX
Instalação
Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:
- RedHat Enterprise Linux 7, 8, 9 e 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 e 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
Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:
load_module modules/ngx_rtmp_module.so;
Este documento descreve o nginx-module-rtmp v1.2.2 lançado em 05 de julho de 2025.
nginx-rtmp-module
Blog do projeto
http://nginx-rtmp.blogspot.com
Manual da Wiki
https://github.com/arut/nginx-rtmp-module/wiki/Directives
Grupo do Google
https://groups.google.com/group/nginx-rtmp
https://groups.google.com/group/nginx-rtmp-ru (Russo)
Recursos
-
Streaming ao vivo RTMP/HLS/MPEG-DASH
-
Vídeo sob demanda RTMP FLV/MP4, reproduzindo do sistema de arquivos local ou HTTP
-
Suporte a retransmissão de stream para streaming distribuído: modelos de push e pull
-
Gravação de streams em múltiplos FLVs
-
Suporte a H264/AAC
-
Transcodificação online com FFmpeg
-
Callbacks HTTP (publicar/reproduzir/gravar/atualizar etc)
-
Execução de programas externos em certos eventos (exec)
-
Módulo de controle HTTP para gravação de áudio/vídeo e desconexão de clientes
-
Técnicas avançadas de buffer para manter alocações de memória em um nível mínimo para streaming mais rápido e baixo consumo de memória
-
Comprovado para funcionar com Wirecast, FMS, Wowza, JWPlayer, FlowPlayer, StrobeMediaPlayback, ffmpeg, avconv, rtmpdump, flvstreamer e muitos mais
-
Estatísticas em XML/XSL em formato legível por máquina e humano
-
Linux/FreeBSD/MacOS/Windows
Limitações do Windows
O suporte ao Windows é limitado. Esses recursos não são suportados
- execs
- pulls estáticos
- auto_push
Formato de URL RTMP
rtmp://rtmp.example.com/app[/name]
app - deve corresponder a um dos blocos application {} na configuração
name - interpretado por cada aplicação pode estar vazio
Streaming ao vivo com múltiplos trabalhadores
O módulo suporta streaming ao vivo com múltiplos trabalhadores através do envio automático de streams para os trabalhadores do nginx. Esta opção é ativada com a diretiva rtmp_auto_push.
Exemplo de nginx.conf
rtmp {
server {
listen 1935;
chunk_size 4000;
# Modo TV: um publicador, muitos assinantes
application mytv {
# habilitar streaming ao vivo
live on;
# gravar os primeiros 1K do stream
record all;
record_path /tmp/av;
record_max_size 1K;
# adicionar timestamp atual a cada flv
record_unique on;
# publicar apenas do localhost
allow publish 127.0.0.1;
deny publish all;
#allow play all;
}
# Transcodificação (ffmpeg necessário)
application big {
live on;
# Em cada stream publicado, execute este comando (ffmpeg)
# com substituições: $app/${app}, $name/${name} para nome da aplicação e do stream.
#
# Esta chamada do ffmpeg recebe o stream desta aplicação &
# reduz a resolução para 32x32. O stream é publicado na
# aplicação 'small' (veja abaixo) sob o mesmo nome.
#
# O ffmpeg pode fazer qualquer coisa com o stream, como
# transcodificação de vídeo/áudio, redimensionamento, alteração de parâmetros de contêiner/código etc
#
# Múltiplas linhas exec podem ser especificadas.
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;
# Vídeo com resolução reduzida vem aqui do ffmpeg
}
application webcam {
live on;
# Stream da 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 stream publicado aqui
# é automaticamente enviado para
# essas duas máquinas
push rtmp1.example.com;
push rtmp2.example.com:1934;
}
application mypull {
live on;
# Puxar todos os streams de uma máquina remota
# e reproduzir localmente
pull rtmp://rtmp3.example.com pageUrl=www.example.com/index.html;
}
application mystaticpull {
live on;
# Pull estático é iniciado na inicialização do nginx
pull rtmp://rtmp4.example.com pageUrl=www.example.com/index.html name=mystream static;
}
# vídeo sob demanda
application vod {
play /var/flvs;
}
application vod2 {
play /var/mp4s;
}
# Muitos publicadores, muitos assinantes
# sem verificações, sem gravação
application videochat {
live on;
# As seguintes notificações recebem todas
# as variáveis de sessão, bem como
# argumentos de chamada específicos na solicitação HTTP POST
# Faça uma solicitação HTTP & use o código de retorno HTTP
# para decidir se permite a publicação
# desta conexão ou não
on_publish http://localhost:8080/publish;
# O mesmo com a reprodução
on_play http://localhost:8080/play;
# Fim da publicação/reprodução (repete na desconexão)
on_done http://localhost:8080/done;
# Todas as notificações mencionadas acima recebem
# argumentos padrão de connect() assim como
# os de play/publish. Se quaisquer argumentos forem enviados
# com sintaxe estilo GET para play & publish
# estes também são incluídos.
# Exemplo de URL:
# rtmp://localhost/myapp/mystream?a=b&c=d
# gravar 10 keyframes de vídeo (sem áudio) a cada 2 minutos
record keyframes;
record_path /tmp/vc;
record_max_frames 10;
record_interval 2m;
# Notificação assíncrona sobre um flv gravado
on_record_done http://localhost:8080/record_done;
}
# HLS
# Para HLS funcionar, crie um diretório em tmpfs (/tmp/hls aqui)
# para os fragmentos. O conteúdo do diretório é servido via HTTP (veja
# a seção http{} na configuração)
#
# O stream de entrada deve estar em H264/AAC. Para iPhones, use o perfil H264
# baseline (veja o exemplo do ffmpeg).
# Este exemplo cria um stream RTMP de um filme pronto 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
#
# Se você precisar transcodificar um stream ao vivo, use o recurso 'exec'.
#
application hls {
live on;
hls on;
hls_path /tmp/hls;
}
# MPEG-DASH é semelhante ao HLS
application dash {
live on;
dash on;
dash_path /tmp/dash;
}
}
}
# HTTP pode ser usado para acessar estatísticas RTMP
http {
server {
listen 8080;
# Esta URL fornece estatísticas RTMP em XML
location /stat {
rtmp_stat all;
# Use esta folha de estilo para visualizar XML como página da web
# no navegador
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
# Folha de estilo XML para visualizar estatísticas RTMP.
# Copie stat.xsl para onde quiser
# e coloque o caminho completo do diretório aqui
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;
}
}
}
Exemplo de streaming com múltiplos trabalhadores
rtmp_auto_push on;
rtmp {
server {
listen 1935;
application mytv {
live on;
}
}
}
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-rtmp.