Animate / ApplyRange

Animate (clip, int start_frame, int end_frame, string filtername, start_args, end_args)
ApplyRange (clip, int start_frame, int end_frame, string filtername, args)

Animate – это мета-фильтр, который вызывает указанный в параметре filtername фильтр с непрерывно меняющимися аргументами. Для кадров до start_frame включительно, фильтр filtername вызывается с аргументами start_args. Для кадров, начиная с end_frame, фильтр filtername вызывается с аргументами end_args. Для кадров между start_frame и end_frame значения аргументов линейно интерполируются.

ApplyRange – это специальный случай фильтра Animate с параметрами start_args=end_args (появился в версии v2.51). Используется для того, чтобы применить некоторый фильтр для определённого диапазона кадров в клипе - в отличие от Animate, кадры вне диапазона от start_frame до end_frame передаются без обработки. Другое отличие от Animate состоит в том, что аргументы args не могут содержать клип. Начиная с версии v2.53 фильтр поддерживает аудио, а начальный номер start_frame может быть равен конечному end_frame (т.о. обрабатывается один кадр).

В случаях когда большое число диапазонов нуждается в подобной обработке, использование многих вызовов ApplyRange может вызвать проблемы ресурсов. Альтернативой может быть использовать ConditionalReader вместе с ConditionalFilter (ScriptClip) для выбора между необработанной и обработанной версией источника.

Имя применяемого фильтра должно быть заключено в кавычки (т.е. это строка), а два списка аргументов не обрамляются скобками. Строки и видеоклипы в качестве параметров не могут быть интерполированы и т.о. должны иметь одинаковые значения в обоих списках. Важное предупреждение: если вы используете клип в качестве первого аргумента Animate, этот клип не должен появляться в списке передаваемых аргументов start_args и end_args. Пример:

v = Version()
Animate(v,0,149,"Crop", v,0,0,64,32, v,316,0,64,32)

вызовет ошибку, т.к. транслируется в синтаксически неверный вызов Crop(v, v, 0, 0, 64, 32).

Фильтр некорректно обрабатывает изменение звуковой дорожки, т.о. не рекомендуется его использовать для фильтров, которые изменяют её. И не пытайтесь задавать начальные и конечные параметры, приводящие к разным размерам кадра!

Вызываемый фильтр filtername может даже быть самим фильтром Animate, если вам нужно организовать квадратичную, а не линейную интерполяцию. Впрочем, не стоит особенно развивать этот сюжет, ибо голова может разлететься.

 

# Сделать прокрутку клипа, выдающего "Version":
ver = Version()
Animate(0,149,"Crop", ver,0,0,64,32, ver,316,0,64,32)

# То же самое:
ver = Version()
Animate(ver,0,149,"Crop", 0,0,64,32, 316,0,64,32)
# Растворение (Fade) в белом фоне
AviSource("E:\pdwork\DO-Heaven.avi")
Animate(100,200,"Levels", 0,1,255,0,255, 0,1,255,255,255)
# Постепенное увеличение центральной части клипа с разрешением 320x240, 
# начиная с увеличения 1:1 в кадре 100 и заканчивая увеличением 4:1 
# в кадре 200
clip = AviSource("E:\pdwork\DO-Heaven.avi")
Animate(100,200,"BicubicResize",clip,320,240,0,0,320,240, clip,320,240,120,90,80,60)
# Animate(clip, 100,200,"BicubicResize", 320,240,0,0,320,240, 320,240,120,90,80,60) # работает аналогично
# Выполнить увеличение текста "Hello, World!" в кадре 
# с размером 320x240
BlankClip(width=320, height=240)
Animate(0,48,"Subtitle", "Hello, World!",160,120,0,99999,"Arial",0,
  \  "Hello, World!",25,130,0,99999,"Arial",48)
# Увеличение клипа c2 с одновременным наложением его на c1:
Function myfunc(clip c1, clip c2, int x, int y, int w, int h)
{
w = w - w%2
h = h - h%2
my_c2 = BicubicResize(c2,w,h)
Overlay(c1,my_c2,x,y)
}

c1 = AviSource("D:\Captures\jewel.avi")
c2 = AviSource("D:\Captures\atomic.avi").BicubicResize(320,240) # c2 меньше, чем c1
Animate(0,1000,"myfunc",c1,c2,10,10,10,10,c1,c2,300,300,360,288)
# или же
# Animate(c1,0,1000,"myfunc", c2,10,10,10,10, c2,300,300,360,288)

# но следующая запись не будет работать, т.к. сразу три аргумента передаются функции myfunc (c1, c1 and c2) 
# вместо положенных двух:
# Animate(c1,0,1000,"myfunc",c1,c2,10,10,10,10,c1,c2,300,300,360,288)
# Маленькое изображение увеличивается на фоне чёрного клипа, пока не заменит его собой:
function res(clip clip, clip "LClip", int "width", int "height", int "centerX", int "centerY") {
LClip = BicubicResize(LClip, width, height)
Overlay(clip, LClip, centerX-LClip.width/2, centerY-LClip.height/2)
}

function resize(clip clip, clip "LClip", int "start_frame", int "start_width", int "start_height",
\ int "end_frame", int "end_width", int "end_height", int "centerX", int "centerY") {
return Animate(start_frame, end_frame, "res", clip, LClip, start_width, start_height, centerX, centerY,
\ clip, LClip, end_width, end_height, centerX, centerY)
}

clip = AviSource("D:\captures\jewel.avi").BicubicResize(640,480).ConvertToRGB()
black = BlankClip(clip)

resize(black, clip, 0, 120, 120*clip.height/clip.width, 500, 640, 480, clip.width/2, clip.height/2)
ver = Version()
return ver.ApplyRange(0,149,"Crop", 158,0,64,32)

AviSource("E:\pdwork\DO-Heaven.avi").BicubicResize(320,240)
ApplyRange(0,48,"Subtitle", "Hello, World!",25,130,0,99999,"Arial",48)

# То же самое:
clip = AviSource("E:\pdwork\DO-Heaven.avi").BicubicResize(320,240)
ApplyRange(clip, 0,48,"Subtitle", "Hello, World!",25,130,0,99999,"Arial",48)

$English Date: 2008/12/06 17:50:04 $
Русский перевод 18.05.2005-12.10.2005 Eugene Vasiliev (eugvas@mccme.ru)
Обновления 31.12.2006-06.12.2008 Fizick http://avisynth.org.ru