Como posso descobrir qual será o tamanho do meu arquivo codificado?

6

Estou convertendo um vídeo usando o seguinte comando:

ffmpeg -i "input.avi" -vcodec mpeg4 -r 15 -sameq "output.avi"

No entanto, estou interessado apenas no tamanho do arquivo output.avi. Existe um comando que eu possa dar ffmpeg para que ele realmente não escreve um arquivo, mas me diz o quão grande seria?

    
por Fidel 23.10.2011 / 13:56

1 resposta

9

Você não pode realmente estimar o tamanho de um arquivo de vídeo antes da codificação. Isso não é possível devido à maneira como o codec funciona. Ele aloca uma certa quantidade de bits para cada quadro, mas esse valor geralmente depende do conteúdo do próprio quadro.

No entanto, existem algumas soluções.

1. O barato:

Deixe-o codificar, verifique o tamanho do arquivo e remova o arquivo novamente

2. A "solução alternativa":

Calcule o tamanho do arquivo usando uma calculadora simples. Isso só funciona ao usar taxa de bits constante. Especifique-o com, por exemplo, -b 500k para 500 kBit / s. Você precisa ter certeza de que especificou uma taxa de bits que o codec pode usar. por exemplo, não há como compactar um vídeo de 1080p com 200k de taxa de bits em mpeg4 , porque precisaria de muito mais do que isso.

3. A solução "real":

A última opção que eu tinha em mente era canalizar a saída para /dev/null e medir o tamanho do arquivo canalizado. Isso, no entanto, não funcionará para todos os formatos, porque o FFmpeg precisa de um arquivo procurado para produzir uma saída válida.

Ainda assim, para AVI, funciona muito bem. O comando a seguir será canalizado para /dev/null , não deixando nenhum rastro do próprio arquivo e, por fim, emitindo o tamanho do arquivo codificado.

ffmpeg -i input.avi -vcodec mpeg4 -b 3M -f avi pipe:1 | pv > /dev/null

... por exemplo, assim:

5.42MB 0:00:10 [ 521kB/s]

O que isso faz?

  • Você precisa especificar o formato usando -f avi . Caso contrário, o FFmpeg não saberá qual formato usar.
  • pipe:1 diz ao FFmpeg para gravar a saída em um pipe .
  • Vamos inserir essa saída no visualizador de canais , em curto pv .
  • O visualizador de tubulação medirá o tamanho transferido e enviará seu vídeo para /dev/null .

A única desvantagem é que a saída parece um pouco estranha até o vídeo terminar. Ainda não encontrei uma maneira de desabilitar totalmente a saída do FFmpeg e obter pv para trabalhar com isso.

    
por 23.10.2011 / 16:23

Tags