É possível reduzir e fixar o tamanho de forma razoavelmente aproximada de um arquivo de vídeo usando o pacote ffmpeg.
Uma das formas é alterando
para menor o
bitrate do arquivo.
O pacote ffmpeg evidentemente precisa estar instalado:
sudo apt install ffmpeg
Para essa finalidade o processamento ffmpeg possui a sintaxe geral:
ffmpeg -i input.mp4 -b bitrate output.mp4
A essa fórmula geral pode ser necessário acrescentar os codecs utilizados e outros parâmetros dependendo do que se queira obter.
Informações gerais sobre um arquivo de vídeo se pode obter através do ffmpeg usando o comando:
ffmpeg -i nome_do_arquivo_video
exemplos:
ffmpeg -i video.mp4
ffmpeg -i Trio_Sinha_Flor-Forro_Floreado-Sr_Brasil-221115.mp4
ffmpeg -i "Marcus Viana-Raya Hilal-Transfônica Orkestra-SOB-O-SOL-em_Árabe.mp4"
O 'bitrate' do comando acima mencionado corresponde a um valor numérico, que pode ser expresso em kbps (kilobit ou mil bits por segundo).
De uma forma geral o bitrate que corresponde ao tamanho de arquivo final desejado é o quociente da divisão entre o tamanho desejado medido em bits e o tempo de duração do arquivo de vídeo medido em segundos.
Assim sendo:
novo bitrate = tamanho desejado do arquivo de saída / tempo de duração do vídeo
O tempo de duração do arquivo de vídeo é fácil de ser obtido, bastando usar qualquer player de vídeo (totem, vlc, etc) e dele capturar a informação que servirá de denominador na fórmula acima ou ainda usando o ffmpeg -i antes mencionado.
Além dessa forma manual e empírica de obtenção do tempo de duração do arquivo de vídeo, também se pode utilizar o próprio ffmpeg para obter essa informação de maneira mais direta e precisa da seguinte forma:
ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=nk=1:nw=1 nome_arquivo_entrada
Dessa forma, exemplificando:
Um arquivo original que possui o tamanho de 28,1 MB, o que corresponde a 28.107.356 bytes ou 28.107 Kbytes e que possui um bitrate original de 2269 kbps, se quer que o arquivo de saída que se pretende obter seja de 20MB (uma redução aproximada de 30%), então se faz:
tamanho desejado do arquivo de saída=20*1000*8 = 160.000
O ffmpeg utiliza o sistema internacional de unidades (SI), também conhecido como sistema comercial de unidades de medida, então os prefixos métricos são expressos em 1000 e não em 1024 do sistema binário.
Se o tempo de duração apurado desse arquivo de vídeo for, por exemplo, de 1 minuto e 39 e 8 décimos de segundos, ou seja, de 99 segundos, então o novo bitrate alvo será:
160.000 / 99.08 = 1615 kbps (aproximados)
Esse é o valor que deverá ser levado para aquele primeiro comando mencionado no início deste post, ficando dessa forma:
ffmpeg -i input.mp4 -b 1615k output.mp4
onde evidentemente input.mp4 se substitui pelo nome concreto do arquivo de entrada e output.mp4 pelo nome do arquivo que se deseja na saída do processamento.
Se um maior grau de aproximação for desejável se pode descontar desse valor o bitrate que corresponde ao áudio integrado no arquivo containner, uma vez que ele ocupa certo espaço (geralmente não muito significativo, notadamente para arquivos de vídeo grandes), obtendo-se então o novo bitrate alvo líquido a ser atingido.
O bitrate do arquivo de áudio embutido se pode obter através do ffmpeg fazendo:
ffprobe -v error -select_streams a:0 -show_entries stream=bit_rate -of default=nk=1:nw=1 nome_do_arquivo_entrada
O valor do bitrate que se obtiver desse comando se divide por 1000 e então se desconta o resultado daquele valor alvo antes obtido, dessa forma se obtendo o bitrate líquido necessário para atingir o tamanho alvo desejado do arquivo de saída.
No exemplo, supondo que o resultado para o bitrate de áudio seja:
bitrate de áudio = 125.639 / 1000 = 125
Apurando-se então o bitrate líquido necessário mediante a subtração entre os dois valores:
bitrate líquido necessário = 1615 - 125 = 1490 kbps
Logo, esse novo valor de bitrate líquido é o que será levado para o comando de redimensionamento do arquivo de entrada:
ffmpeg -i input.mp4 -b 1490k output.mp4
O tamanho do arquivo de saída que se obtém é um valor aproximado àquele estipulado como alvo, pois como um arquivo de vídeo é, desde sempre, composto de inúmeros frames (=fotogramas) é utilizado um critério médio de redução de bits em cada frame, cuja soma irá compor o arquivo final, porém o número não é exatamente preciso, embora muito aproximado para arquivos suficientemente grandes. Arquivos pequenos, exatamente pela pequena amostragem, tendem a apresentar uma variação maior entre o desejado e o realmente obtido.
Há outras formas de obter esse redimensionamento de arquivo de vídeo ainda através do ffmpeg mediante a utilização do parâmetro crf (Constant Rate Factor), mas que não está aqui abordado.
Note que o foco do que aqui se aborda é o cálculo do bitrate necessário e não o comando final propriamente dito, pois esse, dependendo do tipo de arquivo que entrada que se quer manipular e com qual finalidade, pode requerer tais e quais parâmetros, especialmente definição de codecs, assunto esse que não é objeto destas considerações.
Não sou especialista no segmento audiovisual e na verdade muito pouco concretamente conheço sobre essas técnicas, os eventuais usos são apenas amadorísticos, se tanto, além do que também não me é uma área de interesse mais direto, certamente haverá pessoal melhor qualificado aqui no Fórum, verdadeiramente profissional, que poderá adicionar informações relevantes sobre arquivos audiovisuais, além do que Fóruns realmente especializados nesse segmento talvez sejam uma melhor opção do que este Fórum, cuja temática central é sistema operacional, para obter informações técnicas mais precisas e detalhadas.
Na essência é isso.