Como reduzir o tamanho de vídeos no Linux com ffmpeg


Sabe quando você tem um vídeo e você quer compartilhar na internet? Pois então, hoje, na maior parte dos casos, isso não é um problema em termos de plataforma, visto que muitas plataformas aceitam vídeos sem problema nenhum. O problema, entretanto, é a velocidade de upload da maior parte das conexões de internet aqui no Brasil: Aqui, apesar de assinar uma conexão com centenas de Mbps, por exemplo, eu possuo apenas 25 Mbps de upload. Não que hoje seja MUITO demorado quando você compara com, por exemplo, a conexão discada (famosos 56 Kbps que na verdade se traduziam em apenas 8 Kbps em dias em que a conexão estava boa), mas, no dia a dia moderno, o upload de um vídeo qualquer pode levar...bastante tempo.

Logo, a possibilidade de otimizar o vídeo de forma a reduzir o seu tamanho enquanto mantendo uma boa qualidade acaba sendo bem atraente. É dificil dizer em números exatos, mas, na minha experiência, recodificar um vídeo localmente e depois enviar acaba tomando bem menos tempo do que só..enviar, daí a razão por trás desse post.

Antes de finalmente apresentar o script, um pequeno aviso:

Os vídeo ao qual me refiro nesse post são, majoritariamente, gravações de tela, que são muito úteis para mostrar um recurso em desenvolvimento, ou então documentar um bug. Nesses vídeos, pode haver um pequeno bloco no qual a imagem da sua webcam aparece, mas os comandos aqui apresentados não são necessariamente otimizados para um vídeo contendo SOMENTE isso. Em virtude disso, o framerate do vídeo é reduzido para apenas 30 FPS, o que reforça a intenção do script de ser mais otimizado para uso em vídeos em que muitos quadros acabam por serem estáticos.

Segue o script, que você pode salvar como prepare-video no seu computador:

#!/bin/bash
ffmpeg -i "$1" -crf 27 -preset veryfast -movflags +faststart -r 30 -vcodec libx264 -acodec aac "$2"

Antes de executar, lembre-se de dar permissões de execução (chmod +x prepare-video) para o comando em questão. A partir daí, você pode usar o seguinte comando para converter vídeos:

prepare-video video-de-entrada.avi video-de-saida.mp4

Substituindo video-de-entrada.avi pelo vídeo que você quer converter e video-de-saida.mp4 pelo arquivo para o qual o vídeo convertido deve ser salvo.

Esse é o script que eu tenho usado há anos, só que com o nome convert-to-whatsapp, pois foi o motivador inicial para criar tal script: O WhatsApp é CHATO no suporte a vídeos, e esse script é quem me permitia codificar um vídeo que fosse suportado pelo WhatsApp nativamente.

Note que um grande problema desse script é que ele roda todo o processo de decodificação e codificação no processador. Em um processador moderna, com 8 núcleos, isso normalmente não é um grande problema, mas em processadores mais antigos isso pode ser um problema.

Movendo a carga para a placa de vídeo

Como documentado acima, esse é o script que eu uso já há alguns bons anos. Entretanto, como tudo na vida, sempre há espaço pra melhorias. Recentemente, eu fiz uma pequena melhoria no meu computador: troquei a minha placa de vídeo, que antes era uma AMD RX 580 8GB, por uma NVIDIA RTX 4090. Em virtude disso, a possibilidade de usar a placa de vídeo para fazer todo o processo de decodificação e codificação se tornou mais...real, uma vez que infelizmente a AMD é bem fraca nesse aspecto (mesmo nas últimas gerações de placa de vídeo).

Se você tem uma placa de vídeo da NVIDIA com suporte a NVENC, uma possibilidade é usar esse comando aqui para conseguir resultados similares à versão com processador, conforme gerado pelo ChatGPT (a ideia é que esse comando seja equivalente ao anterior):

#!/bin/bash
ffmpeg -hwaccel cuvid -i "$1" -c:v h264_nvenc -preset:v fast -rc:v vbr -cq:v 19 -profile:v high -level:v 4.2 -b:v 1200k -maxrate:v 2400k -bufsize:v 2400k -c:a aac -b:a 128k -movflags +faststart -r 30 "$2"

A parte curiosa? Apesar de ser um pouco mais rápida do que a versão que roda somente em processador, esta versão gera arquivos MUITO maiores. Segue uma tabela comparando os resultados:

Configuração do CodificadorTamanho final do arquivoTempo para realizar a conversão
Arquivo Original1.1 GB-
Usando somente o processador106 MB1 minuto e 50 segundos
Usando somente a placa de vídeo293 MB1 minuto e 34 segundos

Para fins de documentação, o meu processador é um AMD Ryzen 7 5800X3D, um dos processadores mais poderosos da atualidade...para jogos.

Aí você me pergunta: Tá, mas pra quê eu vou utilizar a versão baseada em GPU, então? Bom, eu não faço ideia, ¯\_(ツ)_/¯. Ao meu ver, a maior vantagem de usar o codificador baseado em GPU é que você acaba movendo para a GPU toda a carga de processamento, o que é bem útil em algumas situações.

Outras alternativa usando somente o processador

De acordo com o ChatGPT, uma outra boa alternativa - ainda usando somente o processador - para codificar os vídeos com o propósito desse post, é o seguinte script:

#!/bin/bash
ffmpeg -y -i "$1" -c:v libx264 -preset medium -crf 28 -r 30 -c:a aac -b:a 192k -movflags +faststart "$2"

Fica a seu critério qual utilizar. Pelos meus testes, esse comando provê muda algumas configurações para ter um pouco mais de qualidade de imagem, MAS naturalmente isso aumenta um pouco o tamanho do arquivo. Além disso, o comando demora mais para executar, veja a tabela abaixo:

Configuração do CodificadorTamanho final do arquivoTempo para realizar a conversão
Arquivo Original1.1 GB-
Meu script106 MB1 minuto e 50 segundos
Script do ChatGPT128 MB2 minutos e 26 segundos

Se você valoriza mais qualidade e não está tão preocupado em ter a execução mais demorada nem o tamanho ligeiramente maior, essa pode ser definitivamente uma opção.

Conclusão

O ffmpeg é uma ferramenta extremamente poderosa para esse tipo de manipulação de vídeo, e esse tipo de script, em torno de ferramentas assim, ajuda MUITO a facilitar o uso de tarefas cotidianas no computador. Hoje em dia, eu não gravo tantos vídeos quanto gostaria, mas ainda assim esse script se torna muito útil para compartilhar vídeos na internet, em especial considerando os limites da velocidade de upload do plano de internet aqui de casa.

E você, grava vídeos para a internet? Tem algum script maneiro para compartilhar? Deixe nos comentários! 😀


Posts relacionados


Deixe um comentário

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.