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;
}
}
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.