Animate

From Avisynth wiki
Jump to: navigation, search

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

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
v = Version()
Animate(v, 0, 149, "Crop", 
\  v,   0, 0, 64, 32, 
\  v, 316, 0, 64, 32)
results in an error. The correct script would be:
v = Version
Animate(v, 0, 149, "Crop", 
\    0, 0, 64, 32,
\  316, 0, 64, 32)
or alternatively,
v = Version
Animate(0, 149, "Crop", 
\  v,   0, 0, 64, 32,
\  v, 316, 0, 64, 32)

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

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
ver = Version
Animate(ver, 0, 149, "Crop", 
\    0, 0, 64, 32, 
\  316, 0, 64, 32)
Fade to white
AviSource("e:\test.avi")
Animate(100,200,"Levels", 
\  0, 1, 255,   0, 255, 
\  0, 1, 255, 255, 255)
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
Version
ApplyRange(100,149,"Blur", 1.0)
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)
Personal tools