混合剪辑¶
视频合成,也称为非线性编辑,事实上就是把许多视频剪辑放在一起,变成一个新剪辑。这个视频就是一个很好的例子,告诉你可以用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")
从而你可以获得一个看起来是这样的剪辑:
合成视频剪辑¶
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))
起始和终止时间¶
在一个合成剪辑中,所有的剪辑开始的时间都被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)])
剪辑的定位¶
如果clip2
和clip3
都比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位置在图片的最上方:
合成音频剪辑¶
当你将视频剪辑混合在一起时,MoviePy将会把它们各自的音轨自动合成为最终剪辑的音轨,所以不用担心需要自行合成音轨啦。
如果你想使用许多音频源来自定义音轨,可以使用CompositeAudioClip
和concatenate_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)])