WriteFile / WriteFileIf / WriteFileStart / WriteFileEnd

WriteFile (clip, string filename, string expression1, ... , string expression16, bool "append", bool "flush")
WriteFileIf (clip, string filename, string expression1, ... , string expression16, bool "append", bool "flush")
WriteFileStart (clip, string filename, string expression1, ... , string expression16, bool "append")
WriteFileEnd (clip, string filename, string expression1, ... , string expression16, bool "append")

WriteFile arbeitet expressionN ab,  konvertiert das Ergebnis in eine Zeichenkette und schreibt das Ergebnis in eine Datei.

Die Laufzeitvariable  current_frame wird gesetzt, so dass man sie in den Ausdrpücken "expression" verwenden kann (funktioniert so ähnlich wie bei ScriptClip, schau dort in der Doku für mehr Infos).
current_frame ist auf -1 gesetzt, wenn das Skript geladen wird und auf -2, wenn das Skript geschlossen wird.

WriteFile wertet die Ausdrücke "expression" aus und generiert eine Ausgabe für jeden Frame, der durch das Filter läuft.

WriteFileIf ist ähnlich, aber es erzeugt Ausgaben, wenn der erste Ausdruck wahr ist. In beiden Fällen gibt es keine Ausgabe bei Öffnung oder Schließung des Scripts. Beachte: weil eine Ausgabe nur für gerenderte Frames produziert wird, gibt es überhaupt keine Ausgabe, wenn das Ergebnis des Filters nicht irgendwie für die Erzeugung des endgültigen Ergebnisses des Skripts verwendet wird (also für einen Clip).

WriteFileStart und WriteFileEnd  erzeugen Ausgabe nur beim Scriptöffnen und -schließen bzw. es ist gibt keine Aktion auf jeden Frame. In beiden Fällen werden die Ausdrücke "expression" genau ein Mal an der Stelle des Filters im Skript ausgewertet.

Wenn append = true ist, wird das Ergebnis an eine vorhandene Datei angehängt.
Wenn flush = true ist, wird die Datei geschlossen und wieder geöffnet nach jeder Operation, so dass man das Ergebnis sofort sehen kann (das kann langsamer sein).
Für WriteFileStart und WriteFileEnd ist flush immer wahr.
Die Vorgabe für  append ist immer wahr, außer bei WriteFileStart (hier ist es false).

Die Verwendung wird am besten durch ein paar einfache Beispiele erläutert:

dateiname = "c:\myprojects\output.txt"
# erzeugt ein Testvideo, um Frames zu bekommen
Version()

# Der Ausdruck hier ist nur eine Variable, die ausgewertet und in die Datei geschrieben wird
# du bekommst eine Datei mit der Framenumber in jeder Zeile
WriteFile(dateiname, "current_frame")

# Diese Zeile wird geschrieben beim Start (öffnen) des Scripts
WriteFileStart(dateiname, """ "Dies ist der Kopf" """)

# und diese beim Schließen
WriteFileEnd(dateiname, """ "Jetzt wurde das Script geschlossen" """)

Beachte, wie du Dreifach-Anführungsstriche verwendest, um einen String in einem String zu schreiben!

Wenn der Ausdruck nicht abgearbeitet werden kann, wird statt dessen eine Fehlermeldung geschrieben.
Falls das mit dem If-Ausdruck in WriteFileIf passiert, wird das Ergebnis als true angenommen.

# wird resultieren in "I don't know what "this" means"
WriteFile(filename, "this is nonsense")

Es gibt einfachere Wege, um Zahlen in eine Datei zu schreiben, ABER:

... mit diesem Beispiel kannst du sehen, wie man die Laufzeitfunktionen zusammen mit FrameEvaluate verwendet:

# erzeugt ein Testvideo, um unterschiedliche Frames zu bekommen
Version.FadeIn(50).ConvertToYV12

# Dies schreibt die Framenummer, ein ":" und den durchschnittlichen Lumawert für dieses Frame
colon = ": "
WriteFile("F:\text.log", "current_frame", "colon", "AverageLuma")

Oder vielleicht willst du auch die aktuelle Zeit hinein geschrieben haben:

# erzeugt ein Testvideo, um unterschiedliche Frames zu bekommen
Version.FadeIn(50).ConvertToYV12

# schreibt die Framenummer, die aktuelle Zeit und den durchschnittlichen Lumawert für das Frame
# die Dreifachanführungen sind nötig, um Anführungsstriche in einem String setzen zu können
WriteFile(last, filename, "current_frame", """ time(" %H:%M:%S") """, "AverageLuma")

Mehr Beispiele:

In WriteFileIf wird erwartet, dass der ERSTE Ausdruck boolsch ist (true oder false).
Nur wenn er TRUE ist werden die anderen Ausdrücke abgearbeitet und die Zeile wird geschrieben.
(Zur Erinnerung: && ist AND, || ist OR, == ist EQUAL, != ist NOT EQUAL)
Auf diese Art kann man bestimmte Zeilen in der Datei komplett unterdrücken.

# erzeugt ein Testvideo, um unterschiedliche Frames zu bekommen
Version.FadeIn(50).ConvertToYV12

# schreibt die Framenummer, aber nur für Frames, bei denen AverageLuma zwischen 30 und 60 liegt
WriteFileIf(last, filename, "(AverageLuma>30) && (AverageLuma<60)", "current_frame", """ ":" """, "AverageLuma")

$Date: 2008/12/21 09:23:02 $