Vai al contenuto
OneKitly

Estrarre fotogrammi fissi da un video — e perché sembrano più molli del video

Pubblicato il 10/08/2026 · 12 min di lettura · Strumenti per file

Daniel Okonkwo

Daniel OkonkwoSviluppatore front-end e redattore Tech presso OneKitly

Performance web · Formati di file

Verificato su 4 fonti

Vedi il profilo
In breve

L'estrattore di fotogrammi fa girare ffmpeg dentro il tuo browser e costruisce uno di tre comandi. Un fotogramma: -ss <secondi> -i <file> -frames:v 1 -q:v 2. Lo spostamento sta prima dell'ingresso, quindi ffmpeg salta al fotogramma chiave precedente più vicino e decodifica in avanti fino all'istante richiesto. Un numero fisso di fotogrammi: -i <file> -vf fps=<numero diviso per la durata> -frames:v <numero>, che li distribuisce in modo regolare su tutto il clip. Un fotogramma ogni N secondi: -i <file> -vf fps=<1 diviso per N> -frames:v <numero>. Il JPG è scritto con -q:v 2, il secondo gradino migliore della scala MJPEG che va da 2 a 31; il PNG non porta alcun indicatore di qualità, perché è senza perdita. Qualunque modo tu scelga, lo strumento si ferma a 60 fotogrammi e lo dice a schermo prima di partire. Due cose prima di fidarti dell'immagine. Primo: un fotogramma non è una fotografia. Il video conserva un'immagine completa solo nei fotogrammi chiave, di norma uno ogni una-dieci secondi, e ricostruisce tutto quel che sta in mezzo da elenchi di differenze. Estrai un fotogramma da metà di quella serie e ottieni la ricostruzione del decodificatore, più molle e più squadrettata di una foto alla stessa risoluzione; i fotogrammi chiave sono l'eccezione e sono davvero nitidi. Secondo: i pulsanti di larghezza sono tetti, non obiettivi. Diventano scale=w='min(W,iw)':h=-2, quindi un pulsante vuol dire «al massimo questa larghezza»: chiedi meno della sorgente e lo ottieni, chiedi di più e il fotogramma torna alla sua misura. Un clip verticale 1080x1920 a cui si chiedono 1280 esce in 1080x1920, intatto, perché ingrandire un fotogramma non inventa nulla e ingrossa soltanto il file.

Dietro tre pulsanti si nascondono tre comandi: un fotogramma a un istante dato, un numero fisso distribuito sul clip, o uno ogni N secondi. Ecco gli argomenti esatti, il tetto di 60 fotogrammi e il motivo per cui un fotogramma preso da metà di un clip compresso non sarà mai nitido quanto un fotogramma chiave.

Tre pulsanti, tre comandi ffmpeg diversi

L'interfaccia offre un numero di fotogrammi, un intervallo o un singolo istante, e ognuno assembla un comando diverso. «Un numero di fotogrammi» divide la cifra digitata per la durata del clip e passa il risultato al filtro fps: chiedi 12 fotogrammi da un clip di 6 secondi e il filtro diventa fps=2.000000, con -frames:v 12 per fermarlo lì. «A intervallo regolare» inverte invece l'intervallo — un fotogramma ogni 5 secondi dà fps=0.200000 — e calcola la cifra dalla durata. «Un solo fotogramma» salta del tutto il filtro e usa -ss prima dell'ingresso con -frames:v 1.

Quella posizione conta più di quanto sembri. Mettere -ss prima di -i permette a ffmpeg di saltare direttamente a un punto di ricerca invece di decodificare tutto il file fino al tuo istante, e questa è la differenza fra una frazione di secondo e una lunga attesa su un clip grosso. Un vecchio consiglio dice che un salto in ingresso è preciso solo al fotogramma chiave; ha smesso di essere vero anni fa, e questa build salta con precisione per impostazione predefinita quando transcodifica: decodifica il breve tratto fra il punto di ricerca e il tuo istante e lo butta. Il fotogramma che vedi sul cursore d'anteprima è quello che ottieni.

Un fotogramma non è una fotografia

Ogni codec video moderno conserva immagini complete solo di tanto in tanto. Sono i fotogrammi chiave, e tutto ciò che sta in mezzo è scritto come istruzioni: questo blocco si è spostato di quattro pixel a sinistra, quella zona è uguale a prima, questo riquadro è cambiato di queste piccole quantità. Una registrazione di un'ora a 30 fotogrammi al secondo contiene 108 000 fotogrammi ma forse solo qualche migliaio di immagini complete. Quando chiedi il fotogramma a 47,3 secondi, il decodificatore trova l'ultimo fotogramma chiave precedente e ripete tutte le istruzioni da lì per ricostruire ciò che dovrebbe apparire.

La ricostruzione è abbastanza fedele da guardare e deludente da congelare. Poiché il codificatore ha speso i suoi bit su ciò che cambia, uno sfondo fermo non rinfrescato da due secondi porta con sé due secondi di approssimazione accumulata. Un mosso che a 30 fotogrammi al secondo si legge come movimento, fermandosi diventa una sbavatura. E ogni blocco che il codificatore ha giudicato poco osservato — zone scure, zone sfocate, panoramiche veloci — è proprio dove il quantizzatore ha risparmiato. Ecco perché un fotogramma tratto da un clip molto compresso appare più molle di una fotografia della stessa scena con lo stesso numero di pixel.

I fotogrammi chiave sono l'eccezione, e vale la pena cercarli. Se l'immagine conta — una targa, un volto, un tabellone — estrai più fotogrammi attorno all'istante invece di uno. In una serie di dieci fotogrammi consecutivi uno di solito è un fotogramma chiave o gli è vicino, e sarà visibilmente più pulito dei vicini. I modi intervallo e numero lo rendono facile: non ti lasciano mai indicare direttamente un fotogramma chiave, ma un campionamento abbastanza fitto finisce per centrarne uno.

I pulsanti di larghezza sono tetti, non obiettivi

Quattro pulsanti offrono Originale, 640, 1280 e 1920. Scegline uno e la catena di filtri riceve scale=w='min(W,iw)':h=-2, che limita la larghezza a quel numero e lascia a ffmpeg il calcolo di un'altezza che conservi la forma, arrotondata al pari più vicino. La parola che conta è «limita». Su un clip 1920x1080 il pulsante 1280 dà 1280x720, esattamente quel che ti aspetti. Su un clip verticale 1080x1920 lo stesso pulsante dà 1080x1920 — la sorgente, intatta — perché 1280 è più largo del clip e lo strumento tiene il minore dei due.

Quel tetto vale la pena perché ingrandire un fotogramma non porta nulla. L'ingrandimento non può inventare dettaglio: interpola, quindi l'immagine diventa più grande e più pesante senza diventare più nitida — anzi più molle, perché l'interpolazione leviga il poco dettaglio sopravvissuto alla compressione video. Senza quel tetto i pulsanti si leggono come obiettivi, e un clip verticale a cui si chiedevano 1920 usciva in 1920x3414: più del triplo dei pixel della sorgente, tutti indovinati. Se vuoi un'immagine più grande di quella che il clip contiene, la risposta non è qui — è una sorgente ripresa a risoluzione maggiore.

Sessanta fotogrammi — e il tetto non significa la stessa cosa nei due modi

Lo strumento non produce più di 60 fotogrammi per volta, e lo dice prima di partire: chiedine 500 e la riga sotto i pulsanti di modo passa a 60 e aggiunge un avviso. Fin qui, onesto. Quel che l'avviso non dice è che il tetto si comporta diversamente nei due modi a lotti, e quella differenza decide se ottieni una panoramica di tutto il video o solo del suo inizio.

In modo «numero» il ritmo di campionamento viene dalla durata: 60 fotogrammi da una registrazione di venti minuti diventano fps=0.050000, quindi cadono ogni venti secondi dall'inizio alla fine. In modo «intervallo» il ritmo viene dal tuo intervallo e il numero è solo un segnale di stop: un fotogramma al secondo su quella stessa registrazione di venti minuti diventa fps=1.000000 con -frames:v 60, e ffmpeg si ferma dopo sessanta secondi di girato. Ottieni il primo minuto del video, sessanta volte, e niente dei diciannove restanti. La cifra a schermo dice il vero su quanti file avrai; non dice nulla su da dove vengono. Se vuoi copertura, usa il modo «numero».

Un'altra cosa che l'interfaccia dice male di sé. La nota sotto i pulsanti afferma che ogni fotogramma è un download separato e che non c'è un archivio per raggrupparli. C'è: il pulsante «Scarica tutto» raccoglie i fotogrammi in images-video.zip quando ce n'è più di uno, e interpella il browser una volta sola. I pulsanti di download singoli sotto ogni miniatura servono a quando ne vuoi due su sessanta, non perché lo strumento non sappia zippare.

A che servono davvero i fotogrammi

Tre usi coprono quasi tutto ciò per cui si estraggono fotogrammi. Il provino a contatto: da dodici a ventiquattro fotogrammi distribuiti su tutto il clip, stampati piccoli, è il modo più rapido di trovare dove succede qualcosa in un'ora di girato senza scorrere. Il modo «numero» con la larghezza su 640 è fatto per questo. La miniatura: le piattaforme giudicano un video dalla sua prima immagine fissa, e la scelta automatica è quasi sempre peggiore della tua. Usa il modo a fotogramma singolo, trascina il cursore finché l'anteprima mostra il fotogramma che vuoi, ed estrai a larghezza Originale. E la prova: un istante da mostrare a qualcuno che il video non lo guarderà.

Per quel terzo uso, scegli il PNG e non toccare la larghezza. Un JPG a -q:v 2 è ottimo, ma è una seconda generazione con perdita sopra la compressione del video stesso, e chi esaminerà l'immagine da vicino guarderà artefatti di due codificatori invece di uno. Il PNG conserva esattamente ciò che il decodificatore ha prodotto, i file pesano da cinque a quindici volte di più, e non si aggiunge nulla. L'immagine resterà una ricostruzione e non una fotografia — nessun formato lo risolve — ma almeno quella ricostruzione sarà l'unica approssimazione che contiene.

Cosa fa ogni pulsante di larghezza su tre formati di sorgente comuni (scale=w='min(W,iw)':h=-2, altezza arrotondata al pari più vicino)
Pulsante di larghezzaDa 1080×1920 (telefono, verticale)Da 1920×1080 (orizzontale)Da 3840×2160
Originale1080×1920 invariato1920×1080 invariato3840×2160 invariato
640 px640×1138 — 65 % di pixel in meno640×360 — 89 % di pixel in meno640×360 — 97 % di pixel in meno
1280 px1080×1920 invariato — limitato1280×720 — 56 % di pixel in meno1280×720 — 89 % di pixel in meno
1920 px1080×1920 invariato — limitato1920×1080 invariato1920×1080 — 75 % di pixel in meno
Estrarre fotogrammi da un videoEstrai immagini fisse da un video — una scelta col cursore e vista prima di estrarre, un numero fisso, o una ogni pochi secondi.Prova lo strumento

Domande frequenti

Meglio JPG o PNG?
JPG per tutto ciò che guarderai, condividerai o incollerai in un documento: lo strumento lo scrive a -q:v 2, il secondo miglior valore su una scala che va da 2 a 31, e gli artefatti che aggiunge sono molto più discreti di quelli già presenti nel video. PNG per tutto ciò che verrà esaminato, ingrandito o contestato, perché non aggiunge nulla: conserva l'uscita del decodificatore byte per byte. Aspettati file PNG da cinque a quindici volte più grandi del JPG equivalente. Non c'è un cursore di qualità per nessuno dei due: il livello JPG è fissato nel codice e il PNG non ha livello da impostare.
Perché il fotogramma estratto è più sfocato di quanto sembrasse il video?
Perché il movimento nasconde la compressione e l'immobilità la espone. A 30 fotogrammi al secondo il tuo occhio integra trenta approssimazioni al secondo e legge il risultato come una scena nitida; fermati su una di esse e resta solo l'approssimazione. In più, il fotogramma che hai scelto probabilmente non è un fotogramma chiave: è una ricostruzione costruita su una catena di istruzioni di differenza. Prova a estrarre una breve raffica attorno allo stesso istante e confronta: uno sarà nettamente più pulito, e quello sta su un fotogramma chiave o vicinissimo.
Posso ottenere proprio tutti i fotogrammi del video?
In un solo giro no: il tetto è 60 fotogrammi, poco più di due secondi di girato a 25 fotogrammi al secondo. Quel tetto non è arbitrario — sessanta immagini a piena risoluzione sono già decine o centinaia di megabyte tenuti insieme nella memoria del browser, e una scheda ha molto meno spazio di un programma da scrivania. Se ti servono davvero tutti i fotogrammi di un breve passaggio, taglia prima il clip ai secondi che ti interessano e poi usa il modo intervallo con un intervallo pari alla durata di un fotogramma — uno diviso la frequenza del clip, cioè 0,04 per un clip a 25 fotogrammi al secondo. Chiedere di meno non porta nulla: il filtro fps non ha fotogrammi in più da dare e si limita a ripetere quelli che ha. Ti fermerai comunque a sessanta, ma saranno sessanta fotogrammi consecutivi e non un campione.
Il mio video viene caricato da qualche parte?
No. Il decodificatore è ffmpeg compilato in WebAssembly e servito da questo sito stesso anziché da una rete di distribuzione, e gira dentro la scheda. Il tuo file viene letto nella memoria della pagina, elaborato lì, e i fotogrammi che ne escono ti vengono restituiti come download. Nulla lascia la macchina, ed è anche per questo che un clip lungo richiede tempo: un singolo thread del browser fa un lavoro che un computer da scrivania distribuirebbe su tutti i suoi core.
Perché un fotogramma al secondo mi dà solo l'inizio di un video lungo?
Perché il modo intervallo fissa il ritmo di campionamento e poi si ferma al tetto di 60 fotogrammi. Un fotogramma al secondo è fps=1.000000, e -frames:v 60 ferma ffmpeg dopo il sessantesimo fotogramma prodotto, cioè a sessanta secondi della sorgente. Tutto ciò che segue il primo minuto non viene mai raggiunto. Il modo «numero» non si comporta così: ricava il ritmo dalla durata totale, quindi 60 fotogrammi da una registrazione di due ore diventano fps=0.008333 e cadono a due minuti di distanza dall'inizio alla fine. Usa il modo «numero» ogni volta che vuoi vedere tutto il video, e quello a intervallo solo per l'inizio o per un clip già tagliato.

Articoli che potrebbero interessarti

Tutte le guide
GuidaPerché una GIF di tre secondi pesa più del video da cui vieneUna GIF non ha una vera compressione video: ogni fotogramma è un'immagine intera, con un tetto di 256 colori. Ne esce un'aritmetica che puoi fare a mente — larghezza per altezza per numero di fotogrammi — e tre leve da tirare quando la casella di caricamento dice che il file è troppo grande.GuidaQuale risoluzione video scegliere, e quanto costa ogni gradino in megabytePassare da 1080p a 720p non dimezza l'immagine: toglie il 56 % dei pixel, e ben meno di quello dal file. Ecco la scala con conteggi di pixel reali, bitrate onesti e quanto pesano tre minuti a ogni gradino — più il motivo per cui una sorgente a bitrate basso non si restringe quasi per nulla.TutorialPortare un video sotto il limite di caricamento senza tirare a indovinareIl cursore della qualità non sa puntare a una dimensione di file: non è il suo compito. Ma il limite e la durata della tua clip fissano già il bitrate che puoi spendere, e una divisione ti dice se la risoluzione che usi può anche solo starci.SpiegazioneRuotare un video di 90° o 180°: l'indicatore o i pixelCi sono due modi completamente diversi di ruotare un video, e uno solo tocca l'immagine. Questo strumento prende la via lenta, con perdita e universale — e c'è una buona probabilità che il tuo clip da telefono coricato non ne abbia affatto bisogno.SpiegazioneDa MOV a MP4: perché il video dell'iPhone non si apre su WindowsL'estensione non è quasi mai il vero problema. Un .mov e un .mp4 sono cugini della stessa famiglia di formati, e ciò che blocca davvero il video è il codec sigillato dentro — quasi sempre HEVC. Ecco come distinguere i due guasti, e quando basta cambiare la scatola.SpiegazionePerché il tuo taglio video cade due secondi primaHai chiesto 1:23 e ottenuto 1:21. Niente è rotto: un taglio che non ricodifica può cadere solo su un fotogramma chiave, e quanto sia lontano il più vicino dipende interamente da cosa ha registrato il video. Ecco come sapere quale hai e quando accettare lo scarto.

Strumenti correlati

Questi quattro strumenti fanno girare ffmpeg nel tuo browser: non viene caricato nulla, e nulla di ciò che segue dipende da un server che resti in piedi. Il comportamento descritto è stato letto nel sorgente di ogni componente e poi confermato eseguendo gli stessi elenchi di argomenti contro la build di ffmpeg che il sito distribuisce, quindi vale per la versione online oggi e non per ffmpeg in generale. Le dimensioni e i valori di sonorità vengono da brevi file di prova sintetici; il tuo materiale darà altri numeri con gli stessi comandi. Dove il testo a schermo di uno strumento e il suo codice si contraddicono, questo articolo segue il codice.

Fonti

Hai notato un errore in questo articolo?