Você já imaginou como são construídos os servidores de Live Streaming?
Já se perguntou: Quais são as ferramentas necessárias para criar este servidor?
Neste artigo aprenda com facilidade a configurar seu servidor sem nenhuma linguagem de programação.
Download do código fonte aqui
Quais ferramentas vamos utilizar?
Nginx
Um dos melhores servidores web open source disponíveis. Com ele vamos receber o Streaming de vídeos no protocolo RTMP (Real-Time Messaging Protocol) e distribuir o vídeo no formato MPEG-TS por HTTP.
Nginx RTMP Module
Modulo que fornece recursos para transmissão ao vivo com HLS ou MPEG-DASH.
Ubuntu
É o SO(Sistema Operacional) que decidi utilizar para o nosso servidor. Eu o escolhi pela facilidade de configurar os serviços e ferramentas.
Aws EC2
Serviço da Amazon para aluguel de computação na nuvem. Você escolhe a quantidade de recursos que pretende utilizar e paga por tempo utilizado.
Vamos começar!
De início vamos criar uma instância na AWS EC2 com o SO Ubuntu.
Recomendo utilizar instâncias do tipo c5.large com 20Gb de disco SSH.
Se você não sabe como criar uma instância no AWS EC2 clique aqui e descubra como.
Você pode também utilizar outra cloud ou uma máquina virtual para aplicar este artigo.
Instalar o Nginx como RTMP module
Execute os próximos comandos como root
#Atualize sistema operacional
sudo apt update -y && sudo apt upgrade -y
#Crie pastas para fácil acesso futuro
mkdir -p /var/nginx/rec
mkdir -p /var/nginx/logs
#Crie um usuário para o Nginx para melhor segurança
adduser nginx --system --no-create-home --group --disabled-login --disabled-password
#De ao usuário nginx o controle das novas pastas
chown nginx:nginx -R /var/nginx/*
#Instale as ferramentas necessárias para compilar e instalar o Nginx
apt-get install -y build-essential git tree zlib1g-dev libssl-dev unzip libpcre3 libpcre3-dev
#Vá até o diretório tmp
cd /tmp
#Baixe o código fonte do Nginx e o módulo de RTMP
wget https://nginx.org/download/nginx-1.17.10.tar.gz
wget https://github.com/defanator/nginx-rtmp-module/archive/fix-build-with-gcc8.zip
#descompacte arquivos baixados
tar -zxvf nginx-1.17.10.tar.gz && unzip fix-build-with-gcc8.zip
#Entre na pasta do nginx
cd nginx-1.17.10
#Execute Antes de compilar e instalar execute ./configure para adicionar o módulo RTMP
./configure --add-module=../nginx-rtmp-module-fix-build-with-gcc8
#Compile e instale o Nginx
make && make install
Ainda como root crie um arquivo chamado nginx.service no diretório /etc/systemd/system/ para cadastrar o Nginx como um serviço o Ubuntu.
Este cadastro nos facilita iniciar/terminar o Nginx com mais facilidade. Além disso podemos adicionar o Nginx no startup do servidor.
nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
Para finalizar vá até o diretório /usr/local/nginx/conf/ edite o arquivo nginx.conf.
nginx.conf
#Diz ao nginx qual usuário do SO ele deve utilizar
user nginx nginx;
#Aqui removemos alguns limites para que mais pessoas
#acessem o servidor para distribuir ou assistir vídeos.
worker_processes auto;
worker_rlimit_nofile 100000;
#Define o diretório/nome do arquivo para os logs de erro.
error_log /var/nginx/logs/error.log;
events {
#Diz quantas pessoas simultâneas podem acessar
worker_connections 4000;
}
rtmp {
server {
#Porta padrão para RTMP
listen 1935;
#Verifica se há conexão ativa com o cliente
#Caso o cliente não responda o nginx fecha a conexão
ping 30s;
ping_timeout 30s;
#Cria a rota para estabelecer conexões RTMP.
#Basta configurar em seu programa de streaming
#favorito a rota
#rtmp://SERVER_ADDRESS:1935/stream/{SOME_CODE}
#para começar a transmitir
application stream {
live on;
#Grava toda a live em um arquivo flv
#no diretório especificado
record all;
record_path /var/nginx/rec;
record_suffix -%d-%b-%y-%T.flv;
record_unique off;
#Liga distribuição do vídeo como HLS
#A especificação pede para utilizar o tmp
hls on;
hls_path /tmp/hls;
#Tamanho máximo de cada fragmento do vídeo
hls_fragment 5s;
}
}
}
#Configura a distribuição
http {
default_type application/octet-stream;
server {
#Porta HTTP padrão.
listen 80 default_server;
#Rota para acesso ao HLS
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
add_header Cache-Control no-cache;
root /tmp;
}
}
}
Você pode ver mais configurações no módulo RTMP aqui
Iniciar o nginx
Novamente como root execute:
systemctl start nginx.service
systemctl enable nginx.service
Se algum erro for emitido durante o start vá até a pasta /var/nginx/logs e abra o arquivo error.log
Você pode clicar aqui e assistir um vídeo onde todas as configurações são feitas.
Teste
Use este endereço rtmp://YOUR_SERVER_ADDRESS:1935/stream/{CHAVE} para conectar em seu servidor para transmitir.
Lembre-se de trocar o valor {CHAVE} por um válido.
Para assistir a transmissão use este endereço http://YOUR_SERVER_ADDRESS/hls/{CHAVE}.m3u8 em um aplicativo capaz de reproduzir esta extensão.
Caso use o navegador Google Chrome você clicar aqui para instalar uma extensão que permite reproduzir o vídeo direto nele.
Fiz um vídeo com o teste prático. É só clicar aqui para assistir.
Conclusão
Nginx como o módulo de RTMP é incrível. Você cria com extrema facilidade um servidor capaz de receber e distribuir Streaming de vídeo. Além disso, você pode transmitir várias Lives ao mesmo tempo no mesmo servidor. Porém, sozinho, como feito neste artigo, não podemos customizar a qualidade dos vídeos entregues e nem criar diversas resoluções ao mesmo tempo para atender usuários com a banda de internet baixa.
Então para o próximo artigo farei esta configuração junto com a ferramenta FFmpeg. Assim será possível customizar a qualidade dos vídeos e criar múltiplas resoluções para atender melhor o usuário final.
Não deixe de ver aqui a segunda parte do artigo.
Top comments (24)
Paulo, estou testando a tua solução, porém não entendi onde vc está gerando a [CHAVE]
"Lembre-se de trocar o valor {CHAVE} por um válido."
na url na hora de colocar no obs
Opa, blza? Desculpe a demora!
A Chave você substituí pelo valor que quiser.
Abs.
Muito obrigado Paulo, estou precisando desenvolver uma solução de live streaming em Nginx, se ja implementaste esta solução e quiser ou puder deixar teu contato...
Poderia me explicar melhor o senário? Posso dar algumas dicas para a infra.
Então, estou querendo subir um server de live streaming na Amazon EC2, a ideia é utilizar ffmpeg para fornecer diversas resoluções de vídeo e também diminuir a banda para o cliente final. Teremos uma fonte de dados (OBS estudio ou outro) jogando direto para o server na amazon, que vai fazer um balanceamento de carga e o encoding do video, fatiar os frames, quebrar nas resoluções para mobile, pc e outras e finalmente servir para o público. penso em montar algo para até 8.000 conexões. Se tiver interesse me passa o teu contato...
Da um alhada na parte dois do meu artigo acho pode te ajudar muito. Fora isso, você pode fazer com que o FFMPEG escreva os arquivos direto no s3 daí usar Cloufront para distribuir.
Boa tarde Paulo tudo bem?
Estou com um problema na empresa que trabalho, e estou procurando uma solução,
temos uns link de um canal e ele é transmitido pelo aplicativo mobile e pelo aplicativo da tv, porém é possível coletar o link e abrir em qualquer lugar, gostaríamos de fazer uma segurança nesse link, utilizamos nginx mas não encontramos muitos materiais sobre isso,
conseguimos fazer o que esta descrito nesse link: nginx.com/blog/securing-urls-secur...
(na primeira solução)
o link principal após fazer essas configurações ele cai, e não acessa mais pelo link, porém era pra acessar junto com o hash (aquele (stdin)= 80e2dfecb5f54513ad4e2e6217d36fd4) que é gerado, porém quando montado ele junto com o restante do link nada acontece, você conhece esse método ou pode me indicar algum? o link não tem html nada, só um conteúdo por streaming
No final do processo vc joga os arquivos .ts e o m3u8 em algum cdn? Caso sim faça a segurança por ele. O Cloudfront da AWS e o Akamai tem implementações de segurança.
Boa noite, implementei o servidor, porém não consigo acessar via rtmp com o drone, eu tentei subir ele em minha maquina e em uma VM no google cloud. Preciso liberar alguma porta ou realizar alguma outra configuração? É muito importante, se for possível favor me responder.
Se me lembro bem ele usa a porta 1935
Caraca Paulo. Esse post veio como uma luz. Cara, eu preparei um Ubuntu com Nginx, mas quando tento reproduzir pelo endereço YOUR_SERVER_ADDRESS/hls/{CHAVE}.m3u8. Tanto no VLC, quanto no Chrome com a extensão instalada, ou entrou player, ele fica como quer carregar o vídeo e não reproduz.
Já usando o VLC com o endereço rtmp://YOUR_SERVER_ADDRESS:1935/stream/{CHAVE} ele roda tranquilo. Até alterei as configurações do Nginx e deixei da mesma forma que você colocou, mas não carrega de forma alguma. O que pode ser?
ótimo artigo, está de parabéns Paulo Porto!
Tem algum painel que gerencie esse streaming?
Na minha versão não tem. É uma ótima ideia para você implementar.
Você pode utilizar kubernetes para iniciar um pod com esse servidor para cada cliente seu daí utilizar a API para criar o painel
Paulo tive esse seguinte erro
Olá,Paulo Estou com um problema sério a respeito deste assunto, como faço para poder falar contigo?
Vander, blza?
Meus canais de comunicação são este e o YouTube.
É algo confidencial?
dev-to-uploads.s3.amazonaws.com/i/...
oi Paulo, ... como vc calcula o consumo de banda de internet e ram do servidor para cada usuario em uso simultaneo? vamos supor 1000...obrigado
ola sou novato nessas solucoes instalei... porem nao consegui configurar corretamente poderia me auxiliar...
Some comments may only be visible to logged-in visitors. Sign in to view all comments.