【MoviePy 中文文档】混合剪辑
视频合成,也被称为非线性编辑,是在一个新剪辑中一起播放几个剪辑的事实。这个视频是一个很好的例子,说明你可以用 MoviePy 进行合成:
在开始之前,请注意视频剪辑通常带有音轨和蒙版,它们也是剪辑。将这些片段组合在一起时,最终片段的音轨和蒙版是通过将片段的音轨和蒙版放在一起来自动生成的。因此,大多数时候你无需担心混合音频和蒙版。
堆叠和串联剪辑
将剪辑放在一起的两种简单方法是将它们连接起来(在单个长剪辑中一个接一个地播放它们)或将它们堆叠(在单个较大的剪辑中并排放置)。
连接是通过函数 concatenate_videoclips
完成的:
from moviepy.editor import VideoFileClip, concatenate_videoclips clip1 = VideoFileClip('myvideo.mp4')clip2 = VideoFileClip('myvideo2.mp4').subclip(50, 60)clip3 = VideoFileClip('myvideo3.mp4')final_clip = concatenate_videoclips([clip1, clip2, clip3])final_clip.write_videofile('my_concatenation.mp4')
final_clip
是一个依次播放片段1、2和3的片段。请注意,剪辑不需要具有相同的大小。如果它们不是,它们都会出现在一个足够大的剪辑中,这个剪辑可以容纳最大的一个,还可以选择一种你选择的颜色来填充边框。你还有许多其他选项(请参阅函数的文档)。例如,可以使用选项 transition = my_clip
在片段之间播放过渡片段。
堆叠使用 clip_array
完成:
from moviepy.editor import VideoFileClip, clips_array, vfx # 添加10px轮廓clip1 = VideoFileClip('myvideo.mp4').margin(10)clip2 = clip1.fx(vfx.mirror_x)clip3 = clip1.fx(vfx.mirror_y)# 缩小60%clip4 = clip1.resize(0.60)final_clip = clips_array([[clip1, clip2], [clip3, clip4]])final_clip.resize(width = 480).write_videofile('my_stack.mp4')
获得的剪辑如下所示:
复合视频剪辑
CompositeVideoClip 类提供了一种非常灵活的组合剪辑的方法,但比 concatenate_videoclips
和 clips_array
更复杂
video = CompositeVideoClip([clip1, clip2, clip3])
现在 video
播放 clip1
和 clip2
在 clip1
的顶部,clip3
在 clip1
和 clip2
的顶部。例如,如果 clip2
和 clip3
的大小与 clip1
的大小相同,则只有位于顶部的 clip3
在视频中可见,除非 clip3
和 clip2
具有隐藏其部分的蒙版。请注意,默认情况下,合成具有第一个剪辑的大小(因为它通常是背景)。但有时你会想让你的剪辑在更大的构图中浮动,所以你会指定最终构图的大小如下:
video = CompositeVideoClip([clip1, clip2, clip3], size = (720, 460))
开始和停止时间
在 CompositionClip 中,所有剪辑都在 clip.start
属性指定的时间开始播放。你可以按如下方式设置此开始时间:
# 5秒后启动clip1 = clip1.set_start(5)
例如以下的组合方式:
# clip1 片段0秒开始,clip2 片段5秒开始,clip3 片段9秒开始video = CompositeVideoClip([clip1, clip2.set_start(5), clip3.set_start(9)])
在上面的例子中,clip2
可能会在 clip1
结束之前开始。在这种情况下,可以使 clip2
以一秒钟的淡入效果出现:
video = CompositeVideoClip([clip1, clip2.set_start(5).crossfadein(1), clip3.set_start(9).crossfadein(1.5)])
定位剪辑
如果 clip2
和 clip3
小于 clip1
,则可以通过设置它们的位置来决定它们将出现在构图中的位置。在这里,我们指示剪辑的左上角像素的坐标:
video = CompositeVideoClip([clip1,clip2.set_position((45, 150)), clip3.set_position((90, 100))])
有多种方法可以指定位置:
# x = 45,y = 150,以像素为单位clip2.set_position((45, 150)) # 自动居中clip2.set_position('center') # clip2 水平居中,位于图片顶部clip2.set_position(('center', 'top')) # clip2 垂直居中,在图片的左侧clip2.set_position(('left', 'center')) # clip2 的水平位置为屏幕宽度的40%,垂直位置为屏幕高度的70%clip2.set_position((0.4, 0.7), relative = True) # clip2 的位置是水平居中的,并且向下移动!clip2.set_position(lambda t: ('center', 50 + t))
指示位置时,请记住y坐标的零位于图片顶部:
合成音频剪辑
当你将视频剪辑混合在一起时,MoviePy 将自动编辑它们各自的音轨以形成最终剪辑的音轨,因此你无需担心自己合成这些音轨。
如果你想从多个音频源制作自定义音轨,音频剪辑可以与 CompositeAudioClip
和 concatenate_audioclips
混合在一起:
from moviepy.editor import * # 制作一些音频片段aclip1、aclip2、aclip3concat = concatenate_audioclips([aclip1, aclip2, aclip3])compo = CompositeAudioClip([aclip1.volumex(1.2), aclip2.set_start(5), aclip3.set_start(9)])