DEV Community

Cover image for Crie seu servidor de Live  Streaming privado PART 1
Paulo Porto
Paulo Porto

Posted on • Updated on

Crie seu servidor de Live Streaming privado PART 1

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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;
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)

Collapse
 
maurobranquinho profile image
maurobranquinho

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."

Collapse
 
Sloan, the sloth mascot
Comment deleted
Collapse
 
cesarpaulomp profile image
Paulo Porto

na url na hora de colocar no obs

Collapse
 
cesarpaulomp profile image
Paulo Porto

Opa, blza? Desculpe a demora!

A Chave você substituí pelo valor que quiser.

Abs.

Collapse
 
maurobranquinho profile image
maurobranquinho

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

Thread Thread
 
cesarpaulomp profile image
Paulo Porto

Poderia me explicar melhor o senário? Posso dar algumas dicas para a infra.

Thread Thread
 
maurobranquinho profile image
maurobranquinho

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

Thread Thread
 
cesarpaulomp profile image
Paulo Porto

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.

Collapse
 
tarcisiomoretti profile image
tarcisiomoretti

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

Collapse
 
cesarpaulomp profile image
Paulo Porto

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.

Collapse
 
therafaelafernandes profile image
Rafaela Fernandes

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.

Collapse
 
cesarpaulomp profile image
Paulo Porto

Se me lembro bem ele usa a porta 1935

Collapse
 
verascavalcanti profile image
Carlos Veras Cavalcanti

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?

Collapse
 
pauloizidorio profile image
PI.Dev

ótimo artigo, está de parabéns Paulo Porto!

Collapse
 
wilkerq profile image
wilkerq

Tem algum painel que gerencie esse streaming?

Collapse
 
cesarpaulomp profile image
Paulo Porto

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

Collapse
 
adrielrattes profile image
ADRIEL RATO

Paulo tive esse seguinte erro

Collapse
 
vanderleyfcoo profile image
Vanderleyfcoo

Olá,Paulo Estou com um problema sério a respeito deste assunto, como faço para poder falar contigo?

Collapse
 
cesarpaulomp profile image
Paulo Porto

Vander, blza?
Meus canais de comunicação são este e o YouTube.
É algo confidencial?

Collapse
 
adrielrattes profile image
ADRIEL RATO
Collapse
 
cruzilia profile image
leo

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

Collapse
 
lucioescalada profile image
lucioescalada

ola sou novato nessas solucoes instalei... porem nao consegui configurar corretamente poderia me auxiliar...

Collapse
 
lucaspereirace94 profile image
lucaspereirace94

Paulo, como faço para determinar uma pasta com os aquivos de vídeo para serem transmitinos como uma live tv indoor?

Collapse
 
fabiopfrosi profile image
fabiopfrosi

Boa tarde Paulo.

Estou precisando dessa solução para uma aplicação de IPTV.

Minha empresa poderia lhe contratar para prestar consultoria?

Some comments may only be visible to logged-in visitors. Sign in to view all comments.