Tutto è possibile

Tag: h264

H264 standard… mica tanto

Spesso mi sento dire, mi faccia un mp4 che è standard … sorrido e creo un file che so essere compatibile con le esigenze del cliente.

Una volta era più facile distribuire un video, perché i supporti erano più limitati a vhs o dvd, con due standard video PAL o NTSC per distribuire in tutto il mondo.

Oggi ci sono mille e più varianti, ad esempio se si fornisce un supporto solido come il Blu-ray ci sono quelle che vengono indicate come le specifiche di base, e le varianti di formato… che ogni anno cambiano sul sito ufficiale del consorzio, perché a seconda del lettore da tavolo potrebbe essere supportata o no la variante, non dipende dalla data di produzione, o dal brand, anzi alle volte prodotti di marchi meno noti supportano più formati di altri più blasonati.

Lo standard del Blu-ray nasce a 24 fotogrammi al secondo, per rispettare la naturale creazione dei film, senza alterazioni su durata della parte video o alterazione sulla parte audio. Poco dopo la sua nascita è stato subito aggiunto il 23,976 per supportare più facilmente la riproduzione nel mondo Americano e Giapponese (NTSC a 60 hrz). Il codec di compressione di nascita era l’mpeg2 come il dvd (anche se con una variante dedicata all’alta definizione) anche se quasi subito fu introdotto il formato H264 (variante del codec mpeg 4), poi di recente aggiornato al suo successore H265.

Oggi il Blu-ray supporta dal 23,976 24 25 29,97 30 48 50 59,94 60, e neanche tutti in stream progressivo, ma alcuni solo in stream interlacciato per questioni di compatibilità.

Questo per dire come un prodotto che nasceva per uniformare e offrire il massimo della qualità della visione casalinga senza “interpretazioni” si è trasformato nell’insalata dei formati. Inoltre a seconda del monitor, televisore o proiettore su cui si vedono i risultati le immagini saranno più o meno fluidi o naturali.

Quando ci viene chiesto un H264 standard ci viene chiesto il nulla, perché lo standard è molto ampio e a seconda del dispositivo con cui verrà letto verrà INTERPRETATO in modo più i meno fedele.

Lo standard H264 prevede di registrare da un minimo di un segnale 8 bit 4:2:0 ad una serie di informazioni fino a 12bit 4:4:4, cambiare le impostazioni di codifica punto per punto del filmato, gestire più flussi video sovrapposti, alpha, riproduzioni parziali dei dati, cioè ottimizzare in lettura una scalabilità 1:2,1:3,1:4 etc dei pixel, inglobare codice, indici di capitoli, aree sensibili con dati a link e molto altro ancora; peccato che quasi nessun encoder sfrutti tutte queste caratteristiche.

Quando si crea un file H264 la maggior parte degli encoder ci permette solo di impostare il tipo di compressione e i profili, ma niente di più.

Ironicamente invece di usare un prodotto commerciale, la soluzione più versatile anche se meno comoda è il prodotto freeware ffmpeg, un programma a comando di linea che supporta praticamente tutte le funzioni di moltissimo codec sia in ingresso che uscita, ed è disponibile su tutti i principali sistemi operativi, sono state sviluppate diverse interfacce per utilizzare in modo più comodo e flessibile il prodotto.

Considerato che chi arriva ad un articolo di questo tipo di aspetta un suggerimento sugli “standard” vi posso dare dei suggerimenti su come affrontare il discorso e cosa scegliere come impostazioni e cosa influenza qualità e “compatibilità”.

⁃ Riproduzione da televisore o decoder o player multimediale

⁃ Riproduzione da computer diretto

⁃ Caricamento online

Anche se sono le situazioni più comuni in realtà aprono mille e più situazioni e varianti, perché in realtà la questione della riproduzione è al 50% dipendente dal file e al 50% dal sistema di riproduzione.

Quando si crea un file “classico” si sceglie la risoluzione, i fotogrammi al secondo, il bitrate e se questo è fisso o variabile.

In generale si deve creare un equilibrio tra i dati al secondo letto dal dispositivo e la qualità finale, questo significa che se si sceglie una compressione fissa vuol dire che ogni fotogramma avrà la stessa quantità di informazioni registrabili, immaginiamo 2000, ma se ho un fotogramma di una persona davanti ad un muro bianco tutti i dettagli vengono dedicati alla persona, se ho 20 persone gli stessi dati vengono “divisi” per registrare, quindi ogni persona al max avrà 100 per registrare i dettagli, quindi l’immagine sarà meno dettagliata.

Questo sistema permette di avere i seguenti caratteristiche:

⁃ Funziona anche su dispositivi più semplici

⁃ Prevedibilità della dimensione finale del file.

⁃ Per migliorare la qualità basta alzare il bitrate globale (entro certi limiti).

⁃ Per migliorare la compatibilità con i vecchi dispositivi basta abbassare il bitrate.

⁃ Non si notano jittering di decodifica dei movimenti perché i fotogrammi non devono essere creati ma sono tutti completi.

Se si sceglie una compressione variabile si imposta un range di dati minimo e massimo, per cui il sistema di compressione esegue due livelli di compressione, sia creando un frame Delta e un frame parziale per cui vengono creati dei gruppi di fotogrammi, con la logica di creare il primo frame intero, il secondo frame memorizza solo la differenza tra il primo e il secondo, il terzo la differenza tra il secondo e il terzo e così via fino al prossimo fotogramma Delta.

Il secondo livello di compressione variabile si preoccupa di distribuire una quantità di dati del gruppo in funzione delle necessità, di quanti dati sono necessari fotogramma per fotogramma, ottimizzando peso e qualità.

Il risultato ha caratteristiche differenti rispetto al primo metodo :

⁃ Con lo stesso bitrate massimale la qualità può essere notevolmente migliore

⁃ Lo stream dei dati è più efficiente via rete

Ma ci sono dei contro :

⁃ Questa lettura chiede cache più grandi e dispositivi più potenti perché i fotogrammi sono creati al volo, non esistono completamente

⁃ Se si vuole andare avanti e indietro nel filmato la richiesta di memoria e potenza sale

⁃ Alcuni tipi di filmati e movimenti possono con alcuni encoder dare risultati peggiori che il primo metodo perché da frame a frame sarà meno coerente come struttura e forma (se si lavora solo con bitrate molto bassi)

⁃ In caso di problemi di stream dei dati si possono vedere dei salti nei movimenti veloci, causando una visione a scatti.

⁃ Su dispositivi più vecchi possono esserci riproduzioni di artefatti (blocchi di movimento etc) che non sono presenti nel filmato originale.

In conclusione :

A seconda del dispositivo più o meno recente si deve creare un h264 con il primo metodo e bitrate bassi se si vuole vedere su ogni dispositivo vecchio e/o poco potente come molti smartphone di basso livello; con dispositivi moderni si può creare video col secondo metodo che a parità di peso offrirà una qualità superiore e con dettaglio e sfumature più efficienti.

 


Youtube e la compressione digitale

YouTube-logo-full_color

In questo periodo mi capita di parlare spesso della compressione digiltale in funzione della distribuzione on line, e in particolare di Youtube, spesso trovo molta ignoranza sul come trattare il materiale, un po’ perchè ormai la maggior parte dei software hanno un profilo chiuso che non ci permette di editare i parametri di compressione, un po’ perchè molti non sanno neanche di cosa si parli quando si esporta un video, sembra che sia solo una operazione per finalizzare e basta.

quando va tutto bene, non è importante conoscere cosa sta dietro a tutto questo, ma quando abbiamo necessità di ottimizzare dei file per un particolare prodotto o dispositivo, o in questo caso per un Social come Youtube, dobbiamo impare di più di ciò che sta dietro le quinte, e quindi è necessario introdurre diversi argomenti.

Le basi della compressione

Quando si prende un video e lo si esporta da un qualunque programma di editing o di postproduzione ogni immagine viene nuovamente elaborata e successivamente compressa in modo più o meno distruttivo a seconda del tipo di compressione, di tipo di target che ci serve e da un grande numero di impostazioni del programma, dal contenuto dei video, da come il software gestisce il contenuto originale del video

Quando si carica on line un video sulle diverse piattaforme di sharing come Youtube, Vimeo, Facebook etc viene nuovamente compresso con regole e principi dettati dai creatori della piattaforma.

Quindi banalmente il video subisce al minimo tre compressioni, quando viene catturato, quando viene esportato, quando viene ricompresso dai server delle varie piattaforme. Il che vi può dare un’idea di come la qualità possa decadere molto e rapidamente.

Molti si chiedono il perchè, ci sono diverse ragioni :

  • il primo motivo è la compatibilità, se i server dovessero fare il play di mille formati, codec e frame rate il risultato sarebbe uno sforzo immenso, e le richieste dei player per la compatibilità influenzerebbero negativamente l’esperienza visiva, quindi per semplificare youtube converte sempre i filmati nel miglior rapporto di qualità visione on line.
  • il secondo motivo è altrettanto banale, se i server di Youtube lavorassero con la qualità massima sempre, sarebbero intasati dai milioni di video fatti coi cellulari a bassa definizione (dimentichiamo il fatto che salvano in fullhd o 4k, perchè conta soprattutto il sensore), quindi esistono dei formati predefiniti con cui gestire il materiale fornito
  • il terzo motivo è pratico dovendo inglobare e gestire diversi formati e bitrate, chiedere alle persone comuni di fare i diversi formati è troppo complesso, per cui loro acquisiscono il nostro materiale e in automatico viene convertito per il formato ottimale di play per il 1080p e tutte le sue declinazioni inferiori (720p, 480p ,360p ,240p).

Se guardiamo le specifiche di youtube scopriremo che youtube preferisce filmati con un certo formato, un certo datarate e determinati settaggi. Se usiamo formati e caratteristiche diverse il filmato potrà essere caricato, ma la compressione sarà più aggressiva e distruttiva rovinando la qualità del filmato. Se usiamo formati di qualità più alti rispetto alle specifiche, comunque la gestione del server lo ridurrà al formato di default quindi si sarà sprecato più tempo e in alcuni casi andremo a perdere anche in definizione.

Perchè esistono ancora formati ridicolmente bassi come 360p e 240p?

perchè esiste un sistema automatico che per mantenere la fluidità di visione, se la rete internet attraverso il quale noi vediamo il filmato è lenta, si guarda una versione più leggera come peso e risoluzione per mantenere la fluidità. Inoltre esistono una marea di dispositivi che nonostante sia prodotti nuovi, hanno risoluzioni schermo molto basse, e quindi scaricare un filmato 1080p su un dispositivo (uno smartphone) che ha uno schermo che al max arriva a 576 o meno, sarebbe uno spreco di risorse e dati scaricati.

Ricordiamo che oggi l’uso principale dei social è via strumenti mobile, e per quanto si parli di fibra e gb come niente, esiste un mondo limitato al 3g in molte zone, o anche meno, e dato che la richiesta di banda cresce molto più velocemente della creazione di nuovi ponti e nuove celle telefoniche (i blackout di rete che avvengono durante i periodi di vacanza lo dimostrano) è importante poter fornire il servizio anche quando le risorse sono scarse.

La compressione altera più del necessario

Durante l’esportazione un programma di montaggio esegue un rendering, operazione che esegue più operazioni contemporaneamente, a seconda del programma lavora in spazi colore più ristretti o più estesi; nella compressione dei dati gli algoritmi devono tener conto di tanti fattori.

Spesso non ci si rende conto che ci sono operazioni che possono rendere più “morbido” il filmato in esportazione, che solo chi ha esperienze di compressione conosce e sa dove agire.

Scalatura : quando il programma scala una fotografia o un filmato, sia a ingrandire che a rimpicciolire, se non ottimizzato bene può far perdere qualità/nitidezza (sull’encoder adobe ci sono in più parti ottimizzazioni relative proprio a questo fattore).

Cambio di frame rate : quando il programma esporta da un frame rate all’altro deve creare in più modi i fotogrammi intermedi, o togliere dei fotogrammi, e questo può influenzare la fluidità del filmato o la nitidezza nel momento in cui vengono creati nuovi fotogrammi con le tecniche di interpolazione.

Cambi sulla luminanza e sulla crominanza : ogni tipo di manipolazione del croma e della luminanza possono evidenziare artefatti digitali presenti nel filmato originale, possono ridurre le sfumature di colore per limiti dello spazio colore, possono amplificare il rumore video perchè ne spostano la collocazione originale pensata dal codec di ripresa.

 

La compressione diretta

Immaginando di avere il filmato finito e perfetto a misura, al frame rate corretto, senza interventi, la compressione prende i dati e li ottimizza e riduce dentro gli schemi di compressione dell’h264.
H264 è un codec con degli standard ma diversi parametri e modi di comprimere i dati, per cui a seconda di come si setta un video il risultato può essere più o meno definito, più o meno dettagliato.
gopPer ridurre lo spazio occupato il formato H264 utilizza la tecnica del GoP, Group of Picture, in pratica se giriamo a 30 fotogrammi al secondo e abbiamo un GoP 15,  il codec registra il primo fotogramma intero, poi ne registra uno intero dopo 14 fotogrammi, e dei fotogrammi intermedi ne registra solo le differenze tra uno e l’altro. Questo significa che se nel filmato non ci sono movimenti camera o tanti oggetti in movimento, la compressione, pur mantenendo la qualità ci permette di ridurre molto il peso del file.

Su youtube viene suggerito un valore pari a metà del frame rate, il che significa che se il filmato ha molti movimenti all’interno del frame, oltre a non sfruttare bene il bitrate si rischiano degli errori o difetti di movimento, ad esempio se c’è una esplosione in un filmato oppure, cosa più facile si inquadra dell’acqua in movimento, oppure dei coriandoli gettati in aria, diventa più difficile per il codec distribuire il datarate, e quindi ogni tanto si potrebbe sentire un saltino.

Una possibile soluzione è dimezzare il gop, quindi invece della metà dei frame, ogni quarto dei frame al secondo, in modo che ci siano più frame interi per gestire meglio gli oggetti in movimento veloce.
Ad esempio 6 per il 24p (6×4=24), 5 per il 25p (5×5=25), 5 per il 30p (5×6=30).

L’altro parametro che ci permette di controllare la qualità è il data rate, ovvero la quantità di dati al secondo che può gestire per ogni fotogramma, più alto è il data rate, più alta è la qualità di ogni fotogramma, mentre abbassando il datarate il risultato è che le immagini perderanno nitidezza, e spesso appaiono zone di solarizzazione perchè non ci sono abbastanza informazioni per registrare i dettagli più fini.

Il datarate appare come un valore in Mega per secondo, ma la sua distribuzione nei fotogrammi che contengono un secondo è legato al metodo sottostante.

Variable o Costant bit rate definiscono come il data rate verrà distribuito lungo una sequenza

L’opzione Costant bitrate, la distribuzione è fissa, per cui ogni fotogramma riceve la stessa quantità di dati, il che offre una maggior fluidità di decompressione del filmato, perchè richiede buffer più semplici da gestire, ma in caso di filmati dove si alternano rapidamente scene con grande movimento con scene statiche, è possibile trovare molti sprechi di datarate, e quindi un file di minor qualità. Ad esempio se abbiamo una inquadratura di un’auto ferma che esplode, durante l’attesa viene sprecato datarate sui frame statici e magari per l’esplosione non ci sono sufficienti dati per gestire la qualità e il dettaglio delle fiamme in movimento veloce.

L’opzione Variable bitrate invece è un metodo che utilizza un valore variabile di dati, da un minimo ad un massimo e con un algoritmo che analizza la quantità di dati in movimento e distribuisce meno datarate dove ci sono frame statici, mentre un numero più alto dove ci sono movimenti ampi, movimento veloce o grande dettaglio di movimento.

quindi riassumendo :

  • GoP : valori più alti riducono il peso del file ma contribuiscono ad introdurre possibili artefatti nel movimento
  • Data rate : valori alti danno maggior qualità e maggior peso al file, bassi valori riducono il peso ma a seconda del contenuto (dettaglio immagini e quantità di elementi in movimento) si riduce la qualità del file finale.
  • CBR o VBR per gestire la qualità costante o distribuire meglio la qualità esistono due metodi di calcolo dei dati per ogni fotogramma, il primo offre una compressione più veloce e costante nella distribuzione dei dati, il secondo è più lento, ma sui filmati con molti dettagli e/o movimento può offrire una maggior qualità finale.

L’ottimizzazione per la compressione

Original with noiseIl contenuto di un video influenza molto il risultato perchè gli algoritmi di compressione analizzano il contenuto del fotogramma, dei fotogrammi circostanti per decidere in che modo ridurre le informazioni in modo ottimale dentro il codec. Ironicamente i video con pochissimi dettagli rischiano maggiori danni di quelli molto dettagliati.
Prendiamo un video di un oggetto in movimento su un limbo chiaro, lo stesso filmato ma al posto del limbo mettiamo una distesa di sabbia, il secondo video avrà più nitidezza e dettaglio a parità di parametri di compressione, perchè tutti quei dettagli forzano il profilo di codifica a dare il massimo e spremere ogni dettaglio dalle immagini.

La prima immagine (cliccando si può vedere in fullhd) mostra come la compressione di una immagine con un leggero rumore venga compressa correttamente e non presenti una particolare perdita anche se si comprime molto.

Nella seconda immagine (cliccando si può vedere in fullhd) ho amplificato un poco la struttura dei colori per mostrare come avendo tolto tutto il rumore si formano appena si adenoise to compressionpplica un poco il contrasto o la saturazione una serie di bandeggi / solarizzazioni che evidenziano i limiti del numero di colori disponibili per gestire quella sfumatura.

Oggi spesso si tende a volere video troppo pulito, si applicano forti denoise per togliere ogni tipo di grana o rumore video, ma eccedendo in questa pratica spesso si vedono immagini che tendono a creare il fenomeno del banding, ovvero si vedono le strisce di colore, perchè senza il rumore che “mescola” e inganna la visione si vedono tutti i difetti.

Ricordiamo che indipendentemente dal vostro video di partenza, che abbia anche una sorgente a 12 bit (ovvero miliardi di colori e sfumature) quando usciamo per youtube abbiamo un Output a 8 bit, ovvero 2 alla ottava per canale, che apparentemente sono ben 16 milioni di sfumature, ma se noi riprendiamo un cielo, al massimo dal blu più chiaro che è bianco, al blu più scuro che è nero abbiamo solo 256 sfumature pure, quindi senza un po’ di rumore che mescola le diverse strisce di colore con la tecnica che una volta veniva chiamata “dithering” si rischia di vedere i singoli bandeggi del colore.

Anche dalla sola thumbnail è possibile vedere come la versione senza rumore rischi molto di più nella compressione.

NATURALMENTE questo è un caso limite in cui ho forzato i difetti per renderli evidenti, spesso i risultati essendo più contenuti non sono altrettanto visibili.

Perchè il mio video si vede peggio di un altro fatto con la stessa camera

 

di sicuro non è colpa di youtube 😀

Ora dopo essermi preoccupato di avere le simpatie degli avvocati di Google, posso darvi delle buone ragioni tecniche per cui ogni video sarà diverso anche se fatto con la stessa camera.

Ogni volta che si realizza una ripresa, la qualità del video ha una serie di parametri che determinano la nitidezza, la qualità delle immagini, presenza o assenza di rumore, etc. Pretendere che due persone anche usando la stessa macchina, stesse lenti, nello stesso luogo contemporaneamente ottengano lo stesso risultato di qualità è molto complesso, e necessita di un allineamento di tanti parametri, non a caso quando si fanno riprese multicamera, che sia per cinema, televisione, etc si utilizzano sempre dei target (tabelle di riferimento univoche) per allineare in post tutto il materiale, perchè comunque basta che una persona cambi il diaframma per avere meno luce in ingresso e l’altro cambi invece gli iso, e le immagini saranno diverse in nitidezza e contrasto, immaginate se magari si hanno lenti diverse, e molto altro ancora…

Inoltre basta solo cambiare angolo di ripresa, e avendo luce diretta, riflessa, laterale, controluce, le immagini non saranno solo diverse come luce, ma avranno comunque dominanti e strutture diverse.

Cosa funziona meno bene su youtube?

Quando carichiamo un video, ci sono dei fattori che influiscono su come verrà ricompresso il file, quindi è importante tenerne conto per non rimanere delusi.

  1. la quantità di dettagli delle immagini
  2. i contrasti all’interno del quadro
  3. i cambi scena con differenze notevoli di luminosità
  4. il rumore / noise del filmato originale
  5. la risoluzione originale di caricamento del filmato

per fare un esempio, lo stesso video in 4k caricato sia su youtube che su vimeo ha dato origine a risultati differenti, su youtube, che tengono poi un bitrate di uscita più basso, la versione in FHD ha un maggiore effetto di banding rispetto a vimeo, se carico direttamente il video in formato FHD la qualità su youtube e su vimeo sarà superiore perchè sarà solo ricompresso ma non scalato.

youtube_fhdvimeo-hdA Oggi 1 ottobre (specifico perchè gli algoritmi sono in continuo sviluppo) il sistema di youtube/vimeo offre un buon rapporto qualità fluidità di streaming a prezzo di una compressione sia nei dati che nella risoluzione, per cui va considerato che possiamo valutare solo la qualità della resa nel formato che abbiamo caricato noi, le altre non avendo controllo sulle varianti create da youtube non dobbiamo farci troppi problemi altrimenti ci rovineremmo la salute mentale e basta.

  1. quando carichiamo un filmato di animazione, con toni piatti, l’encoder sa cosa deve fare, ovvero dettagli intorno ai bordi, pulito nei toni piatti. Quando carichiamo un filmato ripreso in pieno giorno pieno o meno di dettagli l’encoder sa di dover preservare a meglio tutti i dettagli possibili.
  2. la differenza di contrasto comporta il fatto che l’encoder darà spazio alle parti più luminose, ma meno alle parti più scure causando facilmente del banding e la presenza di elementi di blocking in movimento nelle parti più scure.
    in generale tutti gli encoder non tengono grande considerazione degli elementi nelle ombre perchè sono considerati meno importanti, dato che il cervello guarda principalmente le parti illuminate.
  3. nei cambi scene, a seconda di come viene fatta l’analisi del filmato per la compressione in CBR o VBR possono esserci più o meno bit a disposizione delle immagini al cambio scena, per cui ci possono essere dei salti e artefatti più presenti nel cambio scena. In quei casi è importante come si impostano i keyframe, se i cambi scena sono frequenti è meglio impostare dei keyframe più bassi come valore in modo che l’analisi sia fatta più di frequente, e quindi il filmato fornito a youtube abbia più informazioni in quelle parti.
  4. come già detto in precedenza, un leggero noise permette di nascondere gli eventuali bandeggi nelle sfumature, e soprattutto forza gli encoder ad analizzare meglio e più attentamente i dettagli dei filmati, quindi anche un noise molto leggero è utile per avere immagini più pulite nel risultato finale.
  5. Più alta è la risoluzione di partenza, migliori saranno le scalature, ma dipende anche dalle strutture.
    Ad esempio come si può vedere nelle immagini sopra, su vimeo sia vedere il file 4k scalato a Fhd, che il fhd direttamente, la qualità è lineare, mentre su youtube la scalatura compromette molto di più la qualità, creando banding e altri difetti, ma si sa che vimeo ha un bitrate molto più alto, quindi la qualità è senza compromessi.


Powered by WordPress & Theme by Anders Norén

error: Content is protected !!