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:
- Um servidor Ubuntu 20.04 e um usuário não root com privilégios sudo. Você pode aprender mais sobre como configurar um usuário com esses privilégios em nosso guia Configuração inicial do servidor com Ubuntu 20.04 .
- Nginx instalado, seguindo Como instalar o Nginx no Ubuntu 20.04 .
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 nano
ou 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 1935
significa que o RTMP estará escutando conexões na porta 1935, que é padrão.chunk_size 4096
significa que o RTMP enviará dados em blocos de 4KB, o que também é padrão.allow publish 127.0.0.1
edeny publish all
significa 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 live
define um bloco de aplicativo que estará disponível no/live
caminho da URL.live on
habilita 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 off
desativa 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 Y
e 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 ufw
como 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 pip
para instalar youtube-dl
:
pip install youtube-dl
cópia de
Agora você pode usar youtube-dl
para 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-dl
combinando 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 ffmpeg
para 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 ffmpeg
comando está fazendo algumas coisas para preparar o vídeo para um formato compatível com streaming. Este não é um ffmpeg
tutorial, então você não precisa examiná-lo muito de perto, mas você pode entender as várias opções da seguinte forma:
-re
especifica 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:v
está definido comocopy
, o que significa que você está copiando o formato de vídeo obtido do YouTube nativamente.-c:a
tem outros parâmetros, a saberaac -ar 44100 -ac 1
, porque você precisa reamostrar o áudio para um formato compatível com RTMP.aac
é um codec de áudio amplamente suportado,44100
hz é uma frequência comum e-ac 1
especifica a primeira versão da especificação AAC para fins de compatibilidade.-f flv
envolve o vídeo em umflv
contêiner de formato para compatibilidade máxima com RTMP.
O vídeo é enviado rtmp://localhost/live/stream
porque você definiu o live
bloco de configuração na Etapa 1 e stream
é um URL escolhido arbitrariamente para este vídeo.
Observação: você pode aprender mais sobre ffmpeg
as opções em ffmprovisr , um catálogo de ffmpeg
exemplos de comandos mantido pela comunidade ou consultar a documentação oficial .
Enquanto ffmpeg
estiver 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 ffmpeg
saí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= 25
incrementos 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 VLC
, mpv
, 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/stream
ffmpeg
-stream_loop -1
ffmpeg
Nota: Você também pode transmitir diretamente para, por exemplo, o Facebook Live usando ffmpeg
sem precisar usar o Nginx-RTMP substituindo rtmp://localhost/live/stream
em seu ffmpeg
comando 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-key
rtmp://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 publish
entrada 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 Streaming
na 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.conf
arquivo 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.xsl
arquivo 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-rtmp
biblioteca que você instalou anteriormente, mas vem compactado por padrão, portanto, você precisará descompactá-lo e colocá-lo no /var/www/html/rtmp
diretó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/rtmp
diretório e descompacte o stat.xsl.gz
arquivo 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 listen
diretiva é 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 rtmp
bloco em seu nginx.conf
arquivo. Abra /etc/nginx/nginx.conf
usando nano
ou 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 stream
diretó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.m3u8
http://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.