Como configurar um servidor de streaming de vídeo usando Nginx-RTMP no Ubuntu 20.04

Introdução

Existem muitos casos de uso para streaming de vídeo. Provedores de serviços como o Twitch são muito populares para lidar com os aspectos de descoberta na web e gerenciamento de comunidade do streaming, e softwares gratuitos como o OBS Studio são amplamente usados ​​para combinar sobreposições de vídeo de várias fontes de stream diferentes em tempo real. Embora essas plataformas sejam muito poderosas, em alguns casos você pode querer hospedar um fluxo que não dependa de outros provedores de serviços.

Neste tutorial, você aprenderá como configurar o servidor web Nginx para hospedar um fluxo de vídeo RTMP independente que pode ser vinculado e visualizado em diferentes aplicativos. RTMP, o Real-Time Messaging Protocol , define os fundamentos da maioria dos streamings de vídeo na Internet. Você também aprenderá a hospedar fluxos HLS e DASH que suportam plataformas mais modernas usando a mesma tecnologia.

Pré-requisitos

Para concluir este guia, você precisará de:

Este tutorial usará o nome de domínio de espaço reservado your_domain para URLs e nomes de host. Substitua isso pelo seu próprio nome de domínio ou endereço IP enquanto você trabalha no tutorial.

Etapa 1 — Instalando e configurando o Nginx-RTMP

A maioria das ferramentas de streaming modernas suporta o protocolo RTMP, que define os parâmetros básicos de um stream de vídeo na Internet. O servidor da web Nginx inclui um módulo que permite fornecer um fluxo RTMP com configuração mínima a partir de uma URL dedicada, assim como fornece acesso HTTP a páginas da web por padrão. O módulo Nginx RTMP não está incluído automaticamente no Nginx, mas no Ubuntu 20.04 e na maioria das outras distribuições Linux você pode instalá-lo como um pacote adicional.

Comece executando os seguintes comandos como um usuário não root para atualizar suas listagens de pacotes e instalar o módulo Nginx:

sudo apt update
sudo apt install libnginx-mod-rtmp

cópia de

A instalação do módulo não começará automaticamente a fornecer um fluxo. Você precisará adicionar um bloco de configuração ao arquivo de configuração do Nginx que define onde e como o fluxo estará disponível.

Usando nanoou seu editor de texto favorito, abra o arquivo de configuração principal do Nginx, /etc/nginx/nginx.conf, e adicione este bloco de configuração ao final do arquivo:

sudo nano /etc/nginx/nginx.conf

cópia de/etc/nginx/nginx.conf

. . .
rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                allow publish 127.0.0.1;
                deny publish all;

                application live {
                        live on;
                        record off;
                }
        }
}

  • listen 1935significa que o RTMP estará escutando conexões na porta 1935, que é padrão.
  • chunk_size 4096significa que o RTMP enviará dados em blocos de 4KB, o que também é padrão.
  • allow publish 127.0.0.1deny publish allsignifica que o servidor só permitirá a publicação de vídeo do mesmo servidor, para evitar que outros usuários enviem seus próprios fluxos.
  • application livedefine um bloco de aplicativo que estará disponível no /livecaminho da URL.
  • live onhabilita o modo ao vivo para que vários usuários possam se conectar ao seu stream simultaneamente, uma suposição básica de streaming de vídeo.
  • record offdesativa a funcionalidade de gravação do Nginx-RTMP, para que todos os fluxos não sejam salvos separadamente no disco por padrão.

Salve e feche o arquivo. Se estiver usando nano, pressione Ctrl+X, quando solicitado Ye Enter.

Isso fornece o início de sua configuração RTMP. Por padrão, ele escuta na porta 1935, o que significa que você precisará abrir essa porta em seu firewall. Se você configurou ufwcomo parte da configuração inicial do servidor, execute o seguinte comando.

sudo ufw allow 1935/tcp

cópia de

Agora você pode recarregar o Nginx com suas alterações:

sudo systemctl reload nginx.service

cópia de

Agora você deve ter um servidor RTMP funcionando. Na próxima seção, abordaremos o streaming de vídeo para seu servidor RTMP de fontes locais e remotas.

Passo 2 — Enviando vídeo para seu servidor RTMP

Existem várias maneiras de enviar vídeo para seu servidor RTMP. Uma opção é usar o ffmpeg, um utilitário popular de áudio e vídeo de linha de comando, para reproduzir um arquivo de vídeo diretamente em seu servidor. Se você ainda não tem um arquivo de vídeo no servidor, pode baixar um usando youtube-dl, uma ferramenta de linha de comando para capturar vídeo de plataformas de streaming como o YouTube. Para usar youtube-dl, você também precisará de uma instalação atualizada do Python em seu servidor.

Primeiro, instale o Python e seu gerenciador de pacotes, pip:

sudo apt install python3-pip

cópia de

Em seguida, use pippara instalar youtube-dl:

pip install youtube-dl

cópia de

Agora você pode usar youtube-dlpara baixar um vídeo do YouTube. Se você não tem um em mente, experimente este vídeo, apresentando a plataforma de aplicativos da DigitalOcean:

youtube-dl https://www.youtube.com/watch?v=iom_nhYQIYk

cópia de

Você verá alguma saída youtube-dlcombinando os fluxos de vídeo e áudio que está baixando de volta em um único arquivo – isso é normal.

Output[youtube] iom_nhYQIYk: Downloading webpage
WARNING: Requested formats are incompatible for merge and will be merged into mkv.
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4
[download] 100% of 32.82MiB in 08:40
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm
[download] 100% of 1.94MiB in 00:38
[ffmpeg] Merging formats into "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv"
Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4 (pass -k to keep)
Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm (pass -k to keep)

Agora você deve ter um arquivo de vídeo em seu diretório atual com um título como Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv. Para transmiti-lo, você deve instalar ffmpeg:

sudo apt install ffmpeg

cópia de

E use ffmpegpara enviá-lo ao seu servidor RTMP:

ffmpeg -re -i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv" -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream

cópia de

Este ffmpegcomando está fazendo algumas coisas para preparar o vídeo para um formato compatível com streaming. Este não é um ffmpegtutorial, então você não precisa examiná-lo muito de perto, mas você pode entender as várias opções da seguinte forma:

  • -reespecifica que a entrada será lida em sua taxa de quadros nativa.
  • -i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv"especifica o caminho para nosso arquivo de entrada .
  • -c:vestá definido como copy, o que significa que você está copiando o formato de vídeo obtido do YouTube nativamente.
  • -c:atem outros parâmetros, a saber aac -ar 44100 -ac 1, porque você precisa reamostrar o áudio para um formato compatível com RTMP. aacé um codec de áudio amplamente suportado, 44100hz é uma frequência comum e -ac 1especifica a primeira versão da especificação AAC para fins de compatibilidade.
  • -f flvenvolve o vídeo em um flvcontêiner de formato para compatibilidade máxima com RTMP.

O vídeo é enviado rtmp://localhost/live/streamporque você definiu o livebloco de configuração na Etapa 1 e streamé um URL escolhido arbitrariamente para este vídeo.

Observação: você pode aprender mais sobre ffmpegas opções em ffmprovisr , um catálogo de ffmpegexemplos de comandos mantido pela comunidade ou consultar a documentação oficial .

Enquanto ffmpegestiver transmitindo o vídeo, ele imprimirá códigos de tempo:

Outputframe=  127 fps= 25 q=-1.0 size=     405kB time=00:00:05.00 bitrate= 662.2kbits/s speed=frame=  140 fps= 25 q=-1.0 size=     628kB time=00:00:05.52 bitrate= 931.0kbits/s speed=frame=  153 fps= 25 q=-1.0 size=     866kB time=00:00:06.04 bitrate=1173.1kbits/s speed=

Esta é a ffmpegsaída padrão. Se você estava convertendo o vídeo para um formato diferente, isso pode ser útil para entender a eficiência com que o vídeo está sendo reamostrado, mas, neste caso, você só quer ver se ele está sendo reproduzido de forma consistente. Usando este vídeo de exemplo, você deve obter fps= 25incrementos exatos.

Enquanto o ffmpeg está em execução, você pode se conectar ao seu fluxo RTMP a partir de um player de vídeo. Se você tiver VLCmpv, ou outro reprodutor de mídia instalado localmente, poderá visualizar seu stream abrindo o URL no seu reprodutor de mídia. Sua transmissão será encerrada após a reprodução do vídeo. Se você quiser que ele continue em loop indefinidamente, você pode adicionar ao início do seu comando.rtmp://your_domain/live/streamffmpeg-stream_loop -1ffmpeg

Nota: Você também pode transmitir diretamente para, por exemplo, o Facebook Live usando ffmpegsem precisar usar o Nginx-RTMP substituindo rtmp://localhost/live/streamem seu ffmpegcomando por . O YouTube usa URLs como . Outros provedores de streaming que podem consumir streams RTMP devem se comportar da mesma forma.rtmps://live-api-s.facebook.com:443/rtmp/your-facebook-stream-keyrtmp://a.rtmp.youtube.com/live2

Agora que você aprendeu a transmitir fontes de vídeo estáticas a partir da linha de comando, aprenderá a transmitir vídeo de fontes dinâmicas usando o OBS em uma área de trabalho.

Passo 3 — Streaming de vídeo para seu servidor via OBS (opcional)

A transmissão via ffmpegé conveniente quando você tem um vídeo preparado que deseja reproduzir, mas a transmissão ao vivo pode ser muito mais dinâmica. O software mais popular para transmissão ao vivo é o OBS ou Open Broadcaster Software – é gratuito, de código aberto e muito poderoso.

O OBS é um aplicativo de desktop e se conectará ao seu servidor a partir do seu computador local.

Depois de instalar o OBS, configurá-lo significa personalizar quais janelas da área de trabalho e fontes de áudio você deseja adicionar ao seu fluxo e, em seguida, adicionar credenciais para um serviço de streaming. Este tutorial não abordará sua configuração de streaming, pois depende de preferência e, por padrão, você pode ter uma demonstração de trabalho apenas transmitindo toda a área de trabalho. Para definir suas credenciais de serviço de streaming, abra o menu de configurações do OBS, navegue até a opção Stream e insira as seguintes opções:

Streaming Service: Custom
Server: rtmp://your_domain/live
Play Path/Stream Key: obs_stream

obs_streamé um caminho escolhido arbitrariamente – nesse caso, seu vídeo estaria disponível em . Você não precisa habilitar a autenticação, mas precisa adicionar uma entrada adicional à lista de permissões de IP que você configurou na Etapa 1.rtmp://your_domain/live/obs_stream

De volta ao servidor, abra o arquivo de configuração principal do Nginx, /etc/nginx/nginx.conf, e adicione uma allow publishentrada adicional para seu endereço IP local. Se você não souber seu endereço IP local, é melhor acessar um site como Qual é o meu IP, que pode informar de onde você o acessou:

sudo nano /etc/nginx/nginx.conf

cópia de/etc/nginx/nginx.conf

. . .
                allow publish 127.0.0.1;
                allow publish your_local_ip_address;
                deny publish all;
. . .

Salve e feche o arquivo e recarregue o Nginx:

sudo systemctl reload nginx.service

cópia de

Agora você deve conseguir fechar o menu de configurações do OBS e clicar Start Streamingna interface principal! Tente visualizar seu stream em um media player como antes. Agora que você viu os fundamentos do streaming de vídeo em ação, você pode adicionar alguns outros recursos ao seu servidor para torná-lo mais pronto para a produção.

Etapa 4 — Adicionando monitoramento à sua configuração (opcional)

Agora que você configurou o Nginx para transmitir vídeo usando o módulo Nginx-RTMP, uma próxima etapa comum é habilitar a página de estatísticas RTMP. Em vez de adicionar mais e mais detalhes de configuração ao seu nginx.confarquivo principal, o Nginx permite adicionar configurações por site a arquivos individuais em um subdiretório chamado sites-available/. Nesse caso, você criará um chamado rtmp:

sudo nano /etc/nginx/sites-available/rtmp

cópia de

Adicione o seguinte conteúdo:/etc/nginx/sites-available/rtmp

server {
    listen 8080;
    server_name  localhost;

    # rtmp stat
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }
    location /stat.xsl {
        root /var/www/html/rtmp;
    }

    # rtmp control
    location /control {
        rtmp_control all;
    }
}

Salve e feche o arquivo. O stat.xslarquivo deste bloco de configuração é usado para estilizar e exibir uma página de estatísticas RTMP em seu navegador. Ele é fornecido pela libnginx-mod-rtmpbiblioteca que você instalou anteriormente, mas vem compactado por padrão, portanto, você precisará descompactá-lo e colocá-lo no /var/www/html/rtmpdiretório para corresponder à configuração acima. Observe que você pode encontrar informações adicionais sobre qualquer uma dessas opções na documentação do Nginx-RTMP .

Crie o /var/www/html/rtmpdiretório e descompacte o stat.xsl.gzarquivo com os seguintes comandos:

sudo mkdir /var/www/html/rtmp
sudo gunzip -c /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl.gz > /var/www/html/rtmp/stat.xsl`

cópia de

Finalmente, para acessar a página de estatísticas que você adicionou, você precisará abrir outra porta em seu firewall. Especificamente, a listendiretiva é configurada com port 8080, portanto, você precisará adicionar uma regra para acessar o Nginx nessa porta. No entanto, você provavelmente não quer que outras pessoas acessem sua página de estatísticas, então é melhor permitir apenas para seu próprio endereço IP. Execute o seguinte comando:

sudo ufw allow from your_ip_address to any port http-alt

cópia de

Em seguida, você precisará ativar essa nova configuração. A convenção do Nginx é criar links simbólicos (como atalhos) de arquivos sites-available/para outra pasta chamada sites-enabled/conforme você decide ativá-los ou desativá-los. Usando caminhos completos para maior clareza, faça esse link:

sudo ln -s /etc/nginx/sites-available/rtmp /etc/nginx/sites-enabled/rtmp

cópia de

Agora você pode recarregar o Nginx novamente para processar suas alterações:

sudo systemctl reload nginx.service

cópia de

Agora você deve poder acessar em um navegador para ver a página de estatísticas RTMP. Visite e atualize a página durante a transmissão de vídeo e observe como as estatísticas de transmissão mudam.http://your_domain:8080/stat

Agora você viu como monitorar seu fluxo de vídeo e enviá-lo para provedores de terceiros. Na seção final, você aprenderá como fornecê-lo diretamente em um navegador sem o uso de plataformas de streaming de terceiros ou aplicativos de media player independentes.

Etapa 5 — Criando fluxos modernos para navegadores (opcional)

Como etapa final, você pode adicionar suporte para protocolos de streaming mais recentes para que os usuários possam transmitir vídeo do seu servidor usando um navegador da Web diretamente. Existem dois protocolos que você pode usar para criar fluxos de vídeo baseados em HTTP: HLS da Apple e MPEG DASH . Ambos têm vantagens e desvantagens, então você provavelmente desejará oferecer suporte a ambos.

O módulo Nginx-RTMP suporta ambos os padrões. Para adicionar suporte a HLS e DASH ao seu servidor, você precisará modificar o rtmpbloco em seu nginx.confarquivo. Abra /etc/nginx/nginx.confusando nanoou seu editor preferido e adicione as seguintes diretivas destacadas:

sudo nano /etc/nginx/nginx.conf

cópia de/etc/nginx/nginx.conf

. . .
rtmp {
        server {
. . .
                application live {
                    	live on;
                    	record off;
                        hls on;
                        hls_path /var/www/html/stream/hls;
                        hls_fragment 3;
                        hls_playlist_length 60;

                        dash on;
                        dash_path /var/www/html/stream/dash;
                }
        }
}
. . .

Salve e feche o arquivo. Em seguida, adicione isso na parte inferior do seu sites-available/rtmp:

sudo nano /etc/nginx/sites-available/rtmp

cópia de/etc/nginx/sites-available/rtmp

. . .
server {
    listen 8088;

    location / {
        add_header Access-Control-Allow-Origin *;
        root /var/www/html/stream;
    }
}

types {
    application/dash+xml mpd;
}

Nota: O Access-Control-Allow-Origin *cabeçalho habilita CORS , ou Cross-Origin Resource Sharing , que é desabilitado por padrão. Isso comunica a qualquer navegador da Web que acesse dados do seu servidor que o servidor pode carregar recursos de outras portas ou domínios. O CORS é necessário para compatibilidade máxima com clientes HLS e DASH e uma alternância de configuração comum em muitas outras implantações da Web.

Salve e feche o arquivo. Observe que você está usando a porta8088aqui, que é outra escolha arbitrária para este tutorial para evitar conflitos com quaisquer serviços que você possa estar executando na porta 80 ou 443. Você vai querer abrir essa porta em seu firewall por enquanto também:

sudo ufw allow 8088/tcp

cópia de

Por fim, crie um streamdiretório em sua raiz da web para corresponder ao bloco de configuração, para que o Nginx possa gerar os arquivos necessários para HLS e DASH:

sudo mkdir /var/www/html/stream

cópia de

Recarregue o Nginx novamente:

sudo systemctl reload nginx

cópia de

Agora você deve ter um fluxo HLS disponível em e um fluxo DASH disponível em . Esses endpoints gerarão todos os metadados necessários em seu feed de vídeo RTMP para oferecer suporte a APIs modernas.http://your_domain:8088/hls/stream.m3u8http://your_domain:8088/dash/stream.mpd

Conclusão

As opções de configuração usadas neste tutorial estão todas documentadas na página Nginx RTMP Wiki . Os módulos Nginx normalmente compartilham uma sintaxe comum e expõem um conjunto muito grande de opções de configuração, e você pode revisar sua documentação para alterar qualquer uma de suas configurações aqui.

Quase todo o streaming de vídeo da Internet é implementado em RTMP, HLS e DASH e, usando a abordagem que você explorou neste tutorial, você pode fornecer seu stream por meio de outros serviços de transmissão ou expô-lo de qualquer outra maneira que desejar. Em seguida, você pode configurar o Nginx como um proxy reverso para disponibilizar alguns desses diferentes endpoints de vídeo como subdomínios.

You May Also Like

More From Author