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 — Développeur front-end et rédacteur Tech chez Allin
Performance web · Formats de fichiers
Vérifié à partir de 4 sources
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.
| Bouton de largeur | Depuis 1080×1920 (téléphone, portrait) | Depuis 1920×1080 (paysage) | Depuis 3840×2160 |
|---|---|---|---|
| D'origine | 1080×1920 inchangé | 1920×1080 inchangé | 3840×2160 inchangé |
| 640 px | 640×1138 — 65 % de pixels en moins | 640×360 — 89 % de pixels en moins | 640×360 — 97 % de pixels en moins |
| 1280 px | 1080×1920 inchangé — plafonné | 1280×720 — 56 % de pixels en moins | 1280×720 — 89 % de pixels en moins |
| 1920 px | 1080×1920 inchangé — plafonné | 1920×1080 inchangé | 1920×1080 — 75 % de pixels en moins |
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 →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 ?