O FFmpeg pode capturar imagens de vídeos que podem ser usados como miniaturas para representar o vídeo. As formas mais comuns de fazer isso são capturadas no FFmpeg Wiki .
Mas não quero escolher quadros aleatórios em alguns intervalos. Encontrei algumas opções usando filtros no FFmpeg para capturar alterações de cena:
O filtro thumbnail
tenta encontrar os quadros mais representativos no vídeo:
ffmpeg -i input.mp4 -vf "thumbnail,scale=640:360" -frames:v 1 thumb.png
e o comando a seguir seleciona apenas os quadros que têm mais de 40% das alterações em comparação com as anteriores (e provavelmente são as mudanças de cena) e gera uma sequência de 5 PNGs.
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.4),scale=640:360" -frames:v 5 thumb%03d.png
Crédito de informação para os comandos acima para Fabio Sonnati . O segundo parecia melhor, pois eu podia obter n imagens e escolher o melhor. Eu tentei e gerou a mesma imagem 5 vezes.
Um pouco mais de investigação me levou a:
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.png
-vsync vfr
garante que você obtenha imagens diferentes. Isso ainda escolhe sempre o primeiro quadro do vídeo; na maioria dos casos, o primeiro quadro é de créditos / logotipo e não tem significado, então adicionei um -ss
3 para descartar os primeiros 3 segundos do vídeo.
Meu comando final é assim:
ffmpeg -ss 3 -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.jpg
Foi o melhor que pude fazer. Percebi que, como escolho apenas 5 vídeos, todos são principalmente do início do vídeo e podem perder cenas importantes que ocorrem mais tarde no vídeo.
Gostaria de escolher seu cérebro para outras opções melhores.
mjpeg
codificador para mim também, e também verifiquei jpegoptim
e exiv2
, os quais funcionam bem para mim com todos os resultados JPG dos seus comandos de exemplo.
libopenjpeg
.. não tenho certeza se isso faz alguma diferença.