2 votes

Utiliser ffmpeg pour générer des vignettes vidéo sans aucune distorsion

Pour obtenir un 200x100 vignette d'une vidéo, je le fais ffmpeg -ss 100 -i /tmp/video.mp4 -frames:v 1 -s 200x100 image.jpg . Mais si la vidéo source n'a pas le même rapport hauteur/largeur que le 200x100 la vignette est déformée (étirée ou écrasée, horizontalement ou verticalement) et l'image n'est pas belle à voir.

Existe-t-il un moyen pour que ffmpeg peut déterminer, par exemple, qu'un 500x200 la vidéo est 100px trop large, et supprimer 50px de la droite et 50px à partir de la gauche, réalisant la vidéo 400x200 ? Et parce que 400x200 a le même rapport hauteur/largeur que 200x100 la vignette n'est pas déformée.

Je sais qu'il existe d'autres outils qui peuvent faire cela avec les vignettes générées par ffmpeg mais je préférerais le faire à l'intérieur ffmpeg et de ne pas avoir à traiter à nouveau les vignettes.

4voto

Gyan Points 28168

Si la taille de votre vignette est fixée à 200x100, exécutez alors

ffmpeg -ss 100 -i /tmp/video.mp4 -vf "scale='if(gt(dar,200/100),100*dar,200)':'if(gt(dar,200/100),100,200/dar)',setsar=1,crop=200:100"  -frames:v 1 image.jpg

Le filtre d'échelle vérifie le rapport d'aspect de la source et l'échelle de sorte qu'une dimension s'adapte à la toile 200x100 et que l'autre la dépasse, à moins qu'il ne s'agisse d'une correspondance parfaite. Ensuite, le filtre de recadrage recadre l'image à 200x100 à partir du centre, ce qui permet d'éliminer la zone hors limites.

4voto

LordNeckbeard Points 9321

Vous pouvez utiliser le force_original_aspect_ratio dans l'option échelle filtre.

ffmpeg -ss 100 -i /tmp/video.mp4 -frames:v 1 -q:v 2 -vf "scale=200:100:force_original_aspect_ratio=increase,crop=200:100" image.jpg

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X