视频合成,也称为非线性编辑,是在新剪辑中一起播放多个剪辑的事实。
开始之前,请注意,视频剪辑通常带有音轨和遮罩,它们也是剪辑。 将这些剪辑组合在一起时,最终的剪辑的配乐和遮罩会通过将剪辑的配乐和遮罩放在一起而自动生成。 因此,大多数时候您无需担心音频和蒙版的混合。
堆叠和串联片段
将剪辑放在一起的两种简单方法是将它们连接起来(在一个较长的剪辑中一个接一个地播放)或堆叠(在一个较大的剪辑中并排放置)。
串联是通过函数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
clip1 = VideoFileClip("myvideo.mp4").margin(10) # add 10px contour
clip2 = clip1.fx( vfx.mirror_x)
clip3 = clip1.fx( vfx.mirror_y)
clip4 = clip1.resize(0.60) # downsize 60%
final_clip = clips_array([[clip1, clip2],
[clip3, clip4]])
final_clip.resize(width=480).write_videofile("my_stack.mp4")
您获得一个看起来像这样的剪辑:
image.png
CompositeVideoClips
CompositeVideoClip类提供了一种非常灵活的剪辑组成方式,但是比concatenate_videoclips和clips_array更复杂
video = CompositeVideoClip([clip1,clip2,clip3])
现在,视频在clip1的顶部播放clip1和clip2,在clip1和clip2顶部播放clip3。 例如,如果clip2和clip3的大小与clip1相同,则只有在顶部的clip3在视频中可见……除非clip3和clip2的遮罩掩盖了它们的一部分。 请注意,默认情况下,构图具有其第一个剪辑的大小(通常是背景)。 但是有时您可能想使剪辑以更大的构图浮动,因此您将指定最终构图的大小,如下所示
video = CompositeVideoClip([clip1,clip2,clip3], size=(720,460))
开始和停止时间
在CompositionClip中,所有剪辑均在clip.start属性指定的时间开始播放。 您可以如下设置开始时间:
clip1 = clip1.set_start(5) # start after 5 seconds
例如,您的构图看起来像
video = CompositeVideoClip([clip1, # starts at t=0
clip2.set_start(5), # start at t=5s
clip3.set_start(9)]) # start at t=9s
在上面的示例中,clip2可能会在clip1结束之前开始。 在这种情况下,您可以使clip2以一秒钟的淡入效果出现:
video = CompositeVideoClip([clip1, # starts at t=0
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))])
有很多方法可以指定位置:
clip2.set_position((45,150)) # x=45, y=150 , in pixels
clip2.set_position("center") # automatically centered
# clip2 is horizontally centered, and at the top of the picture
clip2.set_position(("center","top"))
# clip2 is vertically centered, at the left of the picture
clip2.set_position(("left","center"))
# clip2 is at 40% of the width, 70% of the height of the screen:
clip2.set_position((0.4,0.7), relative=True)
# clip2's position is horizontally centered, and moving down !
clip2.set_position(lambda t: ('center', 50+t) )
当指示位置时,请记住y坐标在图片顶部为零:
image.png
合成音频片段
将视频片段混合在一起时,MoviePy会自动组合它们各自的音轨以形成最终片段的音轨,因此您无需担心自己合成这些音轨。
如果要从多个音频源制作自定义音轨:可以将音频剪辑与CompositeVideoClip和concatenate_videoclips混合在一起:
from moviepy.editor import *
# ... make some audio clips aclip1, aclip2, aclip3
concat = concatenate_audioclips([aclip1, aclip2, aclip3])
compo = CompositeAudioClip([aclip1.volumex(1.2),
aclip2.set_start(5), # start at t=5s
aclip3.set_start(9)])
网友评论