Come funziona il time-lapse
Natale a Ibiza. Tramonto a Experimental Beach, un modo diverso di passare una festa così tradizionale. E mia figlia Giorgia mi spiega come usare la funzionalità time-lapse del mio iPhone. Guardiamo il sole nascondersi dietro le nuvole, riapparire e sparire di nuovo incendiando il mare per oltre 40 minuti. Preoccupato, mi domando quanto spazio mi occuperà il video. Ma Giorgia mi rassicura: non sa bene perché ma il video sarà di circa 20/30 secondi e occuperà solo pochi mega di memoria. E in effetti così è: il video dura 28 secondi e occupa 4.5MB. E allora mi domando: qual è l’algoritmo utilizzato dalla Apple per ottenere questo risultato? Ovvero, qual è l’algoritmo che consente di avere un video sempre della stessa lunghezza indipendentemente dal tempo “reale” trascorso?
La bellezza del World Wide Web e del motore di ricerca Google (di cui parliamo nel secondo capitolo del libro) è che, qualunque cosa cerchiamo, quasi sempre troviamo una risposta adeguata. In questo caso, cercando su Google “how works time-lapse apple“, una delle prime risposte rimanda a un post di Dan Provost sul blog di Studio Neat. Il post rimanda anzitutto a quanto viene pubblicizzato sul sito della Apple, riguardo al time-lapse: “Riprendi un soggetto a intervalli selezionati in modo dinamico per creare un video time-lapse da condividere in modo semplice e rapido”. Il problema è, a questo punto, capire cosa intenda la Apple per “intervalli selezionati in modo dinamico”. Ovviamente, nessuno sa esattamente cosa la Apple faccia, se non la Apple stessa, ma il posto di Provost suggerisce la spiegazione seguente.
Normalmente, un video riproduce 30 fotogrammi (in inglese, frame) al secondo (in breve, 30 fps). Se nel corso di una registrazione, decidiamo di memorizzare solo 2 frame al secondo (per risparmiare sulla memoria utilizzata e sul tempo di riproduzione), allora otterremo un video che riprodurrà la scena reale con una velocità percepita maggiore di quella reale per un fattore pari al rapporto tra la frequenza dei fotogrammi usata in fase di riproduzione e la frequenza dei fotogrammi usata in fase di registrazione. Nel caso specifico, la velocità percepita sarà 30/2=15 volte maggiore di quella reale. In compenso, un minuto di registrazione richiederà solo 120 frame, invece di 1800, e durerà solo 120/30=4 secondi in fase di riproduzione.
Supponiamo di voler riprendere una scena reale per T minuti e di voler creare un video che richieda 20 secondi per essere riprodotto. Il video deve quindi riprodurre 30×20=600 frame: quindi, la frequenza dei fotogrammi da usare in fase di registrazione deve essere uguale a 600/60T=10/T fps. Nella tabella seguente, mostriamo i valori di tale frequenza in corrispondenza di diversi valori di T (nell’ultima colonna mostriamo anche il fattore di “velocizzazione” del tempo reale).
T | Frequenza registrazione | Velocità |
---|---|---|
5 min | 2 fps | 15x |
10 min | 1 fps | 30x |
20 min | 0,5 fps (1 frame ogni 2 secondi) | 60x |
40 min | 0,25 fps (1 frame ogni 4 secondi) | 120x |
80 min | 0,175 fps (1 frame ogni 8 secondi) | 240x |
160 min | 0,0875 fps (1 frame ogni 16 secondi) | 480x |
Come si può vedere dalla tabella, al raddoppiare della durata della scena reale, la frequenza dei fotogrammi si dimezza e il fattore di velocizzazione raddoppia. In ogni caso, il video finale richiederà 20 secondi per essere riprodotto.
Ma il problema è che, in generale, la telecamera non sa quanto sarà lunga la scena reale! Nel caso del tramonto a Ibiza, per esempio, Giorgia non ha inserito la prevista durata di 40 minuti. E allora quale frequenza deve usare la telecamera per assicurare che il video finale verrà riprodotto in (circa) 20 secondi? Ecco che si spiega, ora, l’espressione “a intervalli selezionati in modo dinamico” usata sul sito della Apple. Infatti, gli esperimenti condotti da Dan Provost suggeriscono che l’algoritmo utilizzato dalla telecamera sia il seguente (il codice Julia che simula tale algoritmo è anche disponibile).
- Imposta il tempo limite T a 10 minuti.
- Calcola la frequenza corrispondente a T (come mostrata nella tabella).
- Se il tempo trascorso dall’inizio della registrazione supera T, allora
- Raddoppia il tempo limite T.
- Dimezza la frequenza.
- Cancella un frame no e uno si di quelli già memorizzati.
- Se la registrazione viene terminata, produce il video con i frame memorizzati (e non cancellati).
Questo semplice meccanismo “adattivo” assicura che il video finale non sia troppo lungo, indipendentemente dalla durata della registrazione. Semplice ma efficace!
E per concludere, osserviamo che algoritmi che si “adattano” a quello che succede durante la loro esecuzione non sono poi così rari. Uno degli esempi più noti è l’algoritmo di backoff esponenziale utilizzato nella gestione di reti di computer per decidere il tempo con cui tentare nuovamente una trasmissione su un canale condiviso da parte di più computer, una volta che sia stata riscontrata una collisione.