Piccolo e letale. Avisynth è un potentissimo strumento di editing audio-video.
|
|
4. Primi ScriptAvisynth è un tool per l'editing video ma non aspettatevi una Gui per il settaggio dei paramentri.
Avisynth viene settato attraverso degli script ed è sulla preparazione di questi script che si concentrerà tutto il resto.
.
Nell'economia della codifica MPEG-4 tutto quello che serve è:
- specificare la sorgente
- eventuale Crop
- filtri
- eventuale Resize
Lo script nella
fig. 2.2 vale come esempio del "minimalismo" accennato sopra.
CODE |
#Caricamento filtri. #Il DGDecode serve per accedere all'indice dei frames LoadPlugin("C:\PROGRAMMI\DGMPGDec\DGDecode.dll")
#SORGENTE mpeg2source("c:\film.d2v", idct=0) #CROP, per il taglio delle bande nere crop(6,14,708,548)
#RESIZE BilinearResize(512,272) |
L'ordine nelle operazioni non è casuale.
crop -> filtri -> resizeNormalmente il resize avviene dopo l'applicazione dei filtri, i quali sono successivi al crop (e anche questa sequenza potrebbe essere ampiamente discussa su elaborazioni particolari che verranno discusse più avanti. Al momento, è sufficiente per i nostri scopi).
Per ragioni di pulizia innanzitutto, ma anche perchè un denoise (i filtri che attenuano il rumore video) è meglio che lavori sui frame originali, in modo che levi,il più possibile, solo il rumore senza toccare i dettagli rilevanti.
Il resize apporta delle approssimazioni e se il denoise lavorasse sul risultato del resize lo farebbe in modo scorretto.
Ovviamente rimane il fatto che lavorare dopo il resize, quindi su frame ridimensionati, è più vantaggioso dal punto di vista della velocità.
Non si creda che le speculazioni enunciate finora corrispondano ad un rigido modello applicativo dal quale non ci si possa discostare.
Sono frutto di esperienze personali e di considerazioni "ragionevoli" nell'applicazione dei filtri.
Nessun limite viene posto alla creazione di un diverso processo applicativo che chiunque usi avisynth potrebbe proporre.Ora analizzeremo con cura lo script, perchè le operazioni evidenziate sono quelle che ritroverete nel 99% delle codifiche elementari (da usare quindi come base per script futuri)
- specificare la sorgente: L'acquisizione dalla sorgente avviene attraverso un file particolare di tipo d2v prodotto da DgIndex, per il cui approfondimento si rimanda alla "Guida completa a DgIndex 1.4.5".
Basti sapere che tale applicazione, a partire dai frames della sorgente, costruisce un indice che Avisynth utilizzerà per processare i frames con i suoi filtri.
La sorgente non è necessariamente un file di questo genere. Avisynth può processare benissimo tante altre tipologie di file caricandoli con le istruzioni opportune. Si veda, al proposito, il primo esempio del cap. 10.
- eventuale Crop: Le misure per il crop possono essere prese usando GordianKnot (vedi guida) a mio avviso, il modo più semplice e preciso per croppare rispettando l'aspect-ratio (le proporzioni rispetto al video orginale)
- eventuale Resize: La scelta del resize può dipendere da tanti fattori che non sono oggetto di questo articolo.
In funzione della precisione con cui il resize viene effettuato, si può tracciare la seguente gerarchia:
Bilinear -> Bicubic -> Lanczos
tenendo presente che tanto più l'immagine risulta dettagliata, quanto meno risulta comprimibile con il rischio, se non si dispone di un bitrate sufficiente, di generare artefatti inattesi (blocking).
Dal punto di vista della qualità, si tenga presente questa regola più o meno generale:
- Se l'immagine viene rimpicciolita è meglio usare dei filtri poco aggressivi (bilinear o soft bicubic).
- Se l'immagine viene ingrandita è bene usare un filtro più aggressivo (sharp bicubic o Lanczos)
Nel primo caso si evita che l'immagine diventi inutilmente spigolosa senza alcun reale beneficio. Nel secondo caso, un filtro poco aggressivo rende l'immagine ingrandita un pò sfumata e quindi poco chiara.
Un altro resize che può tornare molto utile è il simpleResize. Nella gerarchia tracciata in precedenza, lo si può collocare fra il bilinear e il bicubic (Bilinear -> Simple -> Bicubic -> Lanczos) e garantisce una buona definizione senza appesantire eccessivamente l'immagine.Ogni funzione di Avisynth restituisce un
clip ossia una sequenza di frame.
Il risultato viene acquisito implicitamente oppure può essere memorizzato in una variabile se si vogliono eseguire delle elaborazioni più fini.
L'applicazione delle funzioni sui clip può avvenire:
- invocando direttamente la funzione, come è stato fatto nell'esempio sopra.
- utilizzando una variabile e applicandovi la funzione per mezzo dell'operatore "."
Alla luce di quanto, detto lo script precedente equivale:
CODE |
#Caricamento filtri. #Il DGDecode serve per accedere all'indice dei frames LoadPlugin("C:\PROGRAMMI\DGMPGDec\DGDecode.dll")
#SORGENTE sorgente=mpeg2source("c:\film.d2v", idct=0) #CROP, per il taglio delle bande nere clip=sorgente.crop(6,14,708,548)
#RESIZE clip=clip.BilinearResize(512,272)
|
ma anche a:
CODE |
#Caricamento filtri. #Il DGDecode serve per accedere all'indice dei frames LoadPlugin("C:\PROGRAMMI\DGMPGDec\DGDecode.dll")
#SORGENTE sorgente=mpeg2source("c:\film.d2v", idct=0) #CROP, per il taglio delle bande nere clip=crop(sorgente,6,14,708,548)
#RESIZE clip=BilinearResize(clip,512,272)
|
e a tutte le variazioni del caso.
4.1. Selezione di una porzione video
Volendo rendere lo script un filo più sofisticato si può ricorrere all'utlizzo di trim per selezionare porzioni di video su cui applicare filtri differenti.
Ad es.
CODE |
#Caricamento filtri. #Il DGDecode serve per accedere all'indice dei frames LoadPlugin("C:\PROGRAMMI\DGMPGDec\DGDecode.dll")
#SORGENTE mpeg2source("c:\film.d2v", idct=0) #CROP, per il taglio delle bande nere crop(8,74,704,428) #RESIZE a=trim(0,1000).BilinearResize(576,240) b=trim(1001,134678).BicubicResize(576,240,1/3,1/3) c=trim(134678,0).BilinearResize(576,240) return a+b+c
|
In questo caso abbiamo selezionato 3 porzioni video a cui applicare 3 resize differenti, il secondo un pò più aggressivo rispetto agli altri,
Ogni porzione viene assegnata ad una variabile e, alla fine dello script viene ricomposto il film intero ossia a+b+c.
E' quello che si fa nel caso in cui per i titoli di testa e di coda si vogliano minimizzare le risorse. Il bitrate risparmiato viene utilizzato per il film.
4.2. Come migliorare la comprimibilitàSe si vuole migliorare la comprimibilità si può ricorrere all'uso di un paio di semplici tecniche:
- Riduzione della luminosità
- Riduzione minimale del dettaglio
E un paio di considerazioni ragionevoli:
- Uso di resize meno aggressivi
- Diminuzione della risoluzione
Il senso della prima nasce dal fatto che i codec MPEG-4 hanno una difficoltà congenita nel comprimere le scene chiare a differenza di quelle scure che sono ottimamente comprimibili. Riducendo un pochino la luminosità si aumenta la comprimibilità senza che le immagini siano troppo degradate.
Stesso discorso per il dettaglio. Riducendolo in minima parte, non sarà comunque visibile ad un'analisi superficiale del video, a tutto vantaggio della comprimibilità.
La scelta di ridurre la risoluzione e/o l'aggressività del resize prescinde ovviamente dal tool in oggetto, ma è di carattere generale e abbastanza nota.
Si sa che più la risoluzione è alta e più si deve pompare il bitrate per non rischiare la produzione di artefatti indesiderati.
Idem dicasi per il resize. Senza dilungarmi ulteriormente, a una maggiore aggressività deve corrispondere un bitrate sufficiente ma anche una risoluzione adeguata (vedi Scelta Resize)
Ad es. secondo me è inutile utilizzare un filtro come il Lanczos su una risoluzione tipo (512,xxx). Oltre che a richiedere un certo numero di risorse in termini di bitrate, pena la produzione di blocchetti,renderebbe in ogni caso le immagini inutilmente spigolose e introdurrebbe un sacco di rumore video.
Si tenga anche conto infatti che la precisione del resize si paga anche in termini di rumore introdotto.
CODE |
#Caricamento filtri. #Il DGDecode serve per accedere all'indice dei frames LoadPlugin("C:\PROGRAMMI\DGMPGDec\DGDecode.dll") LoadPlugin("C:\PROGRAMMI\Avisynth 2.5\filtri\Undot.dll") LoadPlugin("C:\PROGRAMMI\Avisynth 2.5\filtri\Unfilter.dll")
#SORGENTE mpeg2source("c:\film.d2v", idct=0) #CROP, per il taglio delle bande nere crop(6,14,708,548) LumaYV12(-2,1) #molto leggero #LumaYV12(0,0.9) #un pò più efficace Unfilter(-3,-3) #smooth leggero Undot() #deringing
#RESIZE a=trim(0,1000).BilinearResize(576,240) b=trim(1001,134678).BicubucResize(576,240,1/3,1/3) c=trim(134678,0).BilinearResize(576,240) return a+b+c
|
LumaYV12(offset, gain)agisce sulla componente luma del pixel.
Se y è la luma del pixel, y *
gain +
offset è ciò che restituisce la funzione
Il default risulta quindi
LumaYV12(0,1) (y*1+0 è sempre y).
-
offset è compreso fra -255 e +255. I valori assunti agli estremi corrispondono al video nero o bianco rispettivamente
-
gain è compreso fra 0 e 2. Fra 0 e 1 la luminosità si riduce. Fra 1 e 2, aumenta. Amplifica in ogni caso l'effetto dell '
offsetUnfilter(HSharp, VSharp)Intensifica (+
n) o diminuisce(-
n) il dettaglio agendo separatamente sulla componente orizzontale e su quella verticale.
n va da -100 a 100
Undot()
Non ha bisogno di parametri. Riduce l'effetto "
mosquito" sui bordi.
Una volta finito, si salva lo script come: "
nomeScript.avs".
Lo si può testare su un qualunque player (fortemente consigliato
Media Player Classic)
Una volta salvato lo script avs, si dà in pasto a
VirtualDub Mod e dare il via all'operazione di encoding.
fig. 4.1Non è poi così difficile
PARTE ACap. 1. PremessaCap. 2. Cos'è AvisynthCap. 3. Installazione di AvisynthCap. 4. Primi scriptPARTE BCap. 5. Avisynth: dove il codec non arrivaCap. 6. Telecined, Progressive e InterlacedCap. 7. Gestione del ColoreCap. 8. Ripulire la sorgente videoCap. 9. AnimeCap. 10. Post-Processing e altre peculiarità
Pagine: 1 .:. 2 .:. 3 .:. 4 .:. 5 .:. 6 .:. 7 .:. 8 .:. 9 .:. 10 .:.