Configurando um Servidor de Streaming ao Vivo com Nginx RTMP

A demanda por soluções de streamign de vídeo é crescente em diversos projetos. Embora existam inúmeros serviços de terceiros, a dependência externa e os custos associados podem ser desvantagens significativas. Para empresas que priorizam a agilidade no lançamento e a economia, uma alternativa viável é a criação de um servidor de streaming próprio. Este guia detalha como configurar um servidor de streaming ao vivo de forma simplificada, utilizando o Nginx com o módulo RTMP.

Instalação e Preparação do Nginx

Para iniciar, é necessário baixar o Nginx. O arquivo executável e as bibliotecas podem ser obtidos no site oficial: nginx.org/en/download.html. Este tutorial foca em ambientes Windows, mas os princípios de configuração são aplicáveis a outros sistemas operacionais.

Após extrair o arquivo compactado do Nginx, crie algumas pastas essenciais dentro do diretório principal do Nginx:

  • temp/hls: Para armazenar segmentos HLS (arquivos .ts e .m3u8).
  • records/live: Para salvar as gravações das transmissões ao vivo.
  • media/vod: Opcional, para vídeos sob demanda.

Configuração do Nginx RTMP

Abra o arquivo de configuração principal do Nginx, localizado em [diretório_nginx]/conf/nginx.conf. Substitua o conteúdo existente ou adicione as seções abaixo para habilitar o streaming RTMP e HTTP.


worker_processes  auto; # Número de processos de worker Nginx, idealmente ajustado ao número de núcleos da CPU.

events {
    worker_connections  1024; # Limite de conexões simultâneas por processo de worker.
}

rtmp_auto_push on; # Ativa o auto-push para transmissões RTMP.

# Bloco de serviço RTMP
rtmp {
    server {
        listen 1935;        # Porta padrão para o serviço RTMP.
        chunk_size 8192;    # Tamanho do bloco de dados para transmissão (8KB neste exemplo).

        # Aplicação para vídeo sob demanda (VOD)
        application vod {
            play ./media/vod; # Diretório onde os arquivos de vídeo para VOD estão localizados.
        }

        # Aplicação para transmissão ao vivo
        application live {
            live on; # Habilita o modo de transmissão ao vivo.

            # Configurações de gravação da transmissão
            record all;                                # Ativa a gravação completa da stream.
            record_path ./records/live;                # Diretório para armazenar os vídeos gravados. Assegure permissões de escrita para o Nginx.
            record_unique on;                          # Gera nomes de arquivo únicos (ex: sala_ID-timestamp.flv).
            # Opcional: Comando para converter o FLV gravado para MP4 usando FFmpeg (FFmpeg deve estar no PATH do sistema).
            # exec_record_done ffmpeg -y -i $path -c:a aac -b:a 128k -c:v libx264 -crf 23 -preset medium $path/$basename.mp4;

            # Configurações de HLS (HTTP Live Streaming)
            hls on;                                    # Habilita a transmissão HLS.
            hls_path ./temp/hls;                       # Diretório para os segmentos de vídeo HLS (.ts) e a playlist (.m3u8).
            hls_fragment 3s;                           # Duração de cada segmento de vídeo HLS em segundos.
            hls_playlist_length 18s;                   # Duração total da playlist HLS, definindo quantos segmentos são mantidos.
            # wait_key on;                             # Opcional: Garante que os segmentos HLS comecem em um keyframe.
            # hls_continuous on;                       # Opcional: Habilita o modo HLS contínuo.
            # hls_cleanup on;                          # Opcional: Remove segmentos HLS antigos para economizar espaço.
            # hls_nested on;                           # Opcional: Habilita o modo HLS aninhado.

            recorder myRecorder {
                record all manual; # Modo de gravação manual.
                record_suffix _.flv; # Sufixo para arquivos gravados manualmente.
                record_path ./records/manual; # Diretório para gravações manuais.
            }
        }
    }
}

# Bloco de serviço HTTP
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        # Configurações para acesso HLS via HTTP
        location /live_hls {
            types {
                application/vnd.apple.mpegurl m3u8; # Tipo MIME para arquivos M3U8.
                video/mp2t ts;                     # Tipo MIME para segmentos de vídeo TS.
            }
            alias ./temp/hls;                       # Aponta para o diretório dos arquivos HLS.
            add_header Cache-Control no-cache;         # Desabilita o cache para streams em tempo real.
            add_header Access-Control-Allow-Origin *;  # Permite solicitações CORS de qualquer domínio.
            add_header Access-Control-Allow-Headers X-Requested-With;
            add_header Access-Control-Allow-Methods GET;
        }

        # Controle RTMP via HTTP
        location /control {
            rtmp_control all;
        }
        
        # Estatísticas RTMP via HTTP
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
            root ./; # Assume que 'stat.xsl' está na raiz do diretório Nginx.
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

Executando o Servidor Nginx

Para iniciar o servidro Nginx, abra o Prompt de Comando (cmd) como administrador e navegue até o diretório raiz do Nginx.

Comandos úteis para o Nginx:

  • nginx.exe -t: Verifica a sintaxe da configuração.
  • start nginx: Inicia o servidor Nginx.
  • nginx -s stop: Para o servidor imediatamente.
  • nginx -s reload: Recarrgea a configuração sem interromper o serviço.
  • tasklist /fi "imagename eq nginx.exe": Verifica se o processo Nginx está em execução.

Primeiro, execute nginx.exe -t para garantir que não há erros na configuração. Se tudo estiver correto, o console retornará uma mensagem de sucesso.

Em seguida, inicie o servidor com start nginx. Você pode verificar se o Nginx está em execução no Gerenciador de Tarefas ou com o comando tasklist. Acesse http://localhost:80 em seu navegador para confirmar que o servidor HTTP está funcional (deve exibir a página padrão do Nginx).

Realizando Transmissões (Push)

Para enviar uma stream para o seu servidor, você pode usar um software de transmissão como o OBS Studio. Configure o OBS com as seguintes informações:

  • Servidor: rtmp://localhost:1935/live
  • Chave de Stream: sua_chave_de_stream (ex: minhatransmissao ou um ID de sala como room1)

Inicie a transmissão no OBS. O Nginx começará a receber a stream e processá-la.

Consumindo as Transmissões (Pull)

Existem duas formas principais de consumir as streams do seu servidor:

1. Endereço RTMP Direto

A stream RTMP pode ser acessada diretamente por players compatíveis (como VLC Media Player) usando o endereço:

rtmp://localhost:1935/live/sua_chave_de_stream

2. Endereço HTTP (HLS)

Para uma compatibilidade mais ampla com navegadores e dispositivos móveis, utilize o endereço HLS (HTTP Live Streaming):

http://localhost:80/live_hls/sua_chave_de_stream.m3u8

Substitua sua_chave_de_stream pela chave que você usou no OBS. Ao acessar este URL, você verá os arquivos .m3u8 e .ts sendo gerados e armazenados na pasta ./temp/hls.

Gravação da Transmissão

Com a configuração fornecida, as transmissões ao vivo são automaticamente gravadas. Os arquivos de vídeo (no formato FLV) são salvos no diretório especificado por record_path, que neste exemplo é ./records/live. Cada gravação terá um nome único, combinando a chave da stream e um timestamp.

Tags: nginx RTMP HLS Live Streaming Servidor de Vídeo

Publicado em 8-27 20:30