回到目录 <https://blog.csdn.net/ucsheep/article/details/80999939>


很久没有更新了。目前使用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")
举个栗子,大家得到画面差不多和这个相似



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位置的坐标系,在指定位置时,出现在我们脑海里的坐标系应该是这样子的



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

回到目录 <https://blog.csdn.net/ucsheep/article/details/80999939>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信