Moviepy 缩放效果需要调整
Moviepy zooming effects need tweaking
我想将剪辑缩放到特定尺寸,然后停止进一步缩放。换句话说,剪辑在达到一定尺寸后停止进一步增加其尺寸,如果剪辑从其原始尺寸的小得多开始缩放到更大的版本则更好。我正在使用电影模块。使用以下代码,我可以逐步缩放剪辑,但很难弄清楚如何将剪辑从小变大,从而创建动画效果。非常感谢您提供的任何反馈。
import os
from moviepy.editor import *
screensize = (640,360)
clip = (ImageClip(img)
.resize(height=screensize[1]*4)
.resize(lambda t : 1+0.02*t)
.set_position(('center', 'center'))
.set_duration(10)
)
我很难弄清楚如何编写函数以使用moviepy的txtclip创建打字效果,这意味着剪辑中的字母将一个接一个地显示,从而创建流畅的打字机动画文字。 Moviepy 得到了一些有用的东西 类,例如 findObjects——它可以检测剪辑中的单个字母:
txtClip = TextClip('Cool effect',color='white', font="Amiri-Bold",
kerning = 5, fontsize=100)
cvc = CompositeVideoClip( [txtClip.set_pos('center')],
size=screensize, transparent=True)
letters = findObjects(cvc) # a list of ImageClips
here is the link: http://zulko.github.io/moviepy/examples/moving_letters.html
找到字母(字母夹)后,我想以这样一种方式加入它们,使它们一个接一个地出现,看起来像打字。
文档中已经有一些移动字母的示例,但是可能会有很大用处。谢谢
这是一种实现您想要的方法。关键是在命名函数中定义调整大小的逻辑,而不是使用 lambda
.
import os
from moviepy.editor import *
def resize_func(t):
if t < 4:
return 1 + 0.2*t # Zoom-in.
elif 4 <= t <= 6:
return 1 + 0.2*4 # Stay.
else: # 6 < t
return 1 + 0.2*(duration-t) # Zoom-out.
duration = 10
screensize = (640,360)
clip_img = (
ImageClip('test.png')
.resize(screensize)
.resize(resize_func)
.set_position(('center', 'center'))
.set_duration(duration)
.set_fps(25)
)
clip = CompositeVideoClip([clip_img], size=screensize)
clip.write_videofile('test.mp4')
编辑
后面的代码回答了你问题的第二部分(我不知道分开两个问题是否更好)。
from __future__ import division
from moviepy.editor import *
from moviepy.video.tools.segmenting import findObjects
def clip_typewriter(text, duration_clip, duration_effect):
# `duration_effect` is effectively the time where the last letter appears.
clip_text = TextClip(
text,
color='white',
font='Consolas',
fontsize=80,
kerning=3,
)
letters = findObjects(clip_text, preview=False)
# Select the start time in seconds for each letter found:
n = len(letters)
times_start = [duration_effect*i/(n-1) for i in range(n)]
clips_letters = []
for i, letter in enumerate(letters):
clips_letters.append(letter
.set_position(letter.screenpos)
.set_start(times_start[i])
.set_end(duration_clip)
# Here you can add key sounds using `set_audio`.
)
return CompositeVideoClip(clips_letters, size=clip_text.size)
if __name__ == '__main__':
screensize = (320, 180)
fps = 12
clip_1 = clip_typewriter('hello', 2, 1).set_start(1).set_position('center')
clip_2 = clip_typewriter('world', 2, 1).set_start(4).set_position('center')
clip_final = CompositeVideoClip([clip_1, clip_2], size=screensize)
clip_final.write_gif('test_typewriter.gif', fps=fps)
结果:
我想将剪辑缩放到特定尺寸,然后停止进一步缩放。换句话说,剪辑在达到一定尺寸后停止进一步增加其尺寸,如果剪辑从其原始尺寸的小得多开始缩放到更大的版本则更好。我正在使用电影模块。使用以下代码,我可以逐步缩放剪辑,但很难弄清楚如何将剪辑从小变大,从而创建动画效果。非常感谢您提供的任何反馈。
import os
from moviepy.editor import *
screensize = (640,360)
clip = (ImageClip(img)
.resize(height=screensize[1]*4)
.resize(lambda t : 1+0.02*t)
.set_position(('center', 'center'))
.set_duration(10)
)
我很难弄清楚如何编写函数以使用moviepy的txtclip创建打字效果,这意味着剪辑中的字母将一个接一个地显示,从而创建流畅的打字机动画文字。 Moviepy 得到了一些有用的东西 类,例如 findObjects——它可以检测剪辑中的单个字母:
txtClip = TextClip('Cool effect',color='white', font="Amiri-Bold",
kerning = 5, fontsize=100)
cvc = CompositeVideoClip( [txtClip.set_pos('center')],
size=screensize, transparent=True)
letters = findObjects(cvc) # a list of ImageClips
here is the link: http://zulko.github.io/moviepy/examples/moving_letters.html
找到字母(字母夹)后,我想以这样一种方式加入它们,使它们一个接一个地出现,看起来像打字。
文档中已经有一些移动字母的示例,但是可能会有很大用处。谢谢
这是一种实现您想要的方法。关键是在命名函数中定义调整大小的逻辑,而不是使用 lambda
.
import os
from moviepy.editor import *
def resize_func(t):
if t < 4:
return 1 + 0.2*t # Zoom-in.
elif 4 <= t <= 6:
return 1 + 0.2*4 # Stay.
else: # 6 < t
return 1 + 0.2*(duration-t) # Zoom-out.
duration = 10
screensize = (640,360)
clip_img = (
ImageClip('test.png')
.resize(screensize)
.resize(resize_func)
.set_position(('center', 'center'))
.set_duration(duration)
.set_fps(25)
)
clip = CompositeVideoClip([clip_img], size=screensize)
clip.write_videofile('test.mp4')
编辑
后面的代码回答了你问题的第二部分(我不知道分开两个问题是否更好)。
from __future__ import division
from moviepy.editor import *
from moviepy.video.tools.segmenting import findObjects
def clip_typewriter(text, duration_clip, duration_effect):
# `duration_effect` is effectively the time where the last letter appears.
clip_text = TextClip(
text,
color='white',
font='Consolas',
fontsize=80,
kerning=3,
)
letters = findObjects(clip_text, preview=False)
# Select the start time in seconds for each letter found:
n = len(letters)
times_start = [duration_effect*i/(n-1) for i in range(n)]
clips_letters = []
for i, letter in enumerate(letters):
clips_letters.append(letter
.set_position(letter.screenpos)
.set_start(times_start[i])
.set_end(duration_clip)
# Here you can add key sounds using `set_audio`.
)
return CompositeVideoClip(clips_letters, size=clip_text.size)
if __name__ == '__main__':
screensize = (320, 180)
fps = 12
clip_1 = clip_typewriter('hello', 2, 1).set_start(1).set_position('center')
clip_2 = clip_typewriter('world', 2, 1).set_start(4).set_position('center')
clip_final = CompositeVideoClip([clip_1, clip_2], size=screensize)
clip_final.write_gif('test_typewriter.gif', fps=fps)
结果: