Pular para conteúdo

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.