FFmpeg peut capturer des images à partir de vidéos qui peuvent être utilisées en tant que vignettes pour représenter la vidéo. La plupart des manières de le faire sont décrites dans le wiki de FFmpeg .
Mais, je ne veux pas choisir des images aléatoires à certains intervalles. J'ai trouvé quelques options en utilisant des filtres sur FFmpeg pour capturer les changements de scène:
Le filtre thumbnail
tente de trouver les images les plus représentatives de la vidéo:
ffmpeg -i input.mp4 -vf "thumbnail,scale=640:360" -frames:v 1 thumb.png
et la commande suivante sélectionne uniquement les images contenant plus de 40% des modifications par rapport aux précédentes (et donc probablement des modifications de scènes) et génère une séquence de 5 fichiers PNG.
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.4),scale=640:360" -frames:v 5 thumb%03d.png
Crédit d'information pour les commandes ci-dessus à Fabio Sonnati . La seconde me semblait meilleure car je pouvais obtenir n images et choisir le meilleur. Je l'ai essayé et il a généré la même image 5 fois.
Une enquête plus poussée m'a amené à:
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.png
-vsync vfr
assure que vous obtenez des images différentes. Cela choisit toujours toujours la première image de la vidéo. Dans la plupart des cas, la première image est un générique / logo et n'a pas de sens. J'ai donc ajouté un -ss
3 pour supprimer les 3 premières secondes de la vidéo.
Ma dernière commande ressemble à ceci:
ffmpeg -ss 3 -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.jpg
C'était le mieux que je puisse faire. J'ai remarqué que, puisque je ne sélectionne que 5 vidéos, toutes datent pour la plupart du début de la vidéo et risquent de manquer des scènes importantes qui se produisent plus tard dans la vidéo.
Je voudrais choisir votre cerveau pour toute autre meilleure option.
mjpeg
encodeur pour moi, et j'ai également vérifié jpegoptim
et exiv2
, les deux fonctionnant bien pour moi avec tous les résultats JPG de vos exemples de commandes.
libopenjpeg
.. ne sais pas si cela fait une différence.