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 je meta-filtr, který vyvolá filtr uvedený v jeho parametru filter s plynule se měnícími argumenty. Pro snímky do  start_frame včetně, se filtr  filtername vyvolává s argumenty  start_args. Pro snímky od end_frame, se filtr  filtername vyvolá s argumenty end_args. Pro snímky mezi start_argsend_frame se pro hladký přechod hodnoty argumentů lineárně interpolují.

ApplyRange je speciální typ Animate kde start_args = end_args, a objevil se ve verzi v2.51 . Může být použit, když chcete aplikovat určitý filtr na určitém rozsahu snímků klipu - na rozdíl od Animate, jsou snímky mimo rozsah start_frameend_frame po průchodu nedotčeny. Další rozdíl od Animate je, že argumenty  args nemohou obsahovat klip. Počínaje verzí v2.53 podporuje audio, a start_frame může být rovno end_frame (tzn., že se zpracuje jen jeden snímek).

V případech kdy velký počet rozsahů potřebuje podobnéé zpracování za použití mnoha volání ApplyRange  může způsobit problémy resourců. Alternativou může být použití ConditionalReader spolu s  ConditionalFilter pro výběr mezi nezpracovanou a zpracovanou verzí zdroje.

Jméno použitého filtru musí být v uvozovkách (tzn. je to řetězec - string), a dva vložené seznamy argumentů nejsou ohraničeny závorkami. Řetězce (strings) a videoklipy nemohou být interpolovány, a proto musí mít stejné hodnoty v obou seznamech argumentů. Důležité upozornění: Jestli používáte klip jako první argument Animate , pak stejný klip nesmí být zahrnut v seznamu předávaných argumentů start_args a end_args . Příklad:

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

vyvolá chybu, protože první snímek je stejný jako neplatná syntaxe Crop(v, v, 0, 0, 64, 32).

Filtr bude nesprávně zpracovávat změnu zvukové stopy, proto jej nedoporučuji používat s filtry, které mění zvukovou stopu. A nepokoušejte se zadávat počáteční a koncové parametry vedoucí k různým rozměrům snímku.

Argument   filtername dokonce může být samotným filtrem  Animate , jestli chcete raději kvadratickou interpolaci než lineární.

Několik příkladů:

# Vytvořit protočení (scrolling) videa s verzí "Version":
ver = Version()
Animate(0,149,"Crop", ver,0,0,64,32, ver,316,0,64,32)

# nebo, což je stejné:
ver = Version()
Animate(ver,0,149,"Crop", 0,0,64,32, 316,0,64,32)

# Stmívání (Fade) do bíla
AviSource("E:\pdwork\DO-Heaven.AVI")
Animate(100,200,"Levels", 0,1,255,0,255, 0,1,255,255,255)

# Postupné zvětšení střední části videa s rozlišením 320x240 ,
#počínaje od zvětšení 1:1 ve snímku 100 a konče s měřítkem 4:1
#ve snímku 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) # also works

# Zvětšit text "Hello, World!" ze středu videa velikosti 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)

Zvětšení klipu c2 se současným překrytím na 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") # c1 je větší než c2
c2 = AviSource("D:\Captures\atomic.avi").BicubicResize(320,240)
Animate(0,1000,"myfunc",c1,c2,10,10,10,10,c1,c2,300,300,360,288)
# nebo
# Animate(c1,0,1000,"myfunc", c2,10,10,10,10, c2,300,300,360,288)

# ale následující zápis nebude pracovat, protože byly předány tři klipy funkci
# myfunc (c1, c1 and c2), namísto dvou:
# Animate(c1,0,1000,"myfunc",c1,c2,10,10,10,10,c1,c2,300,300,360,288)

Malý obraz zvětšit na černý klip dokud se nezamění hlavním klipem (sám sebou):

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

Příklady využívající ApplyRange:

ver = Version()
return ver.ApplyRange(0,149,"Crop", 158,0,64,32)
# dává chybu, protože nemůže mít různé velikosti snímků v klipu
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)

#nebo, což je stejné:
clip = AviSource("E:\pdwork\DO-Heaven.avi").BicubicResize(320,240)
ApplyRange(clip,0,48,"Subtitle","Hello World!",25,130,0,99999,"Arial",48)

# ale protože rozsah snímků lze poskytnout do Subtitle samotného, je to stejné jako:
AviSource("E:\pdwork\DO-Heaven.avi").BicubicResize(320,240)
Subtitle("Hello, World!",25,130,0,48,"Arial",48)

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

Český překlad:12.2.2009