127 lines
3.8 KiB
Python
127 lines
3.8 KiB
Python
|
"""
|
||
|
Here is the current catalogue. These are meant
|
||
|
to be used with clip.fx. There are available as transfx.crossfadein etc.
|
||
|
if you load them with ``from moviepy.editor import *``
|
||
|
"""
|
||
|
|
||
|
from moviepy.decorators import add_mask_if_none, requires_duration
|
||
|
from moviepy.video.fx.fadein import fadein
|
||
|
from moviepy.video.fx.fadeout import fadeout
|
||
|
|
||
|
from .CompositeVideoClip import CompositeVideoClip
|
||
|
|
||
|
|
||
|
@requires_duration
|
||
|
@add_mask_if_none
|
||
|
def crossfadein(clip, duration):
|
||
|
""" Makes the clip appear progressively, over ``duration`` seconds.
|
||
|
Only works when the clip is included in a CompositeVideoClip.
|
||
|
"""
|
||
|
clip.mask.duration = clip.duration
|
||
|
newclip = clip.copy()
|
||
|
newclip.mask = clip.mask.fx(fadein, duration)
|
||
|
return newclip
|
||
|
|
||
|
|
||
|
@requires_duration
|
||
|
@add_mask_if_none
|
||
|
def crossfadeout(clip, duration):
|
||
|
""" Makes the clip disappear progressively, over ``duration`` seconds.
|
||
|
Only works when the clip is included in a CompositeVideoClip.
|
||
|
"""
|
||
|
clip.mask.duration = clip.duration
|
||
|
newclip = clip.copy()
|
||
|
newclip.mask = clip.mask.fx(fadeout, duration)
|
||
|
return newclip
|
||
|
|
||
|
|
||
|
def slide_in(clip, duration, side):
|
||
|
""" Makes the clip arrive from one side of the screen.
|
||
|
|
||
|
Only works when the clip is included in a CompositeVideoClip,
|
||
|
and if the clip has the same size as the whole composition.
|
||
|
|
||
|
Parameters
|
||
|
===========
|
||
|
|
||
|
clip
|
||
|
A video clip.
|
||
|
|
||
|
duration
|
||
|
Time taken for the clip to be fully visible
|
||
|
|
||
|
side
|
||
|
Side of the screen where the clip comes from. One of
|
||
|
'top' | 'bottom' | 'left' | 'right'
|
||
|
|
||
|
Examples
|
||
|
=========
|
||
|
|
||
|
>>> from moviepy.editor import *
|
||
|
>>> clips = [... make a list of clips]
|
||
|
>>> slided_clips = [CompositeVideoClip([
|
||
|
clip.fx(transfx.slide_in, duration=1, side='left')])
|
||
|
for clip in clips]
|
||
|
>>> final_clip = concatenate( slided_clips, padding=-1)
|
||
|
|
||
|
"""
|
||
|
w, h = clip.size
|
||
|
pos_dict = {'left': lambda t: (min(0, w*(t/duration-1)), 'center'),
|
||
|
'right': lambda t: (max(0, w*(1-t/duration)), 'center'),
|
||
|
'top': lambda t: ('center', min(0, h*(t/duration-1))),
|
||
|
'bottom': lambda t: ('center', max(0, h*(1-t/duration)))}
|
||
|
|
||
|
return clip.set_position(pos_dict[side])
|
||
|
|
||
|
|
||
|
@requires_duration
|
||
|
def slide_out(clip, duration, side):
|
||
|
""" Makes the clip go away by one side of the screen.
|
||
|
|
||
|
Only works when the clip is included in a CompositeVideoClip,
|
||
|
and if the clip has the same size as the whole composition.
|
||
|
|
||
|
Parameters
|
||
|
===========
|
||
|
|
||
|
clip
|
||
|
A video clip.
|
||
|
|
||
|
duration
|
||
|
Time taken for the clip to fully disappear.
|
||
|
|
||
|
side
|
||
|
Side of the screen where the clip goes. One of
|
||
|
'top' | 'bottom' | 'left' | 'right'
|
||
|
|
||
|
Examples
|
||
|
=========
|
||
|
|
||
|
>>> from moviepy.editor import *
|
||
|
>>> clips = [... make a list of clips]
|
||
|
>>> slided_clips = [CompositeVideoClip([
|
||
|
clip.fx(transfx.slide_out, duration=1, side='left')])
|
||
|
for clip in clips]
|
||
|
>>> final_clip = concatenate( slided_clips, padding=-1)
|
||
|
|
||
|
"""
|
||
|
|
||
|
w,h = clip.size
|
||
|
ts = clip.duration - duration # start time of the effect.
|
||
|
pos_dict = {'left' : lambda t: (min(0,w*(-(t-ts)/duration)),'center'),
|
||
|
'right' : lambda t: (max(0,w*((t-ts)/duration)),'center'),
|
||
|
'top' : lambda t: ('center',min(0,h*(-(t-ts)/duration))),
|
||
|
'bottom': lambda t: ('center',max(0,h*((t-ts)/duration))) }
|
||
|
|
||
|
return clip.set_position(pos_dict[side])
|
||
|
|
||
|
|
||
|
@requires_duration
|
||
|
def make_loopable(clip, cross_duration):
|
||
|
""" Makes the clip fade in progressively at its own end, this way
|
||
|
it can be looped indefinitely. ``cross`` is the duration in seconds
|
||
|
of the fade-in. """
|
||
|
d = clip.duration
|
||
|
clip2 = clip.fx(crossfadein, cross_duration).set_start(d - cross_duration)
|
||
|
return CompositeVideoClip([clip, clip2]).subclip(cross_duration, d)
|