【MoviePy 中文文档】带有移动字母的文本
我认为这个例子很好地说明了基于脚本的编辑的兴趣(想象一下手动完成)。
这是代码:
import numpy as np from moviepy.editor import *from moviepy.video.tools.segmenting import findObjects # 我们创建将要移动的文本,并将其居中。 screensize = (720, 460)txtClip = TextClip('Cool effect', color = 'white', font = 'Amiri-Bold', kerning = 5, fontsize = 100)cvc = CompositeVideoClip([txtClip.set_pos('center')], size = screensize) # 接下来的四个函数定义了移动字母的四种方式 # 辅助函数rotMatrix = lambda a: np.array([[np.cos(a), np.sin(a)], [-np.sin(a), np.cos(a)]]) def vortex(screenpos, i, nletters): # 阻尼 d = lambda t: 1.0 / (0.3 + t ** 8) # 运动角度 a = i * np.pi / nletters v = rotMatrix(a).dot([-1, 0]) if i % 2 : v[1] = -v[1] return lambda t: screenpos + 400 * d(t) * rotMatrix(0.5 * d(t) * a).dot(v) def cascade(screenpos, i, nletters): v = np.array([0, -1]) d = lambda t: 1 if t < 0 else abs(np.sinc(t) / (1 + t ** 4)) return lambda t: screenpos + v * 400 * d(t - 0.15 * i) def arrive(screenpos, i, nletters): v = np.array([-1, 0]) d = lambda t: max(0, 3 - 3 * t) return lambda t: screenpos - 400 * v * d(t - 0.2 * i) def vortexout(screenpos, i, nletters): # 阻尼 d = lambda t: max(0, t) # 运动角度 a = i * np.pi / nletters v = rotMatrix(a).dot([-1, 0]) if i % 2 : v[1] = -v[1] return lambda t: screenpos + 400 * d(t - 0.1 * i) * rotMatrix(-0.2 * d(t) * a).dot(v) # 我们使用 PLUGIN findObjects 来定位和分隔每个字母 # ImageClips 列表letters = findObjects(cvc) # 我们把字母做成动画 def moveLetters(letters, funcpos): return [letter.set_pos(funcpos(letter.screenpos, i, len(letters))) for i, letter in enumerate(letters)] clips = [CompositeVideoClip(moveLetters(letters, funcpos), size = screensize).subclip(0, 5) for funcpos in [vortex, cascade, arrive, vortexout]] # 我们将字母设置为动画,将所有内容连接起来并写入文件final_clip = concatenate_videoclips(clips)final_clip.write_videofile('../../coolTextEffects.avi', fps = 25, codec = 'mpeg4')