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 calcola expressionN, converte il risultato in una stringa e mette il risultato in un file.

La variabile "run-time" current_frame è impostata in modo tale che si possa usare in una "expression"
(questo funziona in modo analogo di ScriptClip, per maggiori info guardare la sua documentazione).
current_frame è impostato a -1 quando lo script è caricato e a -2 quando è chiuso.

WriteFile genera un output ad ogni frame, WriteFileIf genera un output solo se la prima espressione è true, non c'è output al momento dell'apertura dello script o alla sua chiusura.
WriteFileStart e WriteFileEnd generano output solo al momento dell'apertura dello script o alla sua chiusura, nessuna azione ad ogni frame.

Quando append = true, il risultato sarà accodato ad un file esistente.
Quando flush = true, il file è chiuso e riaperto dopo ogni operazione in modo tale che si può verificare il risultato immediatamente.
Per WriteFileStart e WriteFileEnd flush è sempre true.
Il default per append è sempre true, ecceto che per WriteFileStart (dove è false).

Il tutto è meglio spiegato con qualche esempio:

filename = "c:\myprojects\output.txt"
# create a test video to get frames
Version()

# l' espressione qui è solo una variabile, che è attualizzata ed inserita nel file
# si ottiene un file col framenumber in ogni linea
WriteFile(filename, "current_frame")

# qu è scritta una riga all'apertura dello script
WriteFileStart(filename, """ "This is the header" """)

# e qui quando viene chiuso
WriteFileEnd(filename, """ "Now the script was closed" """)

Osservate come si possono usare le triple-quotes per digitare una stringa in una stringa!

Se l'espressione non può essere attualizzata, al suo posto è scritto un messaggio di errore.
Nel caso succeda ciò con If-expression in WriteFileIf il risultato si assume sia true.

# ne risulta un "I don't know what "this" means"
WriteFile(filename, "this is nonsense")

Ci sono modi più facili di scrivere numeri in un file, MA:

... con questo esempio vedete come si usano le "runtime functions" assieme a FrameEvaluate:

#
Version.FadeIn(50).ConvertToYV12
# questo stampa il frame number, un ":" ed il luma medio
colon = ": "
WriteFile("F:\text.log", "current_frame", "colon", "AverageLuma")

O forse volete stampato anche l' actual time:

# create a test video to get different frames
Version.FadeIn(50).ConvertToYV12
# questo stampa il frame number, il current time e l'average luma
# le triple quotes sono necessarie per inserire quotes dentro una stringa
WriteFile(last, filename, "current_frame", """ time(" %H:%M:%S") """, "AverageLuma")

Ulteriori esempi:

In WriteFileIf la PRIMA espressione deve essere boolean (true o false).
Solo se essa è TRUE vengono attualizzate le altre espressioni e viene stampata una riga.
(Ricordare: && è AND, || è OR, == è EQUAL, != è NOT EQUAL)

# create a test video to get different frames
Version.FadeIn(50).ConvertToYV12
# questo stampa il frame number, ma solo dei frames in cui AverageLuma è tra 30 e 60
WriteFileIf(last, filename, "(AverageLuma>30) && (AverageLuma<60)", "current_frame", """ ":" """, "AverageLuma")

$Date: 2004/10/03 21:26:01 $