Syntaxe avisynth
La syntaxe d'une ligne de commande d'un script AviSynth peut se présenter sous l'une de ces trois formes :
- nom_de_la_variable = expression
- expression
- return expression
Dans le premier cas, expression est exécuté et le résultat de l'expression est assigné à nom_de_la_variable. Dans le second cas expression est exécuté et le résultat est assigné à la variable spéciale last. En fin dans le troisième cas, expression est évalué et le résultat de expression est la valeur du bloc courant (que le bloc en question soit une fonction ou le script en lui même) qui sera retournée. Dans le cas ou la valeur retournée est celle du script, la valeur retournée sera typiquement le clip vidéo envoyé à l'application qui ouvre le script AviSynth.
La plupart du temps, le résultat d'une expression sera un clip vidéo; Cependant AviSynth supporte plusieurs types de valeurs (clip, entiers / int, flottant / float, booléen / bool et chaîne de caractère / string ) qui peuvent être traitées par les fonctions internes d'AviSynth.
Une expression peut se présenter sous l'une de ces formes :
- constante_numérique ou constante_string
- nom_de_variable ou propriété_du_clip
- Fonction(argument)
- expression.Fonction(argument)
- expression1 opérateur expression2
- expression_booléenne ? expression1 : expression2
Dans le premier cas, la valeur d'expression prend la valeur de la constante. Dans le second cas, expression prend la valeur correspondante à une propriété du clip ou d'une variable (dont la valeur doit avoir été préalablement définie). Dans le troisième cas, expression prend la valeur retournée par la fonction (voir ci-dessous). Le quatrième cas est une alternative à la forme fonction(expression,argument).
Les deux derniers cas montrent la syntaxe employée pour effectuer une opération arithmétique ou logique (via des opérateurs dérivés du langage C) : Le premier permet de manipuler int, float, variable générique (val) ou booléen (voir Script variables). Le second permet de mettre en place des actions conditionnelles.
A noter que le caractère '+' peut être aussi utilisé pour concaténer des chaînes de caractères ou pour assembler des vidéos : a + b est équivalent à UnalignedSplice(a, b) tandis que a ++ b est équivalent à AlignedSplice(a, b).
La majeure partie des fonctions utilisées dans AviSynth sont des filtres vidéo. Cependant une fonction peut retourner tout type de variable (ce qui peut être utile dans le cas de scripting de fonction complexe - voir script functions). Il faut cependant noter que la dernière fonction d'un script doit retourner un clip comme variable finale.
Une fonction peut avoir jusqu'à 60 arguments (vous en aurez assez ?), et la valeur retournée peut être de n'importe quel type supporté par AviSynth (clip, int, float, bool, string).
Pour connaître la syntaxe d'appel des différentes fonctions intégrées à AviSynth, reportez vous à la page détaillant les filtres internes. Pour les fonctions opérant sur des variables autres que clip voyez la page des [Internal_functions|fonctions internes]].
Les Arguments sont les paramètres appliqués à la fonction; chaque argument est séparé par une virgule. Un argument doit être de type string, int,, float, bool ou clip. Cependant une fonction peut très bien ne pas avoir d'argument déclaré. Si une fonction attend un clip comme premier argument mais que celui-ci n'est spécifié, la fonction utilisera la variable spéciale last.
Les filtres AviSynth peuvent avoir des arguments nommés ou non. Les arguments nommés rendent en général les filtres plus faciles à paramétrer. En effet on peut spécifier les arguments dans l'ordre que l'on souhaite, et ce sans avoir à spécifier chacun des paramètres de la fonction (si un argument n'est pas spécifié, le filtre choisira la valeur par défaut). Par exemple, vous pouvez écrire Subtitle("Hello, World!", text_color=$00FF00, x=100, y=200) au lieu de Subtitle("Hello, World!", 100, 200, 0, 999999, "Arial", 24, $00FF00). La couleur peut être spécifiée en hexadécimal comme ci-dessus ou en décimal. Dans les deux cas vous devez donner la couleur en format RVB même si votre clip est en YUV.
Il est aussi possible d'appeler une fonction sans utiliser de parenthèse : NomDuFiltre argument1, argument2 afin d'assurer une compatibilité avec vieux script créés pour de vieilles versions d'AviSynth. Je ne vous conseille pas d'utiliser cette syntaxe à moins que vous ayez une bonne raison de le faire.
Voyons maintenant les marqueurs de commentaires : Avisynth ignore tout ce qui se trouve derrière le caractère # et ce jusqu'à la fin de la ligne. On se sert donc de ce caractère pour commenter les scripts.
# commentaires blah blah
La version v2.58 introduit de nouveaux types de commentaires : les commentaires en bloc et les commentaires en bloc "emboîtables". Voici comment les utiliser:
# commentaire en bloc : /* commentaire 1 commentaire 2 */
# commentaire en bloc emboité: [* [* un exemple concret viendra plus tard :) *] *]
Avisynth ignore également tout texte qui se trouve après la commande __END__ (avec un double underscore)) . Cela peut être utiliser pour tronquer la fin d'un script.
Avisynth ne prend pas en compte la casse des caractères : "aViSouRCe" est traité de la même façon qu' "AVISource" par AviSynth.
Il est également possible d'enchaîner les déclarations sur une seule ligne (voir cas numéro 4 ci-dessus) :
AviSource("c:\video.avi").Trim(0, 499) -or- AudioDub(AviSource("c:\video.avi"), WavSource("c:\audio.wav"))
Avisynth per met également d'écrire une déclaration sur plusieurs lignes en utilisant un backslash ("\") soit à la fin de la première ligne de déclaration soit au début de la ligne suivante de déclaration.
Un exemple (les deux syntaxes sont valides :
Subtitle("Hello, World!", 100, 200, 0, \ 999999, "Arial", 24, $00FF00)
-ou-
Subtitle("Hello, World!", 100, 200, 0, \ 999999, "Arial", 24, $00FF00)
Faites attention lorsque vous utilisez les commentaires en même temps que les déclarations sur plusieurs lignes... Cela peut conduire à des bugs difficiles à déceler :
Voici un exemple du genre de bug que l'on peut rencontrer :
ColorBars ShowFrameNumber Trim(0,9) # sélectionne un certain nbre de frames \ +Trim(20,29)
L'exemple ci-dessus ne renvoie pas les frames [0..9,20..29] car le caractère "\" est masqué par le marqueur de commentaire "#"