loading...
Cover image for Crie seu servidor de Live  Streaming privado PART 1

Crie seu servidor de Live Streaming privado PART 1

cesarpaulomp profile image Paulo Porto Updated on ・5 min read

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.

Discussion

markdown guide
 

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

 

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.