Criando um Servidor de Streaming 24/7: Parte 3 - Codificação e Entrega com FFPlayout e Nginx
Matheus Torres

Matheus Torres @matheustmendes_

About: Estudante de Ciência e Tecnologia, aspirante a fullstack developer www.linkedin.com/in/ matheustmendes

Location:
Brasil, Salvador - Bahia
Joined:
May 31, 2025

Criando um Servidor de Streaming 24/7: Parte 3 - Codificação e Entrega com FFPlayout e Nginx

Publish Date: May 31
0 0

Após superar os desafios com o MediaMTX, veio uma fase mais tranquila — mas nem por isso menos interessante. Era hora de colocar os vídeos no ar e entregá-los ao público, com qualidade e estabilidade.

🎞️ Codificação com FFPlayout + FFmpeg

O FFPlayout foi a ferramenta escolhida para gerenciar as playlists e codificar os vídeos. Apesar de eu já ter ouvido falar do FFmpeg, nunca havia mexido diretamente com ele em um fluxo de produção.

O desafio aqui foi entender e configurar corretamente os parâmetros do FFmpeg:

ffmpeg -re -i input.mp4 \
-c:v libx264 -preset veryfast -tune zerolatency \
-c:a aac -f flv rtmp://localhost:1935/live/canal1

Com a ajuda da documentação, fui aprendendo o significado de cada flag:

-re: simula reprodução em tempo real

-preset veryfast: equilibra qualidade e performance

-tune zerolatency: otimiza para streaming ao vivo

Testar os resultados e ver o MediaMTX recebendo o fluxo foi um daqueles momentos de empolgação genuína:

[RTMP] [conn 127.0.0.1:XXXXX] is publishing to path 'live/canal1'

🌐 Entrega ao público com Nginx

Com o servidor gerando o HLS corretamente, era hora de servir os arquivos para fora. A missão agora era configurar o Nginx como proxy reverso, apontando para o domínio tv.lftv.com.br.

Essa parte teve dois grandes focos:

Fazer o Nginx redirecionar os acessos para o MediaMTX na porta 8888

Garantir que tudo estivesse protegido com HTTPS

Configuração básica do proxy:

server {
listen 80;
server_name xxx;

location /hls/ {
    proxy_pass http://localhost:8888/hls/;
    add_header Access-Control-Allow-Origin "$http_origin" always;
    add_header Access-Control-Allow-Credentials true;
    add_header Access-Control-Allow-Methods "GET, OPTIONS";
    proxy_buffering off;
}
Enter fullscreen mode Exit fullscreen mode

}

Ativando HTTPS com Certbot e Let's Encrypt:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d dominio

Em poucos minutos, o domínio estava pronto para transmitir com segurança.

🔐 Os desafios do CORS

Apesar do setup HTTPS ter sido facilitado por automação, configurar o CORS (Cross-Origin Resource Sharing) foi mais delicado. Players em smart TVs (como WebOS ou Tizen) exigem permissões específicas, e o uso de credentials: true exige Access-Control-Allow-Origin dinâmico:

add_header 'Access-Control-Allow-Origin' "$http_origin" always;
add_header 'Access-Control-Allow-Credentials' 'true';

Demorei até encontrar essa combinação estável, mas quando consegui, todos os players passaram a tocar o conteúdo sem bloqueios.

Essa etapa consolidou o pipeline do streaming, do vídeo até o navegador. Cada peça foi conectada com cuidado, e o resultado era visível: o canal estava no ar 24/7.

Comments 0 total

    Add comment