ConditionalReader
(clip, string filename, string
variablename, bool "show")
ConditionalReader
erlaubt es, Informationen aus
einer Textdatei auszulesen, die unterschiedliche Werte für jeden Frame
oder für einen bestimmten Framebereich enthält,um diese in eine Variable einzulesen.
Parameter | Beschreibung | Default |
clip | Der Steuer Clip. Er wird nicht verändert, es sei denn man setzt show=true. |
Not optional |
filename | Die Datei mit den Variablen, die man setzen will. | Not optional |
variablename | Der Name der Variable, in die man die Information einlesen will. | Not optional |
show | Bei diesem optionalen Parameter wird bei true der übergebene Wert im Frame eingeblendet. |
false |
Die Datei ist eine einfache Textdatei. Als Separator reicht ein
einfaches Leerzeichen und eine neue Zeile zeigt einen neuen Datensatz
an. Groß- und Kleinschreibung wird nicht unterschieden!
TYPE (int|float|bool)
Man kann pro Datei nur einen Typ an Daten definieren. Die Typen können float, int oder bool sein. Dies legst du mit dem Schlüsselwort
TYPE fest. Man sollte den Datentyp immer am Anfang definieren,
weil ConditionalReader erst nach dem Typ sucht und dann erst die Daten
ab da liest. Man kann den Typ nicht zwischendurch wechseln.
DEFAULT <value>
Dies gibt einen Standardwert für alle Frames an. Diesen sollte man direkt nach der Definition von Type setzen, da er die Werte für alle Frames überschreibt. Man kann den Standardwert auch nicht setzen, muss dann aber auch wirklich für jeden Frame einen Wert setzen, da es sonst zu unerwarteten Ergebnissen kommt.
<framenumber> <value>
Dies setzt den Wert nur für den Frame <Framenummer>.
R <startframe> <endframe> <value>
Dies wendet den Wert auf einen Bereich an Frames an. Sowohl der Startframe als auch der letzte Frame sind im Frame-Bereich enthalten.
I <startframe> <endframe> <startvalue> <stopvalue>
Dies interpoliert zwischen den beiden Werte über den angegebenen Bereich an Frames. Dies funktioniert nur für int und float Werte. Sowohl der Startframe als auch der letzte Frame sind im Frame-Bereich enthalten.
Wie erwähnt können die Typen entweder float, int oder bool sein.
Int Ist eine ganze Zahl und kann wahlweise auch ein Vorzeichen enthalten.
Float Ist eine Dezimalzahl, die einen Dezimalpunkt enthält.
Wahlweise auch ein Vorzeichen oder gefolgt vom e oder E Buchstaben und
einer Dezimalzahl. Gültige Werte sind z.B. -732.103 oder 7.12e4.
Bool kann entweder true, T, yes, false, F oder no sein.
Datei.txt:
Type float
Default 3.45567
R 45 300 76.5654
2 -671.454
72 -671.454
Diese Datei liefert Gleitkommazahlen als Werte. Standardmäßig ist
der Wert 3.45567. Von Frame 45 bis 300 ist der Wert aber 76.5654. Und
der Wert von Frame 2 und 72 ist -671.454.
Wie man sieht, überschreiben spätere Änderungen die Einstellungen
davor. Dies sieht man gut am Frame 72: obwohl der Frame innerhalb des
Bereiches 45-300 liegt, wird sein Wert später geändert. Würde man
zuerst den Frame und dann den Bereich spezifisieren, dann würde der
Wert von -671.454 auf 76.5654 geändert werden.
Ein Skript könnte die obige Datei auf diese Art verwenden:
colorbars(512,512)
trim(0,500)
ScriptClip("subtitle(string(meinevariable))")
ConditionalReader("Datei.txt", "meinevariable", false)
Hier wird der Wert in die Variable "meinevariable" eingelesen, welche von Subtitle verwendet wird, das wiederum von ScriptClip aufgerufen wird, um den bedingten Wert anzuzeigen.
Beachte! Die Zeile mit ConditionalReader() kommt nach jeder Verwendung von "meinevariable" in dem Skript, weil Frames von unten nach oben angefordert werden.
AviSynth Skript:
colorbars(512,256)
a1 = trim(0,600)
a2 = MessageClip("Text Clip")
overlay(a1,a2, y = 100, x = 110, mode="subtract", opacity=0, pc_range=true)
ConditionalReader("opacity.txt", "ol_opacity_offset", false)
ConditionalReader("xoffset.txt", "ol_x_offset", false)
xoffset.txt:
Type int
Default -50
I 25 50 -50 100
R 50 250 100
I 250 275 100 250
opacity.txt:
Type float
Default 0.0
I 25 50 0.0 1.0
R 50 250 1.0
I 250 275 1.0 0.0
Im Grunde werden nur Schlüsselframes für einen x-offset und die
Transparenz (opacity) definiert. Von Frame 25->50 wird die
Transparenz von 0.0 bis 1.0 erhöht, während sich der Text von links
nach rechts bewegt. Dann bleibt der Text stehen von Frame 50 bis 250
und wandert dann weiter nach rechts und wird dabei ausgeblendet.
Es ist einfacher, sich den Clip anzusehen, als ihn zu beschreiben ;-)
Wie du bemerkt haben wirst, kann ein Ressourcenproblem entstehen, wenn man eine große Menge von ApplyRange()
Aufrufen in einem Skript verwendet. Eine effizentere Lösung ist, ConditionalReader
gemeinsam mit ConditionalFilter zu verwenden.
Datei.txt:
Type Bool
Default False
2 True
R 45 60 True
72 True
R 200 220 True
210 False
315 True
Die Datei oben liefert boolsche Werte zurück. Der Standardwert ist False.
Aber für die Frames 2, 45 to 60, 72, 200 bis 220 und 315 mit Ausnahme von 210 wird True
zurück gegeben.
Wie du vielleicht bemerkst, überschreiben spätere Änderungen die
Einstellungen, die eher in der Datei festgelegt wurden. Dies sieht man
an Frame 210 - obwohl es in dem Bereich von
200-220 liegt, wird hier der spätere Wert False zurückgegeben.
Ein Skript könnte diese Datei auf so nutzen:
colorbars(512,512)
trim(0,500)
A=Last
FlipHorizontal() # eine komplexe Filterkette hinzufügen
B=Last
ConditionalFilter(A, B, "meinevariable", "==", "False", false)
ConditionalReader("Datei.txt", "meinevariable", false)
Dies füttert die Werte in die Variable "meinevariable", die von ConditionalFilter verwendet wird, um für jedes Frame zwischen der unbearbeiteten oder der gedrehten Version des Quellvideos auszuwählen.
Beachte! Die Zeile mit ConditionalReader()
kommt nach jeder Verwendung von "meinevariable" in dem Skript.
$Date: 2006/04/10 05:32:01 $