混合剪辑

视频合成,也称为非线性编辑,事实上就是把许多视频剪辑放在一起,变成一个新剪辑。这个视频就是一个很好的例子,告诉你可以用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是一个剪辑,使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")

从而你可以获得一个看起来是这样的剪辑:

http://zulko.github.io/moviepy/_images/stacked.jpeg

合成视频剪辑

CompositeVideoClip类提供了一个非常灵活的方法来合成剪辑,但它比concatenate_videoclipsclips_array更复杂一些。

video = CompositeVideoClip([clip1,clip2,clip3])

当前video播放clip1clip2clip1的上层,而clip3clip1clip2的上层。举例来说,如果clip2clip3clip1有同样的尺寸,那么只有在顶层的clip3能在视频中可见,除非clip3clip2被遮罩隐藏了一部分。注意,在默认情况下,合成的视频和第一个剪辑的尺寸相同(因为它通常是一个背景)。但是有时,你想让你的剪辑在更大的合成视频里浮动,所以你需要像这样特意修改最终合成视频的尺寸:

video = CompositeVideoClip([clip1,clip2,clip3], size=(720,460))

起始和终止时间

在一个合成剪辑中,所有的剪辑开始的时间都被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添加一个1秒钟的淡入效果:

video = CompositeVideoClip([clip1, # starts at t=0
                            clip2.set_start(5).crossfadein(1),
                            clip3.set_start(9).crossfadein(1.5)])

剪辑的定位

如果clip2clip3都比clip1小,你可以决定他们出现在视频中的位置。在这里,我们指定了剪辑左上角像素的坐标:

video = CompositeVideoClip([clip1,
                            clip2.set_pos((45,150)),
                            clip3.set_pos((90,100))])

有很多方法可以指定位置:

clip2.set_pos((45,150)) # x=45, y=150 , in pixels

clip2.set_pos("center") # automatically centered

# clip2 is horizontally centered, and at the top of the picture
clip2.set_pos(("center","top"))

# clip2 is vertically centered, at the left of the picture
clip2.set_pos(("left","center"))

# clip2 is at 40% of the width, 70% of the height of the screen:
clip2.set_pos((0.4,0.7), relative=True)

# clip2's position is horizontally centered, and moving down !
clip2.set_pos(lambda t: ('center', 50+t) )

当指定坐标的时候请记住,y坐标的0位置在图片的最上方:

http://zulko.github.io/moviepy/_images/videoWH.jpeg

合成音频剪辑

当你将视频剪辑混合在一起时,MoviePy将会把它们各自的音轨自动合成为最终剪辑的音轨,所以不用担心需要自行合成音轨啦。 如果你想使用许多音频源来自定义音轨,可以使用CompositeAudioClipconcatenate_audioclips来进行混音。

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)])