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 вычисляет выражения expressionN, превращает результат в строку и записывает её в файл.

Переменная current_frame устанавливается при вычислении выражения равной номеру текущего кадра
(аналогично работает ScriptClip, за подробностями см. эту документацию).
current_frame равна -1 при загрузке скрипта и -2 при закрытии скрипта.

WriteFile выдаёт данные для каждого кадра, обрабатываемого фильтром. WriteFileIfдействует подобно, но выдаёт их только если первое выражение expression1 = true. В обоих случаях при открытии и закрытии скрипта данные не выдаются. Заметьте, что так как вывод произвотится только для "обрабатываемых" кадров, то вывода не будет, если результат фильтра не использется для получения конечного результата скрипта.
WriteFileStart and WriteFileEndвыдают данные только при открытии или закрытии скрипта, не делая никаких действий на каждый кадр. В обоих случаях выражение вычисляется только однажды, в месте расположения фильтра в скрипте.

Если append = true, выдаваемая строка будет дописываться к существующему файлу.
Если flush = true, файл закрывается и снова открывается после каждой записи, т.о. вы можете немедленно видеть результаты (может замедлять работу).
Для фильтров WriteFileStartи WriteFileEndflush всегда true.
По умолчанию append = trueдля всех фильтров группы, кроме WriteFileStart(для него false).

Работу фильтров лучше пояснить на простых примерах:

filename = "c:\myprojects\output.txt"
# создаём исходный клип
Version()

# здесь 'выражение' – это только переменная, вычисляемая на каждом кадре
# и записываемая в файл. Файл будет содержать номера кадров на каждой строке.
WriteFile(filename, "current_frame")

# эта строка записывается при открытии скрипта
WriteFileStart(filename, """ "Заголовок файла" """)

# а эта – при закрытии
WriteFileEnd(filename, """ "Скрипт закончил работу" """)

Вы можете использовать тройные кавычки, чтобы поместить строку внутрь строки.

Если выражение не может быть вычислено, вместо него записывается сообщение об ошибке.
В этом случае в функции WriteFileIfрезультат считается истинным, т.е. ошибка всегда записывается.

# выдаст сообщение "I don't know what "this" means"
WriteFile(filename, "this is фуфло")

Есть и более простые способы записать номера кадров в файл, однако:

... этот пример показывает, как использовать вычисляемую ("runtime") функцию вместе с FrameEvaluate:

# создаёт исходный клип
Version.FadeIn(50).ConvertToYV12

# печатает номер кадра, двоеточие и среднюю яркость кадра.
colon = ": "
WriteFile("F:\text.log", "current_frame", "colon", "AverageLuma")

Можно также напечатать и текущее время:

# создаём исходный клип
Version.FadeIn(50).ConvertToYV12

# печатает номер кадра, текущее время и среднюю яркость кадра
# тройные кавычки нужны для того, чтобы поместить строку внутрь строки
WriteFile(last, filename, "current_frame", """ time(" %H:%M:%S") """, "AverageLuma")

Ещё примеры:

В функции WriteFileIfпервое выражение должно выдавать логическое значение (true или false).
Только если оно даёт TRUE, вычисляются остальные выражения и печатается строка.
(Напоминаю: && – логическое "И", || – логическое "ИЛИ", == – равно, != – не равно)
С помощью этой функции можно пропускать строки в выходном файле.

# создаём исходный клип
Version.FadeIn(50).ConvertToYV12

# печатает номер кадра только для тех кадров, средняя яркость которых лежит между 30 и 60
WriteFileIf(last, filename, "(AverageLuma>30) && (AverageLuma<60)", "current_frame", """ ":" """, "AverageLuma")

$English Date: 2008/11/16 13:59:30 $
Русский перевод 18.05.2005 Eugene Vasiliev (eugvas@mccme.ru)

Обновления 06.12.2008 Fizick