ConditionalReader

ConditionalReader (clip, string filename, string variablename, bool "show")

ConditionalReader служит для импорта информации из текстового файла, отдельно для каждого кадра, или только для некоторых кадров.

Параметры

Параметр Описание Значение по умолчанию
clip Исходный клип. Он не изменяется, если не задавать show=true. Отсутствует
filename Файл, содержащий значения, которые будут присвоены переменным Отсутствует
variablename Имя переменной, которой следует присвоить значения из файла Отсутствует
show Если установлено в true, то значение, соответствующее текущему кадру, будет отображено поверх этого кадра. false

Формат файла данных

Это обычный текстовый файл. Все разделители - пробелы, а новые директивы начинаются каждый раз с новой строки. Регистр не имеет значения.

TYPE (int|float|bool)

Тип данных можно задавать только один раз для каждого файла. В настоящий момент возможно использование только вещественных (float), целых (int) или логических (bool) значений. Это определяется директивой TYPE. Она всегда должна идти первой, т.к. пока не определен тип данных, ничего никуда не присваивается. Однажды заданный тип данных изменить в ходе выполнения скрипта невозможно !

DEFAULT <value>

Задает значение по умолчанию для всех кадров. Ставить эту директиву нужно сразу после определения типа. Можно ее и не задавать, но тогда следует убедиться что какие-то значения в явном виде заданы для всех кадров. В противном случае поведение фильтра не определено.

<framenumber> <value>

Задает значение переменной для одного кадра с номером <framenumber>.

R <startframe> <endframe> <value>

Задает значение переменной для диапазона кадров. Обе границы <startframe> и <endframe> включаются в диапазон.

I <startframe> <endframe> <startvalue> <stopvalue>

Линейная интерполяция в диапазоне кадров от <startframe> до <endframe> значений от <startvalue> до <stopvalue>. Работает только для целых и вещественных значений. Обе границы включаются в диапазон.

Типы данных

Как уже говорилось, тип может быть вещественный (float), целый (int) и логический (bool)  

Целые числа должны быть представлены в виде последовательности цифр, возможно со знаком.

Вещественные числа должны быть представлены в виде числа с десятичной точкой, возможно со знаком, и возможно с буквой E или е на конце после которой следует порядок числа. Например -732.103 или 7.12e4.

Логическое, или булево значение может быть истина (true) или ложь (false).

Примеры

Простейший пример

File.txt:

Type float
Default 3.45567

R 45 300 76.5654
2 -671.454
72 -671.454

Этот файл содержит вещественные числа. Значение по умолчанию - 3.45567. Для кадров от 45 до 300 будет выдано значение 76.5654, а для кадров 2 и 72 - -671.454. 
Как можно заметить, последующие директивы заменяют предыдущие значения. Например кадр '72' - несмотря на то, что он находится внутри диапазона 45-300, будет возвращено -671.454, как позже заданное. С другой стороны, если бы данный диапазон был указан ПОСЛЕ строки '72 -671.454' - значение переменной стало бы 76.5654.

Скрипт для работы с этим файлом мог бы выглядеть так :

colorbars(512,512)
trim(0,500)
ScriptClip("subtitle(string(myvar))")
ConditionalReader("file.txt", "myvar", false)

Этот скрипт помещает вычисленные значения в переменную "myvar", которая используется фильтром Subtitle, который в свою очередь вызывается из ScriptClip. В результате вычисленное значение отображается как титр.

Заметьте! Строка ConditionalReader() расположена после любого использования "myvar" в вашем скрипте.

Управление наложением клипов

AviSynth script:

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

Этот скрипт задает значения для смещения по горизонтали и для прозрачности. В кадрах 25->50 непрозрачность клипа увеличивается с 0.0 до 1.0, в это же время текст плывет по экрану слева направо. Потом текст стоит на месте с кадра 50 по кадр 250, а после этого едет обратно, постепенно исчезая.
Проще посмотреть клип, чем подробно объяснить, что именно он делает.

Усложненный ApplyRange

Как Вы могли заметить, использование большого числа вызовов ApplyRange() в скрипте может привести к проблемам с ресурсами. Использование ConditionalReader вместе с ConditionalFilter может привести к эффективному решению.

File.txt:

Type Bool
Default False

2 True
R 45 60 True
72 True
R 200 220 True
210 False
315 True

Указанный выше файл будет возвращать логические величины. Он по умолчанию будет возвращать False. Однако для кадров 2, 45 to 60, 72, 200 до 220 и 315 исключая 210 он будет возвращать True. Как вы могли заметить, последние изменения переназначают установки, сделанные в файле ранее. Это иллюстрируется кадром '210' - даже хотя он внутри интервала 200-220, последняя величина, False, будет возвращена.

Скрипт для использования этого файла, мог бы быть таким:

colorbars(512,512)
trim(0,500)
A=Last
FlipHorizontal() # Добавьте сложную цепочку фильтров
B=Last
ConditionalFilter(A, B, "MyVar", "==", "False", false)
ConditionalReader("File.txt", "MyVar", false)

Это будет вводить величины в переменную, названную "MyVar", которая используется ConditionalFilter для выбора между необработанной и перевернутой версией источника.

Заметьте! Строка ConditionalReader() расположена после любого использования "myvar" в вашем скрипте.

$Date: 2008/09/08 16:43:48 $
Русский Перевод 27.05.2005 Alexander Nickolsky (anickol@yahoo.com)
Обновления 10.04.2006 Fizick http://bag.hotmail.ru