Alle grundlegenden AviSynth Scriptsprachenbefehle haben eine dieser Formen:
(Es gibt auch zwei Konstrukte mit höherem Level - die Funktionsdeklaration und das try..catch statement.)
Im ersten Fall wird expression abgearbeitet und das Ergebnsi wird der Variable variable_name zugewiesen. Im zweiten Fall wird expression ausgeführt, und das Ergebnis wird, falls es ein Videoclip ist, der Sondervariable last zugewiesen. Im dritten Fall wird expression ausgeführt und wird als der Rückgabewert ("return value") des aktiven Skriptabschnitts (- das ist entweder eine Funktion oder das ganze Skript - )verwendet. Im letzteren Fall ist das Rückgabeergebnis typischerweise der Videoclip, den die Anwendung sieht, die die AVS Datei öffnet. Als Kurzfassung kann man sich merken, eine reiner Ausdruch als letztes Statement in einem Script (oder Scriptabschnitt) wird so behandelt, als ob das Schlüsselwort return vorhanden wäre.
Meistens wird das Ergebnis eines Ausdrucks ein Videoclip sein; es kann jedoch als Ergebnis eines Ausdrucks jeder andere Typ sein, der von der Scriptsprache unterstützt wird (clip, int, float, bool, string) und auf diese Weise arbeiten Hilfsfunktionen wie die internen Scriptfunktionen.
Eine Expression kann eine der folgenden Formen haben:
Im ersten Fall ist der Wert vom Ausdruck expression der Wert der Konstanten. Im zweiten Fall korrespondieren die Werte zu den Clipeigenschaften oder Scriptvariablem (die vorher initialisiert werden müssen). Im dritten Fall ist der Wert der Rückgabewert einer AVS Funktion (siehe unten). Der vierte Fall ist eine alternative Syntax (die man "OOP Notation" nennt), die äquivalent ist zu Function(expression, args).
Die letzten zwei Fälle zeigen, dass man Ausdrück verändern kann, indem man alle der üblichen arithmetischen und logischen Operatoren(aus
C) wie du es erwarten würdest bei int, float und boolschen Ausdrücken,
und man kann Code auch bedingt ausführen, indem man den ternären
Operator verwendet. Strings (Zeichenketten) können mit relationalen
Operatoren verglichen werden und mit '+' verbunden werden.
Die folgenden Operatoren sind auch für Videoclips definiert: a + b ist äquivalent zu UnalignedSplice(a, b), und a ++ b ist äquivalent zu AlignedSplice(a, b).
Die Funktionen in der AviSynth Skriptsprache sind im Wesentlichen Video-Filter. Auch wenn eine Funktion jede Art von Typ zurückgeben kann, die sie wählt (dies ist nützlich für die Erstellung von Werkzeug-Code, den man in Scripten wiederverwenden will, du kannst deine eigenen Skriptfunktionen definieren), sind Funktionen, die keinen Clip zurück geben immer beschränkt auf die Zwischenverarbeitung von Variablen, um Argumente an Filter weiter zu geben (Filter sind Funktionen, die einen Clip zurück geben). Das Skript sollte immer als Endwerteinen Clip zurückgeben. Schließlich ist AviSynth ein Video-Bearbeitungsprogramm.
Funktionen
können bis zu sechzig Argumente aufnehmen (ich hoffe, das reicht), und
der Rückgabewert kann von jeder Typ sein, der durch die Skriptsprache
unterstützt wird (clip, int, float, bool, string). Funktionen erzeugen
immer einen neuen Wert und modifzieren nie
einen vorhandenen. Das heißt, dass alle Argumente an eine Funktion als
Wert übergeben werden und nicht als Verweis. Um den Wert einer
Variablen in AviSynth Script-Sprache zu ändern, musst du ihr neuen Wert
zuweisen.
Um die Syntax der Funktionsaufrufe aller eingebauten Filter zu sehen, lese in interne Filter. Es gibt auch eingebaute internale Funktionen, die übliche Operationen auf nicht-Clip-Variablen ausführen.
Args ist eine Liste der Funktionsargumente, die durch Komma getrennt sind. Die Liste kann leer sein. Jedes Argument muss ein Ausdruck sein, dessen Typ (z.B. Text-String, Integer-, Fließkomma-Zahl, ein boolescher Wert oder ein Videoclip) mit dem Typ übereinstimmt, der von der Funktion erwartet wird. Wenn die Funktion einen Videoclip als erstes Argument erwartet, und das Argument wird nicht angegeben, dann wird der Clip aus der Spezialvariable last verwendet.AviSynth Funktionen können benannte Argumente annehmen. Die
benannten Argumente können in beliebiger Reihenfolge angegeben werden
und der Filter wird Standardwerte für alle anderen verwenden, die
weglassen wurden. Dies macht bestimmte Filter viel einfacher bedienbar.
Zum Beispiel kannst du nun schreiben
Subtitle("Hallo, World!", text_color=$00FF00, x=100, y=200)
statt
Subtitle("Hallo, World!", 100, 200, 0, 999999,
"Arial", 24, $00FF00).
Colors kann
hexadezimal oder wie im obigen Beispiel oder in Dezimalzuahlen
angegeben werden. In beiden Fällen sollte es als RGB-Wert angegeben
werden, auch wenn der Clip selbst YUV ist.
Wenn keine Argumente an die Funktion übergeben werden, kannst du die Funktion auch ohne Klammern aufrufen, z. B. FilterName.
Der primäre Grund dafür ist, Kompatibilität mit alten Scripten zu
wahren. Allerdings ist es manchmal bequemer, die Klammern wegzulassen,
wenn es keine Möglichkeit einer Verwechslung gibt.
Avisynth ignoriert alles was hinter einem #-Zeichen folgt bis zum Zeilenende. Dies kann verwendet werden, um einem Skript Kommentare hinzu zu fügen.
# comment
In v2.58 ist es möglich to auch Blöcke und verschachtelte Blöcke von Kommentaren auf folgende Art zu schreiben:
# Block-Kommentar:
/*
comment 1
comment 2
*/
# verschachtelter Block-Kommentar:
[* [* a meaningful example will follow later :) *] *]
Avisynth ignoriert alles hinter einem __END__ Schlüsselwort (mit doppelten Unterstrichen) bis zum Ende der Scriptdatei. Du kannst dies verwenden, um einige der letzten Befehle des Skripts zu deaktivieren.
Version()
__END__
ReduceBy2()
Das Ergebnis wird nicht durch2 geteilt und wir können hier beliebigen Text schreiben
Avisynth ignoriert Groß/Kleinschreibung: aViSouRCe ist genau so gut wie AVISource.
Mehrere Avisynth Befehle in einer einzelnen Zeile können nur im Rahmen der OOP-Notation oder durch Einbettung von Filtern als Parameter einer anderen Funktion erreicht werden. Zum Beispiel:
AviSource("c:\video.avi").Trim(0, 499)
-oder-
AudioDub(AviSource("c:\video.avi"), WavSource("c:\audio.wav"))
Avisynth Befehle können über mehrere Zeilen, ausgedehnt werden,
indem ein Backslash ("\") entweder als letztes Nicht-Leerzeichen der
Zeile angehängt wird, oder als erstes Nicht-Leerzeichen in der nächsten
Zeile vorangestellt wird.
Beispiele für Zeilenaufspaltung (beide gültig und gleich):
Subtitle("Hello, World!", 100, 200, 0, \
999999, "Arial", 24, $00FF00)
-oder-
Subtitle("Hello, World!", 100, 200, 0,
\ 999999, "Arial", 24, $00FF00)
Bei der Aufteilung auf mehrere Zeilen kannst du Kommentare nur am Ende der letzten Zeile anfügen. Kommentare, die mit Backslashes vermischt sind in einer
mittleren Zeile produzieren entweder eine Fehlermeldung oder
resultieren in schwer zu verfolgenden Bugs.
Beispiel für einen nicht-signalisierten Bug durch unsachgemäße Mischen von Kommentaren und Zeilentrennung:
ColorBars ShowFrameNumber Trim(0,9) # select some frames \ + Trim(20,29)
Das obere Beispiel gibt nicht wie beabsichtigt Frames zurück [0..9,20..29] , weil das "\" am Zeilenende vom Kommentarzeichen "#" davor maskiert wird; daher wird der Rest der nächsten Zeile nie eingelesen.
$Date: 2008/12/21 09:23:02 $