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 ist ein "Meta-Filter", der einen durch den Parameter filtername angegebenen Filter mit kontinuierlich geänderten Werten ausgeführt. Beim Frame start_frame und davor wird der Filter mit den Argumenten ausgeführt, die durch start_args übergeben wurden. Beim Frame end_frame und danach wird der Filter mit den Argumenten ausgeführt, die durch end_args übergeben wurden. Dazwischen werden die Argumente linear interpoliert, um einen weichen Übergang zu erhalten.

ApplyRange ist Spezialfall von Animate , wobei start_args = end_arg ist.  Man kann diesen Filter verwenden, wenn man einen bestimmten Filter auf einen bestimmten Bereich von Frames eines Clips anwenden will. Ein weiterer Unterschied zu Animate ist, dass args keinen Clip enthalten darf. Start_frame kann gleich mit  end_frame sein, wenn man nur diesen Frame haben möchte.

In Fällen, wenn eine große Anzahl von Bereichen gleiche Bearbeitung erfordern, kann die Verwendung von sehr vielen Aufrufen von ApplyRange zu Ressourcenproblemen führen. Es ist dann besser, ConditionalReader mit ConditionalFilter auszuführen, um zwischen der bearbeiteten und der unbearbeiteten Version des Quellclips für jedes Frame auszuwählen.

Der Filter muss in Anführungsstrichen eingeschlossen sein (es ist ein String), und die beiden aneinandergeschachtelten Listen mit Argumenten stehen nicht in Klammern. Strings und Video-Clips können nicht interpoliert werden, und deshalb müssen in den Fällen die beiden Argumentlisten identisch sein. Trotzdem eine wichtige Warnung: Wenn du einen Clip als erstes Argument wählst, darf der selbe Clip nicht in den start_args und end_args enthalten sein.

Zum Beispiel führt

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

zu einem Fehler, weil das erste Frame das selbe ist wie die ungültige Syntax Crop(v, v, 0, 0, 64, 32).

Dieser Filter wird einen sich verändernden Soundtrack nicht korrekt behandeln, daher empfehlen wir nicht, ihn auf Filter anzuwenden, die den Soundtrack bearbeiten. Auf keinen Fall dürfen für den initialen und end-Parameter verschiedene Bildgrößen verwendet werden.

Das Argumen filtername  cann sogar Animate sein, wenn man lieber eine quadartische statt einer linearen Interpolation haben will.

Einige Beispiele:

# Eine gescrollte Version des "Version" Videos
ver = Version()
Animate(0,149,"Crop", ver,0,0,64,32, ver,316,0,64,32)

# oder, was das selbe ist:
ver = Version()
Animate(ver,0,149,"Crop", 0,0,64,32, 316,0,64,32)

# Weißblende
AviSource("E:\pdwork\DO-Heaven.AVI")
Animate(100,200,"Levels", 0,1,255,0,255, 0,1,255,255,255)

# Zoome allmählich in die Mitte des eines 320x240 Videos, wobei mit
# 1:1 Vergrößerung in Frame 100 begonnen wird und mit 4:1 Vergrößerung
# in Frame 200 endet:
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) # funktioniert auch

# Lasse den Text "Hello, World!" aus dem Zentrum des 320x240 Videos hineauszoomen:
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)

Den Clip c2 zoomen und ihn gleichzeitig  c1 überlagern:

Function meinefunktion(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") # c1 is larger than c2
c2 = AviSource("D:\Captures\atomic.avi").BicubicResize(320,240)
Animate(0,1000,"meinefunktion",c1,c2,10,10,10,10,c1,c2,300,300,360,288)
# oder
# Animate(c1,0,1000,"meinefunktion", c2,10,10,10,10, c2,300,300,360,288)

# aber das Folgende funktioniert nicht, da es drei Clips an meinefunktion (c1, c1 and c2) übergibt,
# obwohl nur zwei erlaubt sind:
# Animate(c1,0,1000,"meinefunktion",c1,c2,10,10,10,10,c1,c2,300,300,360,288)

Ein kleines Bild vergrößert sich auf einem schwarzen Clip, bis es den Hauptclip ersetzt:

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")
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)

Beispiele mit ApplyRange:

ver = Version()
return ver.ApplyRange(0,149,"Crop", 158,0,64,32)
# Ergibt Fehlermeldung, weil unterschiedliche Bildgrößen nicht innerhalb eines Clips möglich sind
Version()
ApplyRange(100,149,"Blur", 1.0)
AviSource("E:\pdwork\DO-Heaven.avi").BicubicResize(320,240)
ApplyRange(0,48,"Subtitle", "Hello, World!",25,130,0,99999,"Arial",48)

# oder, was das selbe ist:
clip = AviSource("E:\pdwork\DO-Heaven.avi").BicubicResize(320,240)
ApplyRange(clip, 0,48,"Subtitle", "Hello, World!",25,130,0,99999,"Arial",48)

# aber weil der Bereich von Framesbut auch direkt an Subtitle weitergegeben werden kann,
# ist dies dasselbe wie:
AviSource("E:\pdwork\DO-Heaven.avi").BicubicResize(320,240)
Subtitle("Hello, World!",25,130,0,48,"Arial",48)

$Date: 2008/12/06 17:50:04 $