## 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`