Tutorial · FFmpeg para vídeo ao vivo

Tutorial de streaming com FFmpeg de um comando a um canal ao vivo

Este tutorial de streaming com FFmpeg coloca você no ar com um único comando: o FFmpeg lê seu arquivo, câmera ou tela, codifica em vídeo H.264 e áudio AAC, e envia por RTMP para seu canal Primcast.

Você encontrará o comando para cada tipo de fonte, as configurações de codificador que mantêm a reprodução fluida para seus espectadores e uma versão SRT para conexões longas ou instáveis.

ffmpeg · rtmp
ffmpeg -re -i input.mp4 \ -c:v libx264 -preset veryfast \ -b:v 2500k -maxrate 2500k -bufsize 5000k \ -pix_fmt yuv420p \ -force_key_frames "expr:gte(t,n_forced*2)" \ -sc_threshold 0 \ -c:a aac -b:a 128k -ar 44100 -ac 2 \ -f flv "rtmp://USERNAME:PASSWORD@HOST:1935/APP/livestream"

Troque as palavras destacadas pelos seus próprios valores. O passo 02 explica cada flag.

01

Antes de começar: FFmpeg e quatro valores do seu painel

Você precisa do FFmpeg no computador que envia o vídeo e das configurações de codificador do seu canal. Ambos levam alguns minutos.

Instalar o FFmpeg

Use o gerenciador de pacotes do seu sistema e verifique se ele funciona. Qualquer versão atual funciona com os comandos desta página.

instalar
# Windowswinget install Gyan.FFmpeg# macOS (Homebrew)brew install ffmpeg# Debian ou Ubuntusudo apt install ffmpeg# verificarffmpeg -version

Copie suas configurações de codificador

Entre, abra sua conta de vídeo e localize o cartão Transmissão ao vivo. As Configurações de codificador listam tudo o que o FFmpeg precisa:

Servidor
Parece com rtmp://HOST:1935/APP. Seu host e nome da aplicação.
Nome do stream
Geralmente livestream. Vai no final do endereço.
Usuário
Seu login de publicação.
Senha
Clique em Mostrar para vê-la, ou em Nova senha para substituí-la.

Se o seu painel também mostrar um endereço de Servidor mais próximo, use-o como servidor. Seu codificador então se conecta à nossa localização mais próxima (Nova York, Miami, São Francisco, Amsterdã ou Bucareste) e o stream segue para seu canal pela nossa rede. O nome do stream, o usuário e a senha permanecem os mesmos.

02

Seu primeiro stream RTMP com FFmpeg, flag por flag

Coloque seu usuário e senha na frente do host, seguidos de um @, e adicione o nome do stream após a aplicação. O restante do comando diz ao FFmpeg como codificar.

endereço rtmp
rtmp://USERNAME:PASSWORD@HOST:1935/APP/livestream

Mantenha as aspas ao redor do endereço. Se sua senha contiver @, : ou /, escreva-os como %40, %3A e %2F, ou clique em Nova senha no painel para obter uma sem eles.

O que cada flag do FFmpeg no comando faz
FlagO que faz
-reLê um arquivo na velocidade real de reprodução. Sem ela, o FFmpeg envia o arquivo o mais rápido que pode e o stream se quebra. Deixe-a de fora para câmeras e dispositivos de captura, que já operam em tempo real.
-i input.mp4Sua entrada: um arquivo, um dispositivo ou outro stream. O passo 03 tem um para cada.
-c:v libx264Codifica o vídeo como H.264, que todo player e navegador consegue exibir.
-preset veryfastTroca um pouco de qualidade por velocidade para o computador acompanhar em tempo real. Experimente faster ou medium se tiver CPU de sobra.
-b:v 2500k -maxrate 2500k -bufsize 5000kMantém o vídeo próximo de 2.500 kbps constantes, para o stream nunca pedir mais upload do que você tem. O passo 04 tem valores para cada resolução.
-pix_fmt yuv420pO formato de cor que celulares, TVs e navegadores esperam.
-force_key_frames "expr:gte(t,n_forced*2)"Um keyframe a cada 2 segundos, independentemente da taxa de quadros. A reprodução é dividida em segmentos nos keyframes, então este é o que mais importa.
-sc_threshold 0Impede keyframes extras em mudanças de cena, para o ritmo de 2 segundos permanecer fixo.
-c:a aac -b:a 128k -ar 44100 -ac 2Áudio AAC estéreo a 128 kbps e 44,1 kHz. O codificador AAC embutido do FFmpeg não precisa de flag extra.
-f flvEmpacota o stream em FLV, o formato que o RTMP transporta.

Guias mais antigos, incluindo a primeira versão desta página, adicionam -strict experimental para AAC. O FFmpeg removeu o rótulo experimental do codificador AAC na versão 3.0, então você pode deixá-lo de fora.

03

Escolha sua fonte: arquivo, webcam, tela ou câmera IP

Apenas a parte da entrada muda. Em todos os exemplos, [encoding] representa as flags de vídeo e áudio do passo 02, e RTMP_ADDRESS o seu endereço entre aspas.

Transmitir um arquivo de vídeo com FFmpeg

Adicione -stream_loop -1 antes da entrada para reproduzi-lo em repetição até você parar o FFmpeg.

arquivo
ffmpeg -re -stream_loop -1 -i video.mp4 \ [encoding] -f flv "RTMP_ADDRESS"

Webcam no Windows

Liste seus dispositivos primeiro e use os nomes exatos que ele imprime.

windows · dshow
ffmpeg -list_devices true -f dshow -i dummy
ffmpeg -f dshow -rtbufsize 256M ^ -i video="Your Camera":audio="Your Microphone" ^ [encoding] -f flv "RTMP_ADDRESS"

Webcam no macOS

A lista mostra cada câmera e microfone com um número. "0:0" significa câmera 0 e microfone 0.

macos · avfoundation
ffmpeg -f avfoundation -list_devices true -i ""
ffmpeg -f avfoundation -framerate 30 \ -video_size 1280x720 -i "0:0" \ [encoding] -f flv "RTMP_ADDRESS"

Webcam no Linux

Vídeo do dispositivo da câmera, som da entrada padrão do seu desktop.

linux · v4l2
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 \ -i /dev/video0 -f pulse -i default \ [encoding] -f flv "RTMP_ADDRESS"

Sua tela no Windows

Captura o desktop inteiro a 30 quadros por segundo. Adicione um microfone com uma segunda entrada dshow se quiser som.

windows · gdigrab
ffmpeg -f gdigrab -framerate 30 -i desktop ^ [encoding] -f flv "RTMP_ADDRESS"

Câmera IP via RTSP

Se a câmera já envia H.264 com intervalo de keyframe de 2 segundos (definido no menu dela), copie o vídeo como está e codifique apenas o som. Caso contrário, use as flags completas de codificação.

câmera rtsp
ffmpeg -rtsp_transport tcp \ -i "rtsp://CAM_USER:CAM_PASS@192.168.1.64:554/stream1" \ -c:v copy -c:a aac -b:a 128k \ -f flv "RTMP_ADDRESS"

Sem microfone na câmera? Substitua as flags de áudio por -an.

Os exemplos terminam as linhas com \ (macOS e Linux) ou ^ (Prompt de Comando do Windows). No PowerShell, ou em caso de dúvida, coloque o comando inteiro em uma linha.

04

Configurações do codificador FFmpeg que aguentam ao vivo

Escolha uma linha que se adapte à sua velocidade de upload. Deixe um terço do seu upload livre: se um teste de velocidade mostrar 6 Mbps, envie no máximo cerca de 4.

Bitrates de vídeo e áudio sugeridos do FFmpeg por resolução
ImagemAdicione ao comandoVídeoÁudioUpload necessário
1080p, 30 fps-vf scale=-2:1080 -r 304500k128k7 Mbps
720p, 30 fps-vf scale=-2:720 -r 302500k128k4 Mbps
480p, 30 fps-vf scale=-2:480 -r 301200k96k2 Mbps

Defina -b:v e -maxrate com o valor de vídeo e -bufsize com o dobro disso. O comando do passo 02 é a linha de 720p. Os planos pagos de vídeo ao vivo aceitam até 5 Mbps de entrada, o suficiente para a linha de 1080p.

Três regras que evitam a maioria dos travamentos

  1. Mantenha os keyframes em intervalos fixos de 2 segundos. Um intervalo longo ou instável aparece como travamento para seus espectadores e, do seu lado, parece uma falha do servidor.
  2. Mantenha o bitrate estável com -maxrate e -bufsize, para que uma cena movimentada não ultrapasse seu upload.
  3. Observe o valor de speed= na linha de status do FFmpeg. Ele deve ficar em 1x. Abaixo disso, seu computador não consegue codificar em tempo real.

Deixe sua GPU fazer a codificação

Se speed= cair abaixo de 1x, troque -c:v libx264 -preset veryfast pelo codificador de hardware que seu computador tiver. A CPU fica então livre para todo o resto.

GPU NVIDIA
-c:v h264_nvenc -preset p4
Gráficos Intel
-c:v h264_qsv
Mac
-c:v h264_videotoolbox

Execute ffmpeg -encoders para ver quais o seu build inclui.

05

Envie um stream SRT do FFmpeg em vez disso

O SRT mantém um stream estável em links longos ou com perdas, como um Wi-Fi de local, um uplink móvel ou um feed de outro continente, onde o RTMP tende a travar. Ele vem com os planos Pro e Platinum do nosso CDN de vídeo.

Seu cartão de streaming ao vivo terá então uma seção Ingestão SRT com sua própria porta e frase-senha. Copie a URL de uma linha e use-a como saída, com MPEG-TS no lugar de FLV. As flags de codificação permanecem as mesmas.

Um stream SRT é reproduzido sob seu próprio nome, então use o link de reprodução mostrado ao lado dele, em Reproduz em.

ffmpeg · srt
ffmpeg -re -i input.mp4 \ [encoding] \ -f mpegts \ "srt://HOST:PORT?passphrase=PASSPHRASE&pbkeylen=16"

Seu build do FFmpeg precisa de suporte a SRT. Verifique com ffmpeg -protocols e procure por srt na lista de saída.

06

Verifique se você está ao vivo e corrija o que não estiver

  1. Inicie o FFmpeg e deixe a janela aberta. Uma linha de status que continua contando frame= e time= significa que está enviando.
  2. Abra o cartão de streaming ao vivo. Em até 15 segundos, ele deve indicar ao vivo e mostrar o que seu codificador está enviando, próximo do seu bitrate.
  3. Copie o link de reprodução do mesmo painel e abra-o no VLC (Mídia, Abrir stream de rede) ou execute ffplay "PLAYBACK_LINK". O painel também fornece um código de incorporação para seu próprio site.
Problemas comuns de streaming do FFmpeg e suas correções
O que você vêO que fazer
O FFmpeg para imediatamente com um erro de conexão ou de E/SVerifique o host e o nome da aplicação letra por letra. Algumas redes de escritório e hotéis bloqueiam a porta 1935: tente outra conexão.
Ele conecta, mas o servidor recusa o streamO nome de usuário ou a senha está errado, ou a senha tem um caractere que precisa de codificação. Clique em Nova senha, atualize o comando e tente novamente.
speed= fica bem acima de 1x em um arquivoVocê esqueceu o -re. Adicione-o antes de -i.
speed= fica abaixo de 1xUse um preset mais rápido (superfast), uma linha mais baixa do passo 04 ou o codificador da sua GPU.
O FFmpeg parece bem, mas os espectadores travamVerifique as flags de keyframe e depois reduza o bitrate. Seu upload pode estar mais lento do que você imagina naquele horário.
O stream termina quando o arquivo terminaAdicione -stream_loop -1 antes de -i.
07

Perguntas sobre streaming com FFmpeg

Como faço streaming para um servidor RTMP com FFmpeg?

Codifique em H.264 e AAC, envolva a saída em FLV com -f flv e informe o endereço RTMP como último argumento do FFmpeg. Para um canal Primcast, o endereço é o seu servidor, aplicação e nome do stream, com usuário e senha antes do host: rtmp://USUARIO:SENHA@HOST:1935/APP/livestream.

Onde encontro o endereço do servidor, usuário e senha?

Na sua conta, no cartão de Live streaming da sua conta de vídeo, em Configurações do codificador. A senha fica oculta até você clicar em Mostrar, e Nova senha gera uma nova. O stream que está no ar continua rodando, e a nova senha vale para a próxima conexão.

Ainda preciso de -strict experimental para áudio AAC?

Não. O codificador AAC nativo do FFmpeg perdeu o rótulo experimental no FFmpeg 3.0, lançado em 2016. O simples -c:a aac funciona em todas as versões atuais, então você pode remover a flag de comandos antigos.

Qual intervalo de keyframe o FFmpeg deve usar para streaming ao vivo?

2 segundos fixos. Cortamos os segmentos de reprodução nos keyframes, então um intervalo maior ou variável vira travamentos para seus espectadores. Use -force_key_frames "expr:gte(t,n_forced*2)" com -sc_threshold 0, ou -g definido como o dobro da sua taxa de quadros.

Com qual bitrate devo fazer streaming?

Cerca de 2.500 kbps para 720p e 4.500 kbps para 1080p a 30 quadros por segundo, mais 128 kbps de áudio. Mantenha o total em dois terços da sua velocidade de upload medida para que um momento de lentidão na sua linha não interrompa o stream.

Como faço loop de um arquivo de vídeo o dia todo com FFmpeg?

Coloque -re -stream_loop -1 antes de -i e o FFmpeg repete o arquivo até você interromper. Isso mantém um computador ocupado o dia inteiro, porém. Os planos pagos de CDN de vídeo incluem canais de estação de TV 24/7 que reproduzem seus vídeos do nosso lado.

O FFmpeg pode codificar o stream na minha GPU?

Sim. Use h264_nvenc em uma GPU NVIDIA, h264_qsv em gráficos Intel ou h264_videotoolbox em um Mac, no lugar de libx264. As flags de keyframe e bitrate permanecem as mesmas.

Posso enviar SRT em vez de RTMP?

Sim, nos planos Pro e Platinum de CDN de vídeo. Seu painel fornece uma porta SRT e uma frase-senha. Use -f mpegts e a URL de uma linha srt:// do painel como saída.

Precisa de um canal para fazer streaming?

Abra um canal de vídeo, cole seus valores no comando e avalie a imagem você mesmo. Travou em uma flag? Nosso chat responde em segundos e pode olhar seu canal enquanto você espera, e uma pessoa assume sempre que você pedir.