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 -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.
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.
# 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.
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.
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.
| Flag | O que faz |
|---|---|
-re | Lê 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.mp4 | Sua entrada: um arquivo, um dispositivo ou outro stream. O passo 03 tem um para cada. |
-c:v libx264 | Codifica o vídeo como H.264, que todo player e navegador consegue exibir. |
-preset veryfast | Troca 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 5000k | Manté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 yuv420p | O 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 0 | Impede 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 flv | Empacota 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.
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.
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.
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.
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.
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.
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.
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.
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.
| Imagem | Adicione ao comando | Vídeo | Áudio | Upload necessário |
|---|---|---|---|---|
| 1080p, 30 fps | -vf scale=-2:1080 -r 30 | 4500k | 128k | 7 Mbps |
| 720p, 30 fps | -vf scale=-2:720 -r 30 | 2500k | 128k | 4 Mbps |
| 480p, 30 fps | -vf scale=-2:480 -r 30 | 1200k | 96k | 2 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
- 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.
- Mantenha o bitrate estável com
-maxratee-bufsize, para que uma cena movimentada não ultrapasse seu upload. - 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.
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 -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.
Verifique se você está ao vivo e corrija o que não estiver
- Inicie o FFmpeg e deixe a janela aberta. Uma linha de status que continua contando
frame=etime=significa que está enviando. - 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.
- 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.
| O que você vê | O que fazer |
|---|---|
| O FFmpeg para imediatamente com um erro de conexão ou de E/S | Verifique 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 stream | O 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 arquivo | Você esqueceu o -re. Adicione-o antes de -i. |
speed= fica abaixo de 1x | Use 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 travam | Verifique 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 termina | Adicione -stream_loop -1 antes de -i. |
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.
Prefere uma janela à linha de comando?
O mesmo canal funciona com qualquer codificador que fale RTMP. Estes tutoriais usam os mesmos quatro valores.
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.