ai-content-maker/.venv/Lib/site-packages/moviepy/video/compositing/transitions.py

127 lines
3.8 KiB
Python
Raw Permalink Normal View History

2024-05-11 23:00:43 +03:00
"""
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)