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