Quero reduzir o tamanho de um vídeo para poder enviar por e-mail e tal. Olhei para esta pergunta: Como posso reduzir o tamanho de um vídeo com o ffmpeg? onde recebi bons conselhos sobre como reduzi-lo. O problema é que eu preciso calcular manualmente a taxa de bits. E também ao fazer isso eu tive que terminar com tentativa e erro manual.
Existe alguma boa maneira de usar ffmpeg
(ou outra ferramenta) para reduzir o tamanho de um vídeo para um tamanho de destino ?
Nota devido a um comentário de frostschutz:
Preocupar-se muito com o tamanho e optar por um tamanho de arquivo fixo, independentemente da duração / resolução / taxa de quadros / conteúdo do vídeo, não dará resultados satisfatórios na maioria das vezes... Carregue-o em algum lugar, envie o link por e-mail. Se você deve codificá-lo, defina um nível de qualidade, deixe a taxa de bits dinâmica. Se for óbvio que o tamanho não será atendido, cancele a codificação e adapte o nível de qualidade de acordo. Enxague e repita.
Bom conselho em geral, mas não se adequa ao meu caso de uso. O upload para um link externo não é uma opção devido a limitações técnicas, sendo uma delas que o receptor não possui acesso http.
Também posso esclarecer que NÃO estou procurando exatamente o tamanho que estou especificando. É suficiente se for razoavelmente próximo do que eu quero (talvez até 5 ou 10% mais baixo ou mais), mas deve ser garantido que não excederá meu limite de destino.
A resposta de @philip-couling está próxima, mas faltando várias peças:
length
(em vez de usá-lo com precisão ou arredondar para cima) fará com que o tamanho do arquivo exceda ligeiramente o tamanho de destino-b
sinalizador especifica a taxa de bits média: na prática, o codificador permitirá que a taxa de bits salte um pouco, e o resultado pode ultrapassar o tamanho do seu alvo. No entanto, você pode especificar uma taxa de bits máxima usando-maxrate
e-bufsize
Para o meu caso de uso, eu também queria uma taxa de bits de áudio codificada e apenas ajustar o vídeo de acordo (isso também parece mais seguro, não tenho 100% de certeza que o
-b
sinalizador do ffmpeg especifica a taxa de bits para fluxos de vídeo e áudio juntos ou não).Levando tudo isso em consideração e limitando a estritamente 25 MB:
Observe que quando
-maxrate
e-bufsize
limitar a taxa de bits máxima, necessariamente a taxa de bits média será menor, então o vídeo ficará abaixo do tamanho do alvo em até 5-10% em meus testes (em um vídeo de 20 segundos em vários tamanhos de alvo). O valor de-bufsize
é importante, e o valor calculado usado acima (com base no tamanho do alvo) é meu melhor palpite. Muito pequeno e diminuirá muito a qualidade e diminuirá o tamanho do alvo em 50%, mas muito grande e acho que poderia ultrapassar o tamanho do alvo?Para dar mais flexibilidade ao codificador, se você não tiver um tamanho de arquivo máximo estrito, remover
-maxrate
e-bufsize
resultará em melhor qualidade, mas pode fazer com que o vídeo ultrapasse o tamanho de destino em 5% nos meus testes. Mais informações na documentação , onde você verá este aviso:Isenção de responsabilidade: Isso não parece funcionar perfeitamente. Torna-se ligeiramente a grande.
É relativamente simples juntar duas outras respostas aqui:
Supondo que você queira um arquivo de 10 MB (10485760 bytes), você pode usar
ffprobe
para encontrar a duração e fazer com que o shell execute o cálculo.Apenas tome cuidado porque ffprobe reportará casas decimais que irão atrapalhar a aritmética do shell. Eu costumava
${length%.*}
retirar as casas decimais:Não há reputação suficiente para comentar. Ajustou o código do @tobek acima para funcionar como um arquivo de lote windows/dos.