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.tse.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:minhatransmissaoou um ID de sala comoroom1)
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.