MoviePy - 中文文档2-快速上手-MoviePy-视频合成

很久没有更新了。目前使用moviepy的项目里各种问题接踵而至,第一批我只采集了1w个抖音短视频做视频合成,不得不说,moviepy还是不少缺陷的,最开始的大部分时候是ffmpeg引起的OOM,是我分配的内存不够,加大资源分配,每次运行完毕之后清除cache,杀掉已经存在的ffmpeg,稳定运行时间达到了8个小时多,然而在昨晚凌晨又死掉了。现在还在收拾,今天再来更新一下。

Mixing clips(就是视频合成,拼接混合)

视频的排版,众所周知,这是一个非线性编辑的技术活,有时候还要把几段clip在一个新的clip里面一起播放。

还有一点很重要,一般情况下,每一个video clip都带有一个audio 和一个 mask,分别是audio clip和mask clip,通俗地讲就是每一个视频切片带有一个音频切片和一个蒙版切片。所以,当我们把几个视频排版混合到一起的时候。声音轨道和mask也同时被混合在一起形成最终的clip。所以但多数时候我们是不需要操心声音和mask的。

视频叠加和视频拼接

简单地把多个视频合成到一起的两种最简单的办法。1.把视频一个接一个地拼接起来。2.视频叠加在一块,比如一个大的画面同时播几个视频。

视频拼接我们使用concatenate_videoclips函数来完成。

from moviepy.editor import VideoFileClip, concatenate_videoclips

clip1 = VideoFileClip("myvideo.mp4")
clip2 = VideoFileClip("myvideo2.mp4").subclip(50,60)
clip3 = VideoFileClip("myvideo3.mp4")

finalclip = concatenate_videoclips([clip1, clip2, clip3])
finalclip.write_videofile("my_concatenate.mp4")

finalclip会按照clip1,clip2,clip3的顺序将这三个clip播放。这些clip并不需要相同的时长或者大小,仅仅是首尾相连而已。我们还可以通过transition=my_clip这个参数来设置一下clip之间衔接的过渡动画。

视频叠加我们使用clip_array函数来完成

from moviepy.editor import VideoFileClip, clips_array, vfx

clip1 = VideoFileClip("myvideo.mp4").margin(10)
clip2 = clip1.fx(vfx.mirror_x)#x轴镜像
clip3 = clip1.fx(vfx.mirror_y)#y轴镜像
clip4 = clip1.resize(0.6)#尺寸等比缩放0.6

final_clip = clips_array([
                            [clip1, clip2],
                            [clip3, clip3]
                        ])
final_clip.resize(width=480).write_videofile("my_stack.mp4")

举个栗子,大家得到画面差不多和这个相似

../_images/stacked.jpeg

CompositeVideoClips

CompositeVideoClip这个类提供来更加灵活的方式来排版视频,但是它可要比concatenate_videoclips和clips_array要复杂的多了。

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

现在,这3个clip是堆叠起来的,啥情况呢,就是,clip2压在clip1上,clip3压在最上面。大家可以想像成栈结构,从左往右,依次入栈这么堆叠在一块,对于一个普通的视频来说,这样堆叠实在是没办法看了。你想像一下,如果clip3的尺寸是最大的,比clip1和clip2都大,那我们只能看到clip3,clip1和clip2都被盖住了。最终要合成的clip的尺寸是默认第一个clip的尺寸,一般第一个也就是做背景用了,但是我们有时候是需要我们的clip浮在一个比较大的合成体的上方的,那这个时候我们就需要声明合成clip的尺寸。看看下面的栗子。

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

开始和结束时间

在堆叠视频中,每个clip会在通过clip.start函数声明的时间开始播放,我们可以像下面这样去设置。

clip1 = clip1.set_start(5) #在5秒时开始

所以一般情况下,我们代码中的视频堆叠都长这个样子。

video = CompositeVideoClip([
                            clip1, #在第0秒开始
                            clip2.set_start(5), #在第5秒开始
                            clip3.set_start(9)  #第9秒开始
                            ])

在下面的栗子里,可能clip2开始的时候,正好是clip1将要结束的时机,这样的情况,我们可以让clip2使用在一秒内“渐入”的特效来显示。

video = CompositeVideoClip([   
                            clip1,
                            clip2.set_start(5).crossfadein(1),
                            clip3.set_start(9).crossfadein(1.5)
                            ])

Positioning clips

clip们的位置设定。

clip2和clip3都比clip1要小,那你可以通过设定位置决定clip2和clip3在画面中的位。下面的栗子就是通过指定坐标的形式(距离左上方的像素距离)把clip2和clip3在画面中指定位置。

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

在moviepy中我们有很多的方法定位clip的位置

clip2.set_pos((45,150)) #像素坐标
clip2.set_pos("center") #居中
clip2.set_pos(("center","top")) #水平方向居中,但是处置方向放置在顶部
clip2.set_pos(("left","center")) #水平方向放置在左边,垂直方向居中
clip2.set_pos((0.4,0.7), relative=True) #0.4倍宽,0.7倍高处
clip2.set_pos(lambda t: ('center', 50+t)) #水平居中,向下移动

clip位置的坐标系,在指定位置时,出现在我们脑海里的坐标系应该是这样子的

../_images/videoWH.jpeg

Compositing audio clips

合成声音clips

在混合vedio clips时,MoviePy将会自动地把这些vedio自带的audio clip按照一定形式混合在一起形成最终的clip,开发者不需要为了这个操心。

如果你有一些特殊的的定制合成音频的需求,应该使用CompositeAudioClip和concatenate_audioclips这俩类。

from moviepy.editor imports *

concat = concatenate_audioclips([clip1, clip2, clip3])
compo = CompositeAudioClip([
                            aclip1.volumex(1.2),
                            aclip2.set_start(5), # start at t=5s
                            aclip3.set_start(9)
                            ])

QQ群:MoviePy中文 :819718037

猜你喜欢

转载自blog.csdn.net/ucsheep/article/details/81329598