Recensubs HQ

La vera guida a come cavolo si encoda per davvero - Episodio 4: Introduzione ad Avisynth, such delay, wow

« Older   Newer »
  Share  
view post Posted on 28/7/2014, 22:55     +1   -1
Avatar

Bimbosp

Group:
Administrator
Posts:
9,780
Reputation:
+929
Location:
Gallarate (VA)

Status:


Nella parte 3 della guida, scritta ormai più di sei mesi fa, vi avevo promesso che avremmo dato uno sguardo più approfondito ad AvsPmod, dunque è di questo che mi occuperò ora. Anche perché l'11 di Love Lab l'ho tradotto.

Anzitutto, il luogo di riferimento per AvsPmod:

http://forum.doom9.org/showthread.php?t=153248

E per chi non è rimasto aggiornato, Takuan sembra aver chiuso bottega con le build di L-SMASH Works, quindi per rifornirvene la cosa migliore che potete fare è tenere d'occhio questo topic su doom9 (quando mi ricordo aggiorno anche la parte 3 della guida):

http://forum.doom9.org/showthread.php?t=167435

Ora fatemi riflettere perché devo capire cosa dirvi e come... essendo pessimo a spiegare, probabilmente andrò nell'ordine sbagliato.

Cominciamo col chiarire nuovamente una cosa che dovreste aver già compreso la scorsa volta: Avisynth è a tutti gli effetti un linguaggio di scripting, quindi richiede quel minimo di logica necessaria per mettere due righe di codice una in fila all'altra per poter essere usato.
Di per sé Avisynth è un NLE, ma a differenza di fondamentalmente tutti gli altri è privo di una GUI, per cui è molto più scomodo da usare a questo fine.
D'altro canto, rispetto a linguaggi di programmazione più normali, gli script di Avisynth sono pensati solo per fare determinate cose, quindi operazioni tipicamente scontate come dei cicli for diventano dei casini assurdi che richiedono la ricorsione, semplicemente perché non è per questo che si usa Avisynth.

Di fatto quindi, perché usare Avisynth? Perché torna utile?
Per la verità, se Avisynth avesse solo i suoi filtri interni, la sua utilità sarebbe molto ridotta, e probabilmente si utilizzerebbe direttamente Virtualdub o comunque qualche alternativa più comoda. Sono proprio i vari plugin sviluppati dai vari utenti di Avisynth, sottoforma di .dll e .avsi, che rendono AVS uno strumento incredibilmente utile e potente per gestirsi i video.
Più che l'editing in generale (che resta comunque fattibile, per quanto scomodo), quello che AVS fa meglio delle altre soluzioni è una modifica sistematica della sorgente, non dissimile all'applicare degli effetti in un qualsiasi altro NLE. La differenza con gli altri sta appunto negli "effetti" a disposizione, che tendenzialmente fanno cose diverse dagli effetti che normalmente si cercano in un NLE.

Tutto questo preambolo pressoché skippabile per farvi capire che quando vi approcciate ad AVS, dovete scollegare l'immagine che avete della classica programmazione e dell'editing con un NLE, perché si va a fare altro.

Premesso tutto questo, cominciamo con qualche concetto.


Capitolo 1: L'overloading in avisynth

Dacché AVS è un linguaggio di scripting, c'è sempre stata un'incredibile barriera al suo utilizzo dal comune utente. Non è un programma che si usa in maniera "convenzionale", lanciando l'eseguibile e districandosi fra menu, per cui l'utonto classico non ne comprende l'utilizzo. Per venire incontro a quest'esigenza di chi è meno scafato, nacque il progetto AvsP, poi evolutosi in AvsPmod per mano di Zarxrax, con il preciso intento di semplificare l'uso di AVS a sufficienza per renderlo possibile un po' a tutti.

Cominciamo quindi questo viaggio che punta alla comprensione di Avisynth nel modo più semplice possibile: lanciate l'eseguibile di AvsPmod e osservate quello che vi si para di fronte:

avspmodf5kxi

Spiegare i vari menu è un po' inutile, alcune robe io manco le uso per quanto utili (tipo le Macro o i bookmark); imparare a usare AvsPmod nella sua interezza è al di fuori dello scopo di questa guida, quel che mi interessa è che comprendiate bene come usare avisynth e in generale la logica dietro il suo utilizzo, per imparare ad usarlo con efficacia e in autonomia.

Ad ogni modo, visto che al momento per comprendere non ci serve avere a disposizione degli animu, cominciamo discutendo di alcuni dei filtri interni di avisynth ( http://avisynth.nl/index.php/Internal_filters ), con eventuali escursus per la via.

Senza alcun video non si fa niente, quindi partiamo da BlankClip:

Già aprendo la pagina linkata notate subito questo blocco di testo che potrebbe confondervi:
CODICE
BlankClip([clip clip, int length, int width, int height, string pixel_type, int fps, int fps_denominator, int audio_rate, bool stereo, bool sixteen_bit, int color, int color_yuv])
BlankClip([clip clip, int length, int width, int height, string pixel_type, int fps, int fps_denominator, int audio_rate, int channels, string sample_type, int color, int color_yuv])
Blackness()


Potreste avere alcune domande, del tipo: perché c'è due volte BlankClip? Cos'è quella roba tra parentesi tonde? Cosa sono quelle parentesi quadre? Perché sto facendo tutto questo al posto di restare liciaz?

Cominciamo dalla risposta più facile: state facendo tutto questo perché siete masochisti.
Chiarito questo, risolviamo i vari dubbi.
BlankClip è una delle varie funzioni di Avisynth che presenta l'overloading. Quindi, in base ai parametri che passate, il codice che viene eseguito sarà diverso. Ciò significa che se state usando il parametro channels, non potrete usare il parametro stereo. Nel caso specifico vi interessa relativamente poco, perché stereo e sixteen_bit sono presenti per backwards compatibility con script vecchi (stesso discorso per cui esiste ancora Blackness).

Cosa significa in parole povere? Beh, lo vediamo subito.
Qui di seguito vi metterò alcuni codici. Incollateli dentro AvsPmod e poi premete F5 (con F5 aggiornate la preview).
Se provate a specificare il parametro stereo e basta
CODICE
BlankClip(stereo=true)

funziona (vi ritrovate un video nero).
Idem se usate solo il parametro channels. Cancellate il codice finora e usate questo:
CODICE
BlankClip(channels=2)

Il risultato tra i due codici sarà identico (ovvero, entrambi vi danno un video con audio a due canali).
Se invece provate a usarli entrambi contemporaneamente (ancora una volta, cancellate tutto e mettete il seguente codice)
CODICE
BlankClip(stereo=true,channels=2)

vi dà errore (dice che BlankClip non ha il parametro channels).
Questo perché state usando due versioni diverse di BlankClip contemporaneamente, mandando in crisi Avisynth che non sa più cosa dovrebbe fare.

Ora che sapete come gestirvi i parametri anche in caso di overloading, veniamo alle parentesi quadre: nella wiki di avisynth, vengono usate per indicare i parametri facoltativi. Normalmente, scrivendo codice avisynth, i parametri facoltativi vengono indicati tra doppi apici quando si fa la lista dei parametri della funzione che si sta scrivendo (nella wiki vengono utilizzati per indicare parametri facoltativi in versioni overload di un filtro che in quel punto ha un parametro obbligatorio). In entrambi i casi, se i parametri non sono racchiusi tra quadre o tra doppi apici, significa che quei parametri sono obbligatori, e DOVETE specificarli nell'ordine richiesto (quindi non passando il nome del parametro, ma semplicemente indicando il valore).

Ma BlankClip non è un buon esempio a questo fine. Cominciamo però a prepararci il terreno.
Ancora una volta, cancellate il codice presente finora, e metteteci questo:
CODICE
BlankClip(length=490,pixel_type="YV12",color=$FFFFFF)

Come potete immaginare, avrete un video bianco in colorspace YV12 della durata di 490 frame.
Ma abbiamo commesso un errore, volevamo che durasse solo 480 frame! Come fare per accorciare il video?
"Cambio il valore del parametro!" risponderete voi.
Sì, ok, giusto, funziona, ma non è questo che voglio spiegarvi adesso! Normalmente vi basterebbe modificare al volo per correggere gli errori (nulla più di un 9 cambiato in 8), ma ai fini della guida vi mostrerò un altro filtro, questa volta uno che di sicuro userete spesso.
Il nostro caro amico Trim!
E qui notiamo parecchio overloading.
Notiamo anche che soltanto alcuni parametri sono facoltativi, mentre altri sono obbligatori.
Finora abbiamo usato solo parametri facoltativi, ma ora che abbiamo quelli obbligatori dobbiamo ricordarci di non specificare il nome. Perché? Beh... facciamo prima a vedere cosa succede.
Mandate a capo dopo la parantesi chiusa del BlankClip. Riga nuova, funzione nuova. È tempo di Trim.
CODICE
Trim(first_frame=0,last_frame=479)

Uhm... "Invalid arguments"... eppure i nomi sono quelli.
Beh, insomma, ve l'avevo pur detto che gli obbligatori vanno specificati!
CODICE
Trim(0,479)

Ora ci siamo, una clip da 480 frame!
Come? Volete sapere come mai 480 se abbiamo scritto 479?
Beh, avisynth parte a contare da 0, e noi è dallo 0 che abbiamo tagliato.
Se vi trovate scomodi, potete usare l'altro modo, ovvero...
CODICE
Trim(0,-480)

Specificando il numero negativo, state facendo sapere ad avisynth che volete usare l'overload di -num_frames, ovvero quanti frame da tenere. Il risultato finale è identico, ma in base alla situazione può essere più comodo da usare così.
E ora viene il bello dell'esempio col Trim: cosa sono "end" e "length"? Beh, sono alternative ai due metodi di sopra, che, per poter funzionare con tutto quest'overload, necessitano quindi di essere parametri facoltativi da chiamare col nome. Senza specificare il nome si finisce nelle versioni principali, altrimenti.
La differenza rispetto alle altre due versioni sta nel funzionamento del numero 0, comunque.
Poniamo caso di voler tenere solo il frame 0. Seguendo il primo esempio, cosa vi verrebbe naturale fare?
CODICE
Trim(0,0)

Così, giusto?
Guardate però, in basso a sinistra, quant'è il totale di frame.
Già, dovrebbe esserci scritto "Frame 0 / 490", che significa che il totale dei frame è 490. Non ha tagliato nulla. Come mai? Presto detto: nella forma base di trim, il 0 nel last_frame dice di tenere fino alla fine del video.
Potete risolvere dicendogli di tenere un solo frame:
CODICE
Trim(0,-1)

Oppure potete usare l'overload end:
CODICE
Trim(0,end=0)

In cui lo 0 indica il frame 0.
E se usassimo il - con lo 0?
CODICE
Trim(0,-0)

Anche qui stiamo dicendo ad avisynth di tenere fino alla fine del video! E vorrei ben vedere... 0 = -0, cazzo cambia? :shifty:
Ma d'altro canto avere un video che dura 0 frame creerebbe semplicemente un errore, per cui ecco che vi spiego un'altra meccanica di avisynth, l'uso degli Splice. Nella fattispecie, vi insegnerò ad usarli nel modo più visivamente comodo:
CODICE
trim(0,length=0)+trim(0,length=1)

Quel + sta dicendo ad avisynth di mettere il video alla sua destra in coda al video alla sua sinistra.
Ma alla sua sinistra ha un video di durata 0, quindi di fatto ci ritroveremo con solo il video sulla destra in questo caso, ovvero un solo frame.

Da tutto questo ne consegue che in avisynth l'overloading andrebbe fatto esclusivamente tramite parametri facoltativi, onde evitare di usare la funzione sbagliata (questa è una nota che vi interessa se mai vi metterete a scrivervi funzioncine per conto vostro), ma fortunatamente c'è un altro modo per evitare ambiguità tra funzioni con lo stesso nome.
L'esempio classico è quello di MPEG2Source: esistono sia la dll dgdecode.dll che quella mpeg2dec3.dll, per via dei due indexer diversi, e quindi alcune persone hanno entrambe le funzioni caricate, cosa che, senza ulteriori specificazioni, manda in conflitto avisynth, visto che entrambe le funzioni si usano alla stessa maniera. Per indicare quale dll usare, basta specificare il nome del file seguito da un underscore e poi dal nome della funzione. Quindi, per indicare ad AVS di usare l'mpeg2source di dgdecode.dll, si farebbe
CODICE
dgdecode_mpeg2source("file.d2v")

mentre per fargli usare mpeg2dec3.dll
CODICE
mpeg2dec3_mpeg2source("file.d2v")

Ovviamente tutto questo vale solo per i filtri esterni che caricare tramite plugins.

Bene, arrivati fin qui dovreste aver capito come usare i parametri obbligatori, come usare quelli facoltativi, come fare splice di clip e cos'è l'overloading.

La parte 2 dell'introduzione devo ancora decidere di cosa trattera, ma arriverà SOON™.


Capitolo bonus 1: return e last

Ok sono andato avanti con le guide, ma parlando con la gente mi sono reso conto di non aver spiegato adeguatamente cosa siano return e last, per cui li metto qui temporaneamente.

La parola chiave last equivale all'ultimo clip non assegnato a una variabile.

La parola chiave return stabilisce cosa verrà restituito, ovvero ciò che viene specificato a destra della parola chiave. Il primo return dall'alto che viene beccato nello script è quello che viene preso (occhio che quando dico script intendo solo il codice in sé, se nel file .avs ci mettete a parte delle funzioni custom che definitive voi, quelle sono un mondo a parte con il loro return a sé).

Quindi nel seguente codice:

CODICE
blankclip()
bianco = last.invert()
nero = last
return bianco
ancorabianco = last.invert()
return last
invert()


Il return che viene preso in considerazione è il primo dall'alto, quindi return bianco.
Visto che a parte il blankclip tutto il resto è stato definito tramite variabile, il last è sempre il blankclip() iniziale, per cui se commentiamo via il return bianco...

CODICE
blankclip()
bianco = last.invert()
nero = last
#return bianco
ancorabianco = last.invert()
return last
invert()


Avisynth trova il return last, e in quel punto il last coincide ancora col blankclip, per cui tutte le variabili assegnate non influiscono sul risultato e allo stesso modo l'invert in fondo viene sempre ignorato perché è successivo al return.

Spero che return e last siano chiari così.

Edited by mirkosp - 30/3/2015, 20:57
 
Web  Top
ecolabel
view post Posted on 28/7/2014, 23:10     +1   -1




Cioè, qua la gente si scanna come cani e porci e tu stai a scrivere i WOT? :xd:
 
Top
view post Posted on 29/7/2014, 07:41     +1   -1

Member

Group:
Utente abilitato
Posts:
968
Reputation:
+161
Location:
Trentino Alto Adige

Status:


Grazie per la guida!

:yay:
 
Top
Cadis Estrama Di Raizel
view post Posted on 16/10/2014, 23:40     +1   -1




Grazie mille! Aspetto con ansia il quinto episodio, questa serie mi appassiona molto ahahaah XD. Più o meno da quante parti sarà composta la guida?
 
Top
view post Posted on 17/10/2014, 01:45     +1   -1
Avatar

Bimbosp

Group:
Administrator
Posts:
9,780
Reputation:
+929
Location:
Gallarate (VA)

Status:


Non saprei dirtelo a priori. So gli argomenti di cui devo parlare, ma non so quanto tempo richiederanno per essere scritti.
 
Web  Top
view post Posted on 30/3/2015, 19:55     +1   -1
Avatar

Bimbosp

Group:
Administrator
Posts:
9,780
Reputation:
+929
Location:
Gallarate (VA)

Status:


Aggiunto un capitolo bonus per spiegare con più chiarezza cosa sono return e last, che mi sono reso conto di aver usato senza spiegare adeguatamente più avanti nella guida.
 
Web  Top
5 replies since 28/7/2014, 22:55   1701 views
  Share