ConditionalReader

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

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

Dateiformat

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.

Typen

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.

Beispiele

Grundsätzliche Verwendung

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.

Overlay einstellen

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 ;-)

Kompliziertere Anwendungen

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 $