Carlos Cardoso 15 semanas atrás
FFMPEG é um programa em linha de comando - e isso já espantou metade da audiência - que é usado “secretamente” por quase todos os softwares de edição e manipulação de vídeo, mas o grande segredo é que ele pode ser usado diretamente, de forma bem mais rápida e eficiente.
É claro que eu uso meus DaVincis Resolves da vida, e para muito vídeo curto eu ainda uso o venerável Windows Movie Maker, disponível no Internet Archive, mas há muita coisa que eu acabo automatizando com o FFMPEG. Mas... o que dá pra fazer com ele?
A documentação do FFMPEG é imensa, daria para escrever um testamento com todos os comandos, mas seria muita canalhice até para mim jogar tudo no ChatGPT, pedir pra ele reescrever e postar aqui. Vamos então a uma série de casos e usos, e no final o caminho das pedras para quem quiser instalar o bicho.
Ele é um software altamente otimizado, com apenas 127MB de tamanho, que reconhece centenas de CODECS de vídeo, e é capaz de todo tipo de manipulação de dados, de gerar histogramas a converter entre todos os formatos. Ele faz upscaling, converte DVDs, muda aspect ratio, faz estabilização de imagens, insere legendas e incluir/remover watermarks. Ah sim, também dá pra criar gifs e PNGs animados. (sim, existe PNG animado)
Esse é o feijão com arroz do FFMPEG, e nem vale o artigo. Abrindo um prompt de comando, vá para o diretório onde está o arquivo que você quer converter, teste.avi por exemplo.
O comando é:
ffmpeg -i teste.avi saída.mp4
A beleza é que ele faz tudo sozinho, identificando o formato de entrada, e deduzindo o de saída de acordo com a extensão. Áudio também é tratado de forma transparente.
A principal vantagem aqui é que o FFMPEG tem zero peso morto, não tem GUI em Visual Basic para rastrear IPs, não tem vários processos rodando em background. No momento em que você apertar <enter>, ele começa a torar sua CPU, usando todos os núcleos e threads que conseguir se apossar.
Você sabe, aquele vídeo com padrão de cores e um tom de 1KHz, usado para calibrar seu sistema, antes do vídeo principal começar. Ninguém precisa abrir o Premiere só para gerar um vídeo de colorbar, basta usar o comando:
fmpeg -f lavfi -i "smptebars=size=1920x1080:rate=30" -f lavfi -i "sine=frequency=1000:sample_rate=48000" -t 10 saida.mp4
Ele irá gerar um vídeo com resolução de 1920x1080, 30 frames por segundo, com 10 segundos de duração.
Nós já aprendemos com o Whisper como transcrever e traduzir um áudio para um arquivo de texto, diretamente no formato .srt usado pela maioria dos programas. Softwares como o VLC conseguem ler diretamente os arquivos e exibi-los corretamente, mas seria mais conveniente ter tudo em um arquivo só. Felizmente containers como MP4 permitem que você tenha legendas incorporadas ao arquivo principal.
Peguemos o clássico discurso de John Kennedy anunciando o Programa Apollo.
Com o Whisper, geramos o arquivo de legendas em português e salvamos como Kennedy.srt.
Colocando os dois arquivos no mesmo diretório, na linha de comando comandamos:
ffmpeg -i kennedy.mp4 -i kennedy.srt -c copy -c:s mov_text -metadata:s:s:0 language=por kennedy_leg.mp4
E pronto, nosso vídeo kennedy_leg.mp4 agora tem legendas selecionáveis por software.
Se você quiser forçar as legendas para que elas sejam “queimadas” no vídeo, pode usar o comando:
ffmpeg -i kennedy.mp4 -vf "subtitles=kennedy.srt" -c:a copy -c:v h264 -metadata:s:s:0 language=por kennedy_leg_hard.mp4
Note que essa modalidade é bem mais lenda, pois o vídeo precisa ser reencodado.
Ah sim, você também pode usar o FFMPEG para extrair legendas, caso queira usá-las como base para uma transcrição, ou para corrigir algo. O comando é:
ffmpeg -i video.mp4 -map 0:s:0 output_legenda.srt
Alguns vídeos possuem várias legendas disponíveis, como este episódio de Rick and Morty. Aqui o FFMPEG não pode te ajudar, ele não sabe extrair todas de uma vez. Você precisa contar a posição, começando do zero. As legendas em português brasileiro são a 16ª da lista, então o comando é...
ffmpeg -i rick.mp4 -map 0:s:15 output_subtitle.srt
Algumas vezes você precisa de uma seqüência de frames de um vídeo. Pode ser para criar um gif animado, selecionar uma imagem específica que aparece muito rapidamente, ou para processamento avançado, como alteração por IA, upscaling ou restauração.
Aqui temos um problema, a maioria dos formatos de vídeo modernos não trabalha exatamente com frames, eles comprimem os dados e guardam as alterações entre os keyframes, b-frames e outros frames que não temos tempo para detalhar. O FFMPEG pode ser comandado para reconverter isso tudo e extrair a maior quantidade de frames possível de um vídeo, e é simples.
Primeiro, crie uma subpasta chamada frames, no diretório onde estamos trabalhando. Feito isso, basta o comando:
ffmpeg -i kennedy.mp4 -q:v 1 -qmin 1 -qmax 1 frames/out%4d.jpg
a porção out%4d.jpg diz ao FFMPEG para criar arquivos em formato JPEG (.png também é aceito) no formato outXXXX.jpg, onde XXXX é a numeração do frame, começando em 0000. Vídeos com mais de 10000 frames, é recomendado usar %5d ou mesmo %6d, para tudo ficar organizado.
É o caminho inverso. Digamos que você tenha tratado os frames do vídeo original, e agora queira juntar todos os frames em um novo vídeo. O comando é:
ffmpeg -framerate 29.97 -i frames/out%04d.jpg novovideo.mp4
Aqui estamos assumindo que a taxa original era de 29.97 quadros por segundo, claro.
“Ah mas e o áudio?”
Excelente pergunta, gafanhoto. Você pode extrair o áudio do arquivo original com o comando:
ffmpeg -i kennedy.mp4 -vn -acodec libmp3lame -q:a 4 kennedy_audio.mp3
Para reincorporar (ehê!) o áudio ao novo vídeo, durante sua criação, o comando é
ffmpeg -framerate 29.97 -i frames/out%04d.jpg -i kennedy_audio.mp3 kenconp.mp4
Existem ferramentas mais complexas e dedicadas, como o PySceneDetect, mas às vezes você precisa de um método rápido de analisar um vídeo, detectar as cenas individuais e criar um mosaico com elas, para ter uma visão geral do arquivo como um todo.
Seus problemas acabaram! O FFMPEG também faz isso!
Esvazie o nosso diretório “frames”. Agora no diretório acima, abra a linha de comando e...
ffmpeg -i rick.mp4 -vf "select='gt(scene,0.75)'" -vsync vfr frames/frame%4d.jpg
Estamos comandando o FFMPEG para analisar o arquivo rick.mp4 em busca de mudanças de cenas. Se um frame for substancialmente diferente do anterior, ele o grava no diretório frames, com numeração sequencial.
A diferenciação é sempre a parte complicada, cada vídeo tem um fator ideal diferente. Os valores aqui variam entre 0 e 1, onde 0 significa que a mais ínfima diferença é suficiente para o frame ser gravado. Valores mais altos fazem com que os frames precisem ser mais distintos para disparar o processo. 0.6 é um bom valor inicial.
Obviamente fica muito mais fácil se todas as imagens estão em um único arquivo. Tecnicamente o FFMPEG não é um processador de imagens estáticas, mas como ele faz basicamente tudo...
Precisamos apenas dar o comando:
ffmpeg -framerate 30 -i frames/frame%4d.jpg -filter_complex "[0:v]scale=min(400\,iw*5/10):-1,tile=5x16" mosaico.jpg
Ele irá ler os arquivos no diretório frames, e montar um mosaico com 5 imagens na horizontal e 16 na vertical, de nome mosaico.jpg.
Normalmente esses arquivos ficam bem grandes rapidamente, ainda mais se você estiver mosaicando um vídeo em 4K. Por isso o comando scale permite que a gente determine a largura das imagens individuais. No caso, eu escolhi 400 pixels. Com 76 frames, isso resultou em um arquivo de 2000 x 3600 pixels:
O comando tile determina as dimensões do mosaico. É importante que você dimensione corretamente, para não deixar imagens de fora. A fórmula complexa é L = n/5, onde n é o número de frames e 5 é o número de colunas. Calcule e obtenha o número de linhas. No caso usei 16.
Já dizia o filósofo Abelardo Barbosa: Na internet nada se perde, nada se cria, tudo se copia. Sites copiando sites, vídeos descaradamente roubados... o mínimo que podemos fazer é assinar nossos vídeos. E com o FFMPEG isso é bem simples.
Digamos que você tem uma logo do seu site, assim:
Você quer adicioná-la no canto inferior direito do vídeo, redimensionando automaticamente para ocupar 25% da largura. E com uns 30% de opacidade. (ou 70% de transparência, dá no mesmo). O comando é:
ffmpeg -i kennedy.mp4 -i watermark.png -filter_complex "[1:v]boxblur=5:1,scale=iw*0.30:-1,format=argb,colorchannelmixer=aa=0.3[logo];[0:v][logo]overlay=W-w-10:H-h-10[out]" -map "[out]" -map 0:a -c:a copy saida.mp4
No caso o arquivo kennedy.mp4 será convertido para saída.mp4, com adição da logo watermark.png, dimensionada em 30% (comando scale=iw*0.30) e com opacidade (aa=0.3) de 30% também.
GIF animado é uma abominação, um resquício dos primórdios da Internet, que infelizmente todo mundo usa, já que achamos banda no lixo, provavelmente. Então, se quiser criar um gif animado, com o FFMPEG é extremamente simples, só lembre-se que é um formato muito ineficiente, os arquivos ficam gigantescos.
Um truque é reduzir (muito) a framerate, e o tamanho. Então, o comando:
ffmpeg -i input.mp4 -vf "fps=6, scale=-1:500,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
vai converter os primeiros 10 segundos do vídeo input.mp4 em um gif animado de nome output.gif. A framerate, -fps é de 6 quadros por segundo, e a escala reduz proporcionalmente o vídeo para 500 pixels de altura. Eis o resultado:
OK, eu trapaceei. O arquivo resultante tinha mais de 4MB, o comando usado cria GIFs com qualidade máxima. Para obter GIFs com qualidade (e tamanho) bem inferior, use:
ffmpeg -i input.mp4 -ss 0 -t 10 -vf "scale=-1:500" -r 6 output.gif
O GIF acima foi otimizado via GifSicle, um pequeno utilitário que faz mágica, tipo uma Fiorino com escada.
Infelizmente o povão adora vídeo vertical, aí fica desesperado movendo o celular pros lados, tentando enquadrar algo que se encaixaria de forma perfeitamente confortável em um vídeo horizontal, mas como não tem jeito, muito programa de TV escolheu uma técnica onde o vídeo vertical é mostrado no centro da tela, e para não ficar com colunas laterais pretas, exibem uma versão borrada do vídeo nas laterais.
Esse efeito é trivial com o FFMPEG:
ffmpeg -i vertical.mp4 -vf split[original][copy];[copy]scale=ih*16/9:-1,crop=h=iw*9/16,gblur=sigma=20[blurred];[blurred][original]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 output_hor.mp4
Ele cria um vídeo output_hor.mp4 em proporção 16:9, usando como base o vídeo vertical.mp4. Simples assim. Eis o resultado:
Eu não vou ensinar isso.
Passo 1:
O site oficial é ffmpeg.org. Na área de downloads, você vai achar executáveis para Linux, Mac e Windows. Para Windows há dois links principais. Eu sugiro que você vá no do BtBN, que levará até esta página do GitHub, onde você poderá baixar o arquivo ffmpeg-master-latest-win64-gpl.zip.
Passo 2:
Crie uma pasta chamada FFMPEG na raiz do disco C:\
Passo 3:
Abra o zip, você vai achar as pastas bin e doc. Copie ambas para a pasta c:\FFMPEG.
Passo 4:
Clique na área de pesquisa na barra de tarefas do Windows, digite Powershell. Ele abrirá uma janela parecida com esta. Clique na opção “Executar como Administrador”.
Passo 5:
Na janela da PowerShell, digite o comando:
setx PATH "%PATH%;C:\ffmpeg\bin" <enter>
Passo 6:
Feche a janela, abra uma janela do DOS comum e digite:
ffmpeg -version
Se tudo der certo você verá uma tela assim e o FFMPEG estará devidamente instalado em seu sistema.
Nem chegamos a arranhar as possibilidades do FFMPEG, as chances são que se você conseguir imaginar, ele consegue fazer, em se tratando de vídeo. Uma busca no Google, leitura da documentação ou até uma leve trapaça, perguntando ao ChatGPT se algo é possível, e você estará automatizando seus processos quase como mágica.
E sim, o FFMPEG tem integração com quase toda linguagem que você imaginar, mas um bom e velho bash ou batch já resolvem a maioria das necessidades.