Animate
AviSynth+
Up-to-date documentation: https://avisynthplus.readthedocs.io
Animate is a meta-filter which evaluates another filter with continuously varying arguments.
ApplyRange is a special case of Animate where start_args = end_args.
| Contents | 
Syntax and Parameters
Animate(clip clip, int start_frame, int end_frame, string filtername, var start_args*, var end_args*)
- clip  clip =  
 - Source clip, sent to filter filtername.
 
- int  start_frame, end_frame =  
 - At frame start_frame and earlier, the filter is evaluated with the arguments given by start_args.
- At frame end_frame and later, the filter is evaluated with the arguments given by end_args.
- In between, the arguments are linearly interpolated for a smooth transition.
 
- string  filtername =  
 - Name of any filter or function accessible to your script.
 
- var list  start_args, end_args =  
 - Two lists of arguments to filtername. Data types must match. The two nested argument lists are not parenthesized.
- Strings and video clips can't be interpolated, and therefore must be identical in the two argument lists.
 
- An important warning: If you use a clip as the first argument to Animate, that clip shouldn't be included here.
- Thus for example
 
- results in an error. The correct script would be:
 
- or alternatively,
 
This filter will not handle a changing sound track or different output frame sizes.
The filtername argument can even be Animate if you want quadratic rather than linear interpolation.
ApplyRange(clip clip, int start_frame, int end_frame, string filtername, var args*)
- clip  clip =  
 - Source clip, sent to filter filtername.
 
- int  start_frame, end_frame =  
 - Frames outside the range start_frame to end_frame are passed through untouched.
- Frames inside the range start_frame to end_frame (inclusive) are processed by filter filtername with arguments args. If start_frame==end_frame, only one frame is processed.
 
- string  filtername =  
 - Name of any filter or function accessible to your script.
 
- var list  args =  
 - List of arguments to filtername. Unlike Animate, args can't contain a clip.
- As with Animate, if you use a clip as the first argument to ApplyRange, that clip shouldn't be included here.
 
Like Animate, this filter will not handle a changing sound track or different output frame sizes.
In cases where a large number of ranges need processing, calling ApplyRange many times may cause resource issues. An alternative is found here: ConditionalReader: ApplyRange replacement.
Examples
Animate Examples
Scrolling "Version" video
Fade to white
Zoom In
# Do a gradual zoom into the center of a 320x240 video, starting at # 1:1 magnification in frame 100 and ending with 4:1 magnification # in frame 200: clip = AviSource("e:\test.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) # also works
Zoom Out
# Make the text "Hello, World!" zoom out from the center of a 320x240 video: 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)
Zoom overlay 1
# Zooming clip c2 while overlaying it on 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("e:\c1.avi") # c1 is larger than c2
c2 = AviSource("e:\c2.avi").BicubicResize(320,240)
Animate(0,1000,"myfunc",
\  c1,c2, 10, 10, 10, 10,
\  c1,c2,300,300,360,288)
# or
# Animate(c1,0,1000,"myfunc", 
#\  c2, 10, 10, 10, 10, 
#\  c2,300,300,360,288)
# but the following doesn't work, since three clips 
# are passed to myfunc (c1, c1 and c2), while only two are allowed:
# Animate(c1,0,1000,"myfunc",
#\  c1,c2, 10, 10, 10, 10,
#\  c1,c2,300,300,360,288)
Zoom overlay 2
# A small picture enlarges on a black clip until replace the main clip:
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("e:\test.avi")
clip = clip.BicubicResize(640,480)
clip = clip.ConvertToRGB
black = BlankClip(clip)
resize(black, clip, 
\      0, 120, 120*clip.Height/clip.Width, 
\      500, 640, 480, 
\      clip.Width/2, clip.Height/2)
See also, Subtitle: Animated parameter demonstration
ApplyRange Examples
ver = Version() return ver.ApplyRange(0,149,"Crop", 158,0,64,32) # gives an error since cannot have different frame sizes within a clip
AviSource("e:\test.avi").BicubicResize(320,240) ApplyRange(0,48,"Subtitle", "Hello, World!",25,130,0,99999,"Arial",48) # or what is the same: clip = AviSource("e:\test.avi").BicubicResize(320,240) ApplyRange(clip, 0,48,"Subtitle", "Hello, World!",25,130,0,99999,"Arial",48) # since the frame range can be provided to Subtitle itself, this is the same as: AviSource("e:\test.avi").BicubicResize(320,240) Subtitle("Hello, World!",25,130,0,48,"Arial",48)
