Aller au contenu
Allin

Extraire des images fixes d'une vidéo — et pourquoi elles paraissent plus molles que la vidéo

Publié le 10/08/2026 · 12 min de lecture · Outils fichiers

Daniel Okonkwo

Daniel OkonkwoDéveloppeur front-end et rédacteur Tech chez Allin

Performance web · Formats de fichiers

Vérifié à partir de 4 sources

Voir le profil
En bref

L'extracteur d'images fait tourner ffmpeg dans ton navigateur et construit l'une de trois commandes. Une seule image : -ss <secondes> -i <fichier> -frames:v 1 -q:v 2. Le déplacement est placé avant l'entrée, donc ffmpeg saute à l'image-clé précédente la plus proche et décode jusqu'à l'instant demandé. Un nombre fixe d'images : -i <fichier> -vf fps=<nombre divisé par la durée> -frames:v <nombre>, qui les répartit régulièrement sur tout le clip. Une image toutes les N secondes : -i <fichier> -vf fps=<1 divisé par N> -frames:v <nombre>. Le JPG est écrit avec -q:v 2, le deuxième meilleur échelon de l'échelle MJPEG qui va de 2 à 31 ; le PNG ne porte aucun indicateur de qualité, puisqu'il est sans perte. Quel que soit le mode, l'outil s'arrête à 60 images et le dit à l'écran avant de commencer. Deux choses à savoir avant de faire confiance à l'image. D'abord, une image extraite n'est pas une photographie. La vidéo ne stocke une image complète qu'aux images-clés, en général une toutes les une à dix secondes, et reconstruit tout ce qu'il y a entre à partir de listes de différences. Sors une image du milieu de cette suite et tu obtiens la reconstruction du décodeur, plus molle et plus carrelée qu'une photo prise à la même résolution ; les images-clés font exception et sont vraiment nettes. Ensuite, les boutons de largeur sont des plafonds et non des cibles. Ils deviennent scale=w='min(W,iw)':h=-2, donc un bouton veut dire « au plus cette largeur » : demande moins que la source et tu l'obtiens, demande plus et l'image revient à sa taille. Un clip portrait de 1080x1920 auquel on demande 1280 ressort en 1080x1920, intact, parce qu'agrandir une image n'invente rien et ne fait que grossir le fichier.

Trois commandes se cachent derrière trois boutons : une image à un instant donné, un nombre fixe réparti sur le clip, ou une toutes les N secondes. Voici les arguments exacts, le plafond de 60 images et la raison pour laquelle une image prise au milieu d'un clip compressé ne sera jamais aussi nette qu'une image-clé.

Trois boutons, trois commandes ffmpeg différentes

L'interface propose un nombre d'images, un intervalle, ou un seul instant, et chacun assemble une commande différente. « Un nombre d'images » divise le nombre saisi par la durée du clip et passe le résultat au filtre fps : demande 12 images sur un clip de 6 secondes et le filtre devient fps=2.000000, avec -frames:v 12 pour l'arrêter là. « À intervalle régulier » inverse plutôt l'intervalle — une image toutes les 5 secondes donne fps=0.200000 — et calcule le nombre à partir de la durée. « Une seule image » saute complètement le filtre et utilise -ss avant l'entrée avec -frames:v 1.

Ce placement compte plus qu'il n'y paraît. Mettre -ss avant -i permet à ffmpeg de sauter directement à un point de repère au lieu de décoder tout le fichier jusqu'à l'instant demandé, ce qui fait la différence entre une fraction de seconde et une longue attente sur un gros clip. Un vieux conseil dit qu'un déplacement en entrée n'est précis qu'à l'image-clé ; ce n'est plus vrai depuis des années, et cette version se déplace précisément par défaut quand elle transcode : elle décode le court passage entre le point de repère et l'instant demandé, puis le jette. L'image que tu vois sur le curseur d'aperçu est celle que tu obtiens.

Une image extraite n'est pas une photographie

Tout codec vidéo moderne ne stocke des images complètes que de loin en loin. Ce sont les images-clés, et tout ce qui les sépare est écrit sous forme d'instructions : ce bloc s'est déplacé de quatre pixels vers la gauche, cette zone est identique à celle d'avant, ce carré a changé de ces petites quantités. Un enregistrement d'une heure à 30 images par seconde contient 108 000 images mais peut-être seulement quelques milliers d'images complètes. Quand tu demandes l'image à 47,3 secondes, le décodeur retrouve la dernière image-clé qui la précède et rejoue toutes les instructions depuis pour reconstituer ce qui devrait s'afficher.

La reconstitution est assez fidèle pour être regardée et décevante à figer. Comme l'encodeur a dépensé ses bits sur ce qui change, un fond immobile qui n'a pas été rafraîchi depuis deux secondes porte deux secondes d'approximation accumulée. Un flou de mouvement qui se lit comme du mouvement à 30 images par seconde se lit comme une bavure quand on s'arrête dessus. Et tout bloc que l'encodeur a jugé peu regardé — zones sombres, zones floues, panoramiques rapides — est précisément là où le quantificateur a économisé. C'est pour cela qu'une image tirée d'un clip très compressé paraît plus molle qu'une photographie de la même scène au même nombre de pixels.

Les images-clés font exception, et elles valent la peine d'être cherchées. Si l'image compte — une plaque, un visage, un tableau de score — extrais plusieurs images autour de l'instant plutôt qu'une seule. Sur dix images consécutives, l'une sera généralement une image-clé ou proche d'une, et elle sera visiblement plus propre que ses voisines. Les modes intervalle et nombre facilitent cela : ils ne permettent jamais de désigner une image-clé directement, mais un échantillonnage assez dense finit par tomber dessus.

Les boutons de largeur sont des plafonds, pas des cibles

Quatre boutons proposent D'origine, 640, 1280 et 1920. Choisis-en un et la chaîne de filtres reçoit scale=w='min(W,iw)':h=-2, qui plafonne la largeur à ce nombre et laisse ffmpeg calculer une hauteur qui conserve la forme, arrondie au nombre pair le plus proche. Le mot qui compte est « plafonne ». Sur un clip 1920x1080, le bouton 1280 donne 1280x720, exactement ce qu'on attend. Sur un clip portrait 1080x1920, le même bouton donne 1080x1920 — la source, intacte — parce que 1280 est plus large que le clip et que l'outil retient le plus petit des deux.

Ce plafond vaut d'être là, parce qu'agrandir une image n'apporte rien. Le suréchantillonnage ne peut inventer aucun détail : il interpole, donc l'image devient plus grande et plus lourde sans devenir plus nette — plus molle même, parce que l'interpolation lisse le peu de détail qui a survécu à la compression vidéo. Sans ce plafond, les boutons se lisent comme des cibles, et un clip portrait auquel on demandait 1920 ressortait en 1920x3414 : plus de trois fois les pixels de la source, tous devinés. Si tu veux une image plus grande que ce que contient le clip, la réponse n'est pas ici — c'est une source filmée à une résolution supérieure.

Soixante images — et le plafond ne veut pas dire la même chose des deux côtés

L'outil ne produit pas plus de 60 images en une fois, et il le dit avant de démarrer : demande-en 500 et la ligne sous les boutons de mode affiche 60 et ajoute un avertissement. Jusque-là, c'est honnête. Ce que l'avertissement ne dit pas, c'est que le plafond se comporte différemment dans les deux modes par lot, et cette différence décide si tu obtiens un survol de toute la vidéo ou seulement de son début.

En mode « nombre », la cadence d'échantillonnage vient de la durée : 60 images sur un enregistrement de vingt minutes donne fps=0.050000, donc les images tombent toutes les vingt secondes du début à la fin. En mode « intervalle », la cadence vient de ton intervalle et le nombre n'est qu'un signal d'arrêt : une image par seconde sur ce même enregistrement de vingt minutes donne fps=1.000000 avec -frames:v 60, et ffmpeg s'arrête après soixante secondes de rushes. Tu obtiens la première minute de la vidéo, soixante fois, et rien des dix-neuf autres. Le chiffre affiché dit vrai sur le nombre de fichiers ; il ne dit rien de l'endroit d'où ils viennent. Si tu veux couvrir la vidéo, utilise le mode « nombre ».

Encore une chose que l'interface dit de travers sur elle-même. La note sous les boutons affirme que chaque image est un téléchargement distinct et qu'il n'y a pas d'archive pour les regrouper. Il y en a une : le bouton « Tout télécharger » rassemble les images dans images-video.zip dès qu'il y en a plus d'une, et ne sollicite le navigateur qu'une fois. Les boutons de téléchargement individuels sous chaque vignette servent quand tu veux deux images sur soixante, pas parce que l'outil ne saurait pas faire un zip.

À quoi servent vraiment les images extraites

Trois usages couvrent presque tout ce pour quoi on extrait des images. La planche-contact : douze à vingt-quatre images réparties sur tout le clip, imprimées en petit, c'est le moyen le plus rapide de trouver où se passe quelque chose dans une heure de rushes sans faire défiler. Le mode « nombre » avec la largeur sur 640 est fait pour ça. La vignette : les plateformes jugent une vidéo sur sa première image fixe, et le choix automatique est presque toujours pire que le tien. Utilise le mode image unique, fais glisser le curseur jusqu'à ce que l'aperçu montre l'image voulue, et extrais en largeur d'origine. Et la preuve : un instant qu'il faut montrer à quelqu'un qui ne regardera pas la vidéo.

Pour ce troisième usage, choisis le PNG et ne touche pas à la largeur. Un JPG à -q:v 2 est très bon, mais c'est une deuxième génération avec perte par-dessus la compression de la vidéo, et quiconque examinera l'image de près regardera les artefacts de deux encodeurs au lieu d'un. Le PNG conserve exactement ce que le décodeur a produit, les fichiers pèsent cinq à quinze fois plus, et rien n'est ajouté. L'image restera une reconstitution et non une photographie — aucun format n'y change rien — mais au moins cette reconstitution sera la seule approximation qu'elle contient.

Ce que chaque bouton de largeur fait à trois formats de source courants (scale=w='min(W,iw)':h=-2, hauteur arrondie au nombre pair le plus proche)
Bouton de largeurDepuis 1080×1920 (téléphone, portrait)Depuis 1920×1080 (paysage)Depuis 3840×2160
D'origine1080×1920 inchangé1920×1080 inchangé3840×2160 inchangé
640 px640×1138 — 65 % de pixels en moins640×360 — 89 % de pixels en moins640×360 — 97 % de pixels en moins
1280 px1080×1920 inchangé — plafonné1280×720 — 56 % de pixels en moins1280×720 — 89 % de pixels en moins
1920 px1080×1920 inchangé — plafonné1920×1080 inchangé1920×1080 — 75 % de pixels en moins
Extraire des images vidéoSors des images fixes d'une vidéo — une seule, choisie au curseur et vue avant extraction, un nombre fixé, ou une toutes les quelques secondes.Essayer l'outil

Questions fréquentes

Faut-il choisir le JPG ou le PNG ?
Le JPG pour tout ce que tu vas regarder, partager ou coller dans un document : l'outil l'écrit à -q:v 2, deuxième meilleur réglage sur une échelle qui va de 2 à 31, et les artefacts qu'il ajoute sont bien plus discrets que ceux déjà présents dans la vidéo. Le PNG pour tout ce qui sera examiné, agrandi ou discuté, parce qu'il n'ajoute rien du tout : il conserve la sortie du décodeur octet pour octet. Compte des fichiers PNG cinq à quinze fois plus lourds que le JPG équivalent. Il n'y a de curseur de qualité ni pour l'un ni pour l'autre : le niveau JPG est figé dans le code et le PNG n'a pas de niveau à régler.
Pourquoi l'image extraite est-elle plus floue que la vidéo ne le paraissait ?
Parce que le mouvement masque la compression et que l'arrêt la révèle. À 30 images par seconde, ton œil intègre trente approximations par seconde et lit le résultat comme une scène nette ; arrête-toi sur l'une d'elles et il ne reste que l'approximation. De plus, l'image que tu as choisie n'est probablement pas une image-clé : c'est une reconstitution bâtie sur une chaîne d'instructions de différence. Essaie d'extraire une petite rafale autour du même instant et compare : l'une sera nettement plus propre, et celle-là est sur une image-clé ou tout près.
Puis-je récupérer absolument toutes les images de la vidéo ?
Pas en une fois : le plafond est de 60 images, soit un peu plus de deux secondes à 25 images par seconde. Ce plafond n'est pas arbitraire — soixante images en pleine résolution représentent déjà des dizaines ou des centaines de mégaoctets tenus en mémoire du navigateur en même temps, et un onglet dispose de bien moins de place qu'un logiciel de bureau. S'il te faut vraiment toutes les images d'un court passage, découpe d'abord le clip aux secondes qui t'intéressent, puis lance le mode intervalle avec un intervalle égal à la durée d'une image — un divisé par la fréquence du clip, soit 0,04 pour un clip à 25 images par seconde. Demander plus court n'apporte rien : le filtre fps n'a pas d'images supplémentaires à donner et se contente de répéter celles qu'il a. Tu t'arrêteras toujours à soixante, mais ce seront soixante images consécutives et non un échantillon.
Ma vidéo est-elle envoyée quelque part ?
Non. Le décodeur est ffmpeg compilé en WebAssembly et servi par ce site lui-même plutôt que par un réseau de diffusion, et il tourne dans l'onglet. Ton fichier est lu dans la mémoire de la page, traité là, et les images qui en sortent te sont rendues sous forme de téléchargements. Rien ne quitte la machine, ce qui explique aussi qu'un clip long prenne du temps : un seul fil d'exécution du navigateur fait un travail qu'un ordinateur de bureau répartirait sur tous ses cœurs.
Pourquoi une image par seconde ne me donne-t-elle que le début d'une longue vidéo ?
Parce que le mode intervalle fixe la cadence d'échantillonnage puis s'arrête au plafond de 60 images. Une image par seconde donne fps=1.000000, et -frames:v 60 arrête ffmpeg après la soixantième image produite, soit à soixante secondes de la source. Tout ce qui suit la première minute n'est jamais atteint. Le mode « nombre » ne se comporte pas ainsi : il déduit la cadence de la durée totale, si bien que 60 images sur un enregistrement de deux heures donnent fps=0.008333 et tombent toutes les deux minutes du début à la fin. Utilise le mode « nombre » dès que tu veux voir toute la vidéo, et le mode intervalle seulement pour le début ou pour un clip déjà découpé.

Articles qui pourraient t'intéresser

Tous les guides
GuidePourquoi un GIF de trois secondes pèse plus lourd que la vidéo d'origineUn GIF n'a pas de vraie compression vidéo : chaque image est une image entière, plafonnée à 256 couleurs. Cela donne une arithmétique que tu peux faire de tête — largeur fois hauteur fois nombre d'images — et trois leviers à tirer quand la fenêtre d'envoi dit que le fichier est trop lourd.GuideQuelle résolution vidéo choisir, et ce que chaque palier coûte en mégaoctetsPasser du 1080p au 720p ne divise pas l'image par deux : cela retire 56 % des pixels, et nettement moins que cela du fichier. Voici l'échelle avec les vrais comptes de pixels, des débits honnêtes et le poids de trois minutes à chaque palier — plus la raison pour laquelle une source à faible débit ne rétrécit presque pas.TutorielFaire passer une vidéo sous une limite d'envoi sans tâtonnerLe curseur de qualité ne sait pas viser une taille de fichier — ce n'est pas son rôle. Mais la limite et la durée de ton plan fixent déjà le débit auquel tu as droit, et une division te dit si la résolution que tu utilises peut seulement tenir.ExplicationPivoter une vidéo de 90° ou 180° : l'indicateur ou les pixelsIl existe deux façons radicalement différentes de faire pivoter une vidéo, et une seule touche à l'image. Cet outil prend la voie lente, avec perte et universelle — et il y a de bonnes chances que ton clip de téléphone couché n'en ait pas besoin du tout.ExplicationMOV vers MP4 : pourquoi la vidéo de l'iPhone ne s'ouvre pas sous WindowsL'extension n'est presque jamais le vrai problème. Un .mov et un .mp4 sont cousins dans la même famille de formats, et ce qui bloque réellement la vidéo, c'est le codec scellé à l'intérieur — le plus souvent le HEVC. Voici comment distinguer les deux pannes, et quand changer la boîte suffit.ExplicationPourquoi ta coupe vidéo tombe deux secondes trop tôtTu as demandé 1:23 et obtenu 1:21. Rien n'est cassé : une coupe qui ne ré-encode pas ne peut atterrir que sur une image-clé, et la distance à la plus proche dépend entièrement de ce qui a enregistré la vidéo. Voici comment savoir laquelle tu as et quand accepter le décalage.

Outils similaires

Ces quatre outils font tourner ffmpeg dans ton navigateur : rien n'est envoyé, et rien ici ne dépend d'un serveur qui reste debout. Le comportement décrit a été lu dans le source de chaque composant puis confirmé en exécutant les mêmes tableaux d'arguments contre la version de ffmpeg que le site embarque — c'est donc vrai de la version en ligne aujourd'hui, pas de ffmpeg en général. Les tailles et les mesures de sonie viennent de courts fichiers de test synthétiques ; tes propres rushes donneront d'autres chiffres sur les mêmes commandes. Là où le texte affiché par un outil et son code se contredisent, cet article suit le code.

Sources

Tu as repéré une erreur dans cet article ?