Como posso reduzir o tamanho de um vídeo com o ffmpeg?

139

Como posso usar ffmpeg para reduzir o tamanho de um vídeo diminuindo a qualidade (o mais minimamente possível, naturalmente, mas preciso que ele seja executado em um dispositivo móvel que não tenha muito espaço disponível)?

Eu esqueci de escrever uma coisa ainda. Quando o vídeo pode usar legendas (* .srt ou * .sub) eu gostaria de convertê-las também para ajustar os parâmetros do arquivo de vídeo convertido.

    
por xralf 10.01.2012 / 22:45

5 respostas

167

Veja esta resposta. Citado abaixo por conveniência:

Calculate the bitrate you need by dividing 1 GB by the video length in seconds. So, for a video of length 16:40 (1000 seconds), use a bitrate of 1000000 bytes/sec:

ffmpeg -i input.mp4 -b 1000000 output.mp4

Additional options that might be worth considering is setting the Constant Rate Factor, which lowers the average bit rate, but retains better quality. Vary the CRF between around 18 and 24 — the lower, the higher the bitrate.

ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4
    
por 11.05.2012 / 07:36
18

A menos que você esteja procurando por uma taxa de bits específica, recomendo a opção -crf . Este é o mais comumente usado para a codificação x264 : link

Resumindo: um CRF de 23 faria filmes com qualidade de "DVD" (~ 700MB-1GB) e valores de CRF mais baixos seriam de maior qualidade (arquivos maiores).

    
por 14.01.2017 / 14:50
6

Você mencionou que deseja reduzir o tamanho do arquivo para caber em mais vídeos em um dispositivo móvel, que também é meu tipo de uso. Todas as respostas aqui são para reduzir a qualidade de compressão, mas ninguém mencionou a redução do tamanho do quadro de vídeo. É muito mais rápido, de 3 a 5 vezes mais rápido do que recomprimir na minha experiência. Veja os documentos do ffmpeg no dimensionamento para mais informações.

ffmpeg -i input.mkv -vf "scale=iw/2:ih/2" half_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/3:ih/3" a_third_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/4:ih/4" a_fourth_the_frame_size.mkv
    
por 02.06.2018 / 21:07
1

Você precisará usar a codificação de 2 passagens para "encaixar" um vídeo em um tamanho de arquivo designado (bitrate), sem reduzir a qualidade drasticamente. Este é um tópico bastante detalhado: link

    
por 12.06.2016 / 20:20
1

Eu tenho uma receita que eu originalmente criei para converter os vídeos em Motion JPEG que minha câmera antiga gera (são vídeos muito grandes, já que cada quadro é uma imagem JPEG inteira) para h264. Aqui está uma adaptação para outros tipos de vídeos (cursos, etc).

Não estou usando o ffmpeg , mas o mplayer e o mencoder . Primeiro, temos que demover o áudio com o mplayer:

mplayer -vo null -ao pcm:fast:file=<audio_pcm.wav> <video>
  • Os parâmetros -vo null e -ao null informam ao mplayer para não extrair vídeo.

Nas próximas etapas, faremos uma compactação de 3 passagens com o mencoder. Na primeira etapa, escolheremos uma compactação adequada do Modo de Qualidade Constante (parâmetro crf ) como ponto de partida:

mencoder <video> -ovc x264 \ 
         -x264encopts ratetol=100:preset=veryslow:crf=<value>:pass=1 \
         -nosound -o video1.h264
  • Você pode adicionar o parâmetro slow_firstpass ao -x264encopts se estiver paranóico com a qualidade final do vídeo. O manual Mencoder diz que esta opção desabilita alguns parâmetros que “melhoram significativamente a velocidade de codificação, tendo pouco ou nenhum impacto na qualidade do passe final”. Então, use-o apenas na última etapa.

  • Você deve tentar vários valores para crf - tente iniciar a partir de 25 e continue a aumentá-lo até observar os artefatos no vídeo resultante (valores mais altos compactam mais). Lembre-se de que os passes de codificação subsequentes melhorarão a qualidade escolhida para crf .

  • As alternativas para a predefinição veryslow são mais lentas , lentas , médias etc. Consulte o manual do mencoder para a lista completa.

  • ratetol controla a variação da taxa de bits - não tenho certeza se estou fazendo a coisa certa aqui, mas configuro para o valor máximo para deixar total liberdade para o mencoder para escolher a taxa de bits certa para cada cena.

Após o primeiro passo, você notará que a última linha fornece a taxa de bits média que você usará nas próximas etapas:

(...)
x264 [info]: kb/s:526.43

Altere o parâmetro crf , recomendado na primeira passagem, para taxa de bits , necessário nos passes subsequentes:

mencoder <video> -ovc x264 \
       -x264encopts slow_firstpass:ratetol=100:preset=veryslow:bitrate=526:pass=3 \
       -nosound -o video2.h264

Esta codificação de segunda passagem lerá as estatísticas geradas na primeira passagem ( divx2pass.log e divx2pass.log.mbtree ) para otimizar a compactação.

  • Note que você usará a mesma entrada de vídeo, não a gerada pelo primeiro passo - o primeiro vídeo de saída é útil apenas para verificar a qualidade inicial.

  • Note também que pass=3 ( não pass=2 ) gerará um novo arquivo de estatísticas, para que você possa repetir a última etapa quantas vezes quiser. Eu costumo fazer pass=3 duas vezes, sempre prestando atenção na taxa de bits do resultado.

Enquanto isso, você também pode compactar o áudio usando lame ou oggenc :

oggenc -q<n> <audio_pcm.wav>

Por fim, remontamos áudio e vídeo

mencoder -audiofile <audio>.ogg video2.h264 -oac copy -ovc copy \
         -of lavf -lavfopts format=mp4 -o <video>.mp4
  • O formato de arquivo -of lavf -lavfopts format=mp4 gera mp4 usando os muxers de lavopts.
por 20.12.2016 / 02:36