Montar um servidor de streaming: um upload para qualquer número de espectadores

Publicado a 10 min de leitura

Envia um único stream para o servidor e o servidor abastece com ele todos os espectadores. A sua própria ligação transporta assim sempre apenas um upload, estejam dez ou mil pessoas a ver. Este guia mostra a montagem, os protocolos e a conta da largura de banda por trás disso.

Quem transmite sem um servidor próprio envia a sua imagem a cada espectador separadamente. Dez espectadores significam dez vezes os mesmos dados, cem espectadores cem vezes. O upload em casa ou no escritório fica assim esgotado depois de poucos espectadores, e a imagem começa a parar, apesar de o computador não ter praticamente nada para fazer.

Um servidor de streaming inverte isto: envia exatamente um stream para o servidor, e é o servidor que abastece todos os espectadores. A sua própria ligação transporta por isso sempre apenas um único upload, seja com dez ou com dez mil pessoas a ver. Este artigo mostra porque é que isto funciona tão bem, como se monta um servidor destes, que atraso custa cada protocolo e quanto tráfego se junta realmente.

O problema: o seu upload é o gargalo

Vídeo é um fluxo permanente. Um stream em 1080p com 60 imagens por segundo precisa, conforme o conteúdo, de 4,5 a 8 Mbit/s; 720p fica entre 3 e 5 Mbit/s. Este bitrate corre por espectador, o tempo todo, sem pausa.

Uma ligação doméstica média na Alemanha consegue entre 10 e 50 Mbit/s de upload, e mesmo muitas ligações de fibra ficam no upload entre 50 e 100 Mbit/s. A conta chega por isso depressa ao fim:

Espectadoresa 3 Mbit/sa 6 Mbit/sA ligação doméstica chega?
515 Mbit/s30 Mbit/sà justa
2060 Mbit/s120 Mbit/snão
100300 Mbit/s600 Mbit/snão
10003 Gbit/s6 Gbit/snão

A isto junta-se um segundo problema, muitas vezes esquecido: a sua ligação é partilhada com tudo o resto que se passa em casa ou no escritório. Assim que alguém carrega um ficheiro grande ou arranca um backup, o stream vai abaixo. Um servidor num datacenter não tem este problema, porque aí a ligação está exclusivamente à sua disposição.

O princípio: subir uma vez, entregar muitas vezes

A montagem tem três partes:

  • O emissor, ou seja, o OBS, o ffmpeg ou uma caixa de hardware, envia um stream para o servidor. A isto chama-se ingest.
  • O servidor recebe esse único stream, converte-o no formato de saída desejado e mantém-no disponível.
  • Os espectadores vão buscar o stream ao servidor. A isto chama-se egress, e é a parte que cresce com o número de espectadores.

Decisiva é a assimetria: o caminho de si até ao servidor é percorrido uma vez, o caminho do servidor até aos espectadores mil vezes. Por isso, a sua ligação só precisa do upload de um único stream, enquanto o servidor precisa de uma ligação que acompanhe o público.

Quanto tráfego se junta realmente

A largura de banda é só metade da conta. Mais interessante é o volume, porque é por ele que muitos fornecedores cobram. A fórmula é simples:

Volume em GB = bitrate em Mbit/s × segundos × espectadores ÷ 8000

Alguns exemplos realistas:

CenárioBitrateDuraçãoEspectadoresVolume
Palestra semanal3 Mbit/s2 h50135 GB
Emissão diária6 Mbit/s3 h2001,6 TB por dia
Canal permanente, dia e noite4 Mbit/s24 h301,3 TB por dia
Grande evento único6 Mbit/s4 h200021,6 TB

Os números da última coluna são a razão por que streaming e faturação por volume combinam mal. Uma única transmissão com muita assistência consegue consumir o volume incluído de um mês inteiro, e cada terabyte seguinte passa a ser cobrado à parte. Num plano com tráfego ilimitado, essa conta desaparece por completo: o preço mensal é fixo, passem 200 GB ou 50 TB pela linha.

Que software lhe convém

SoftwarePonto forteAdequado para
nginx com módulo RTMPleve, estável, faz RTMP e HLS ao mesmo tempoa entrada clássica, reencaminhamento para plataformas
MediaMTXum único ficheiro binário, SRT e WebRTC de fábricaatraso baixo sem muita bricolagem
SRSmuitíssimas funções, preparado para clustermontagens maiores com vários nós
Owncastsolução completa com interface web e chata sua própria página de streaming

Para começar, o nginx com o módulo RTMP é a escolha mais evidente: está disponível em todo o lado, está bem documentado, e mais tarde pode usar o mesmo servidor, sem alterações, como servidor web para a página dos espectadores.

Montar um servidor de streaming com nginx e RTMP

Instalar

No Debian e no Ubuntu, o pacote libnginx-mod-rtmp já traz o módulo, não precisa de compilar nada:

apt update
apt install -y nginx libnginx-mod-rtmp ffmpeg

No AlmaLinux e no Rocky Linux, o módulo vem do repositório EPEL:

dnf install -y epel-release
dnf install -y nginx nginx-mod-rtmp ffmpeg

Configurar

A parte RTMP fica no nginx.conf fora do bloco http, e esse é o erro de principiante mais frequente. Uma versão enxuta e funcional tem este aspeto:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;

            # HLS para os espectadores normais
            hls on;
            hls_path /var/www/stream/hls;
            hls_fragment 2s;
            hls_playlist_length 12s;

            # só o próprio endereço pode publicar
            allow publish 203.0.113.10;
            deny publish all;

            # qualquer pessoa pode ver
            allow play all;
        }
    }
}

Os ficheiros HLS são depois entregues pelo servidor web normal. Para isso basta um pequeno bloco na parte http:

server {
    listen 80;
    server_name stream.example.com;

    location /hls {
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }
        root /var/www/stream;
        add_header Cache-Control no-cache;
        add_header Access-Control-Allow-Origin *;
    }
}

Criar o diretório, verificar a configuração, reiniciar:

mkdir -p /var/www/stream/hls
chown -R www-data:www-data /var/www/stream
nginx -t && systemctl reload nginx

Abrir as portas

O RTMP corre na porta 1935, a entrega nas portas 80 e 443. Com nftables ou ufw:

ufw allow from 203.0.113.10 to any port 1935 proto tcp
ufw allow 80/tcp
ufw allow 443/tcp

Repare na primeira linha: a porta de publicação está aberta apenas para o seu próprio endereço. Uma porta RTMP aberta ao mundo é encontrada em poucos dias, porque há gamas inteiras de endereços a serem percorridas automaticamente, e depois é outra pessoa a transmitir pela sua ligação.

Transmitir com o OBS

Nas definições do OBS, em «Transmissão», indique o serviço «Personalizado»:

CampoValor
Servidorrtmp://stream.example.com/live
Chave de transmissãoum nome à sua escolha, por exemplo kanal1

Em «Saída» define o bitrate. Como referência: 1080p60 com 6000 kbit/s, 1080p30 com 4500 kbit/s, 720p30 com 3000 kbit/s. Ponha o intervalo entre keyframes em 2 segundos, caso contrário surgem segmentos irregulares no HLS e o reprodutor engasga-se nas transições.

Ver o stream

O stream fica depois em https://stream.example.com/hls/kanal1.m3u8 e abre-se com qualquer reprodutor compatível com HLS, no browser por exemplo com hls.js ou Video.js. Para um teste rápido basta o VLC em «Abrir fluxo de rede».

Transmitir para várias plataformas ao mesmo tempo

Esta é a segunda grande vantagem de um servidor próprio. Em vez de rebentar a sua ligação com três uploads em paralelo, envia uma vez para o servidor e é ele que distribui. Para isso acrescenta no bloco application uma linha por destino:

application live {
    live on;
    record off;

    push rtmp://live.plattform-a.example/app/STREAM_KEY;
    push rtmp://live.plattform-b.example/app/STREAM_KEY;
}

O seu upload continua a ser um único stream. A multiplicação fica a cargo do servidor, e aí a largura de banda é exatamente aquilo para que ele existe.

Atraso: que protocolo para quê

O atraso nasce quase todo na entrega, não no envio. É importante compreender isto, porque muita gente procura no lado errado:

Via de entregaAtrasoServe para
HLS, configuração padrão20 a 30 spalestras, cultos religiosos, desporto sem apostas
HLS com segmentos curtos6 a 10 so compromisso habitual
Low-Latency-HLS2 a 5 sstreams com chat
SRTmenos de 1 senvio de sinal entre locais
WebRTCmenos de 0,5 sconversas, leilões, controlo remoto

Quanto mais baixo o atraso, mais caro fica cada espectador. O HLS é o mais barato, porque consiste em ficheiros simples que qualquer servidor web e qualquer cache consegue entregar. O WebRTC, pelo contrário, mantém uma ligação própria aberta para cada espectador e custa por isso bastante mais capacidade de cálculo. Use o atraso baixo apenas onde realmente precisa dele.

Transcoding: quando vale a pena

Enquanto o servidor apenas reencaminha o stream, quase não precisa de capacidade de cálculo. Um único núcleo moderno serve desta forma várias centenas de espectadores, e o gargalo é apenas a ligação.

Isto muda assim que quer oferecer vários níveis de qualidade, para que também os espectadores com ligação fraca consigam ver. Cada nível adicional tem de ser calculado:

ffmpeg -i rtmp://127.0.0.1/live/kanal1 \
  -c:v libx264 -preset veryfast -b:v 3000k -s 1280x720 -c:a copy -f flv rtmp://127.0.0.1/live/kanal1_720 \
  -c:v libx264 -preset veryfast -b:v 1200k -s 854x480  -c:a copy -f flv rtmp://127.0.0.1/live/kanal1_480

Conte com dois a quatro núcleos por nível. Três níveis ocupam assim permanentemente oito a doze núcleos. Pense por isso bem se precisa deles: para um público que está sobretudo ao computador ou em Wi-Fi, basta muitas vezes um único nível bem escolhido.

Proteger: quem pode transmitir

Um servidor de streaming é visível do exterior e acaba por ser encontrado. Três medidas bastam para o dia a dia:

  • Firewall na porta de publicação. Só o seu próprio endereço pode chegar à 1935. Se o seu endereço muda, use em vez disso um acesso VPN ao servidor.
  • Verificar a chave de transmissão. Com on_publish, o nginx chama em cada tentativa de publicação um pequeno script que compara a chave com uma lista e recusa quando não coincide.
  • Proteção básica contra sobrecarga. Um servidor de streaming é um alvo apetecível, porque uma falha é logo visível. Na KernelHost, cada servidor tem uma proteção contra floods com 3,2 Tbps de capacidade, sem que tenha de configurar nada. Mais sobre isso na página da proteção DDoS.

Escolha do local e vários servidores

O servidor não pertence perto de si, mas perto dos seus espectadores. A sua própria ligação ao servidor é estabelecida uma vez e corre depois estável, mesmo através de meio continente. A ligação aos espectadores, pelo contrário, é a que decide o tempo de carregamento e a taxa de abandono.

Se o seu público está sobretudo na Europa, um local na Alemanha é o acertado. Se se distribui por vários continentes, vale a pena um segundo servidor e uma distribuição por DNS, para que cada espectador caia no mais próximo. A KernelHost oferece para isso locais na Alemanha, na costa oeste dos EUA, na costa leste dos EUA, bem como em Singapura e na Coreia do Sul; encontra uma visão geral em Localizações de servidores.

Se distribui ficheiros em vez de imagem em direto, ou seja, atualizações, imagens ou arquivos de vídeo, a ferramenta certa não é um servidor de streaming, mas uma cache à frente. Como isso funciona está no artigo Montar o seu próprio servidor CDN.

Que servidor serve

Num servidor de streaming conta outra ordem de prioridades do que num servidor web:

  1. Ligação e tráfego. É aqui que está o gargalo, sempre. Uma ligação gigabit real sem estrangulamento transporta cerca de 160 espectadores a 6 Mbit/s.
  2. Tráfego ilimitado. Os planos por volume são pouco calculáveis para streaming, porque uma única noite bem-sucedida consome o volume do mês.
  3. CPU. Secundária, desde que não faça transcoding. Com transcoding passa a ser o segundo gargalo.
  4. RAM e disco. O menos crítico. Só quando guarda gravações é que o espaço em disco passa a ser tema.

É exatamente para este caso que os nossos servidores root com tráfego ilimitado estão feitos: ligação real de 2 × 1 Gbit/s por servidor, volume ilimitado sem estrangulamento, um preço mensal fixo independente da quantidade transferida e 3,2 Tbps de proteção contra floods de fábrica. O servidor é disponibilizado em menos de 30 segundos, com acesso root completo, IPv4 e uma rede IPv6 /64. A faturação é em regime PrePaid e cancelável mensalmente, pelo que pode começar com um plano pequeno e crescer quando o seu público crescer.

Perguntas frequentes

Porque é que preciso mesmo de um servidor de streaming?
Sem servidor, o seu computador envia o stream a cada espectador separadamente. Com dez espectadores a 6 Mbit/s são 60 Mbit/s de upload; com cem, já 600 Mbit/s. Uma ligação doméstica típica consegue 10 a 50 Mbit/s de upload. Com um servidor de streaming envia exatamente uma vez, e é o servidor que assume a distribuição.
De quanta largura de banda precisa o servidor?
Multiplique o bitrate pelo número de espectadores em simultâneo. 500 espectadores a 6 Mbit/s dão 3 Gbit/s. Mais importante do que o pico é, no entanto, o volume mensal: os mesmos 500 espectadores geram em duas horas cerca de 2,7 TB. Por isso, no streaming, a propriedade decisiva é o tráfego ilimitado e não a CPU.
Que software devo escolher?
Para começar, nginx com o módulo RTMP, porque é leve e consegue RTMP e HLS ao mesmo tempo. O MediaMTX é a alternativa mais moderna, com SRT e WebRTC de fábrica. O SRS é o que oferece mais funções, mas exige mais estudo. O Owncast é uma solução completa com interface web e chat.
Qual é o atraso?
O RTMP até ao servidor custa menos de um segundo. O atraso nasce quase todo na entrega: o HLS com a configuração padrão fica nos 20 a 30 segundos, com segmentos curtos nos 6 a 10, e o Low-Latency-HLS nos 2 a 5. SRT e WebRTC chegam a menos de um segundo, mas custam mais capacidade de cálculo por espectador.
Preciso de transcoding e quanto custa isso?
Só se quiser oferecer vários níveis de qualidade. O simples reencaminhamento sem conversão quase não usa CPU: um núcleo serve centenas de espectadores. Assim que entrega um stream 1080p também em 720p e 480p, precisa de cerca de dois a quatro núcleos modernos por nível. Planeie transcoding só quando realmente precisar dele.
Posso transmitir ao mesmo tempo para o Twitch e para o YouTube?
Sim, é precisamente para isso que o servidor serve. Envia uma vez para o seu servidor e ele reencaminha o mesmo stream para tantas plataformas quantas quiser. No nginx-RTMP basta para isso uma linha push por destino. A sua própria ligação continua a transportar um único upload.
Como evito que estranhos transmitam pelo meu servidor?
Feche a porta de ingest na firewall para o seu próprio endereço e verifique além disso a chave de transmissão com on_publish. Sem as duas coisas, qualquer servidor RTMP aberto recebe streams alheios em poucos dias, porque há gamas inteiras de endereços a serem percorridas.
Onde deve ficar o servidor?
Não perto de si, mas perto dos seus espectadores. O caminho de si até ao servidor é percorrido uma vez, o caminho do servidor até aos espectadores mil vezes. Se o seu público está na Europa, o servidor fica na Europa. Se o público se distribui por vários continentes, vale a pena um segundo servidor e uma distribuição por DNS.
Basta um VPS ou preciso de um servidor próprio?
Para reencaminhar sem transcoding, um VPS com poucos núcleos basta sem problemas, porque o gargalo é a ligação e não a capacidade de cálculo. Só com transcoding de vários níveis de qualidade ou com muitos canais em paralelo é que vale a pena hardware dedicado.
Como testo se o servidor suporta a carga?
Arranque o stream e abra-o com várias ferramentas ao mesmo tempo, por exemplo com o ffmpeg em modo nulo. Observe ao mesmo tempo o débito de rede e a utilização. Se chega ao limite da ligação antes de a CPU aquecer, a conta deu certo e precisa de mais largura de banda, não de mais núcleos.

Streaming RTMP HLS SRT nginx OBS Restream Unlimited Traffic