I codec video moderni non comprimono ogni fotogramma come se fosse una fotografia indipendente. Sfruttano il fatto che, tra un fotogramma e il successivo, la maggior parte dell'immagine cambia poco. Per farlo usano tre tipi di fotogrammi, organizzati in gruppi chiamati GOP (Group of Pictures). Capire questa struttura aiuta a spiegare molti comportamenti che altrimenti sembrano misteriosi: perché il taglio di un video senza ricodifica non è preciso al fotogramma, perché una diretta ha bisogno di keyframe regolari, perché un file con molti movimenti pesa di più.
Fotogrammi I: le immagini complete
Un fotogramma I (intra) è compresso usando solo le informazioni contenute in sé stesso, come un'immagine JPEG. Non dipende da nessun altro fotogramma e può essere decodificato da solo. Per questo viene chiamato anche keyframe.
Caratteristiche: - è il tipo di fotogramma più pesante; - è il punto da cui il decoder può iniziare a leggere; - interrompe la propagazione degli errori: se un dato si corrompe, il danno si ferma al keyframe successivo.
Fotogrammi P: la predizione in avanti
Un fotogramma P (predicted) descrive solo le differenze rispetto a un fotogramma precedente. L'encoder divide l'immagine in blocchi e, per ciascuno, cerca nel fotogramma di riferimento una zona simile. Invece di salvare i pixel, salva un vettore di movimento («questo blocco è quello di prima spostato di tre pixel a destra») e un residuo, cioè la piccola differenza rimasta.
Un fotogramma P pesa molto meno di un I, ma non può essere decodificato senza il fotogramma da cui dipende.
Fotogrammi B: la predizione bidirezionale
Un fotogramma B (bi-predicted) può usare come riferimento sia fotogrammi precedenti sia fotogrammi successivi. Pensate a un oggetto che si sposta e scopre lo sfondo: ciò che appare dietro l'oggetto non esiste nel fotogramma precedente, ma esiste in quello successivo.
Per usare un fotogramma futuro, l'encoder deve trasmetterlo prima. Per questo nei flussi con fotogrammi B l'ordine di decodifica differisce dall'ordine di visualizzazione, e i container memorizzano due marcature temporali distinte, chiamate DTS e PTS.
I fotogrammi B sono i più leggeri, ma aumentano la complessità e introducono un piccolo ritardo, motivo per cui nelle applicazioni a bassissima latenza a volte vengono disattivati.
Che cos'è il GOP
Il GOP è la sequenza che va da un keyframe al successivo. Una struttura tipica potrebbe essere:
I B B P B B P B B P B B I ...
La lunghezza del GOP è il numero di fotogrammi tra due keyframe. In un video a 25 fotogrammi al secondo, un GOP di 50 significa un keyframe ogni 2 secondi.
GOP lungo o corto?
| GOP lungo | GOP corto |
|---|---|
| file più leggero a parità di qualità | file più pesante |
| ricerca nel file meno precisa | salti rapidi e precisi |
| errori che si propagano più a lungo | recupero veloce dagli errori |
| adatto all'archiviazione e alla distribuzione | adatto al montaggio e allo streaming segmentato |
GOP chiuso e aperto
In un GOP chiuso nessun fotogramma fa riferimento a fotogrammi di un altro GOP: ogni gruppo è autonomo. In un GOP aperto alcuni fotogrammi B all'inizio possono riferirsi al GOP precedente, guadagnando un po' di efficienza ma rendendo più delicato il taglio. Per lo streaming adattivo si preferiscono i GOP chiusi, perché ogni segmento deve poter essere decodificato da solo.
Perché i keyframe contano nello streaming
Nello streaming adattivo il video è diviso in segmenti di pochi secondi, e il lettore può cambiare qualità solo all'inizio di un segmento. Ogni segmento deve quindi iniziare con un keyframe, e i keyframe devono cadere negli stessi istanti in tutte le qualità. Per questo si imposta un intervallo fisso e si disattiva l'inserimento automatico di keyframe nei cambi di scena, oppure lo si limita.
Con FFmpeg e x264 un intervallo di 2 secondi a 25 fps si imposta così:
ffmpeg -i ingresso.mp4 -c:v libx264 -g 50 -keyint_min 50 -sc_threshold 0 uscita.mp4
Anche le piattaforme di diretta chiedono di solito un keyframe ogni pochi secondi: un intervallo troppo lungo ritarda l'avvio della riproduzione per chi si collega.
Taglio senza ricodifica
Quando si taglia un video con -c copy o con un editor in modalità «senza perdita», il punto di inizio può cadere solo su un keyframe. Se chiedete di iniziare al secondo 12,3 e il keyframe più vicino è al secondo 10, il risultato partirà dal 10 oppure mostrerà un'immagine corrotta fino al keyframe successivo. Alcuni strumenti risolvono ricodificando solo il pezzo iniziale fino al primo keyframe e copiando il resto: è il cosiddetto smart cut.
Il movimento ha un costo
Più l'immagine cambia, più i fotogrammi P e B si avvicinano al peso di un I: la predizione funziona male e il residuo cresce. È il motivo per cui un video girato a mano libera, con tremolii continui, pesa sensibilmente di più dello stesso video stabilizzato. Stabilizzare prima della codifica migliora sia la visione sia la compressione.
In sintesi
- I fotogrammi I sono completi, i P predicono dal passato, i B da passato e futuro.
- Il GOP è la distanza tra due keyframe e ne determina peso e precisione di ricerca.
- Lo streaming adattivo richiede keyframe allineati e GOP chiusi.
- Il taglio senza ricodifica è preciso solo sui keyframe.
- Movimento e tremolio riducono l'efficienza della compressione temporale.