生成和导出视频剪辑

视频和音频剪辑是MoviePy里的核心对象。在此节里我们展示了如何生成不同种类的剪辑,以及如何将它们写入文件。关于修改剪辑信息(剪切、特效等),见视频转换与效果。关于如何将多个视频进行合成,见混合剪辑。关于如何在导出前预览视频,见如何更有效率地使用MoviePy

下面的代码总结了你可以用MoviePy生成的剪辑基本类型。

# VIDEO CLIPS
clip = VideoClip(make_frame, duration=4) # for custom animations (see below)
clip = VideoFileClip("my_video_file.mp4") # or .avi, .webm, .gif ...
clip = ImageSequenceClip(['image_file1.jpeg', ...], fps=24)
clip = ImageClip("my_picture.png") # or .jpeg, .tiff, ...
clip = TextClip("Hello !", font="Amiri-Bold", fontsize=70, color="black")
clip = ColorClip(size=(460,380), color=[R,G,B])

# AUDIO CLIPS
clip = AudioFileClip("my_audiofile.mp3") # or .ogg, .wav... or a video !
clip = AudioArrayClip(numpy_array, fps=44100) # from a numerical array
clip = AudioClip(make_frame, duration=3) # uses a function make_frame(t)

视频剪辑的类型

长视频是由视频剪辑组成的。这些剪辑可以使用专门的clip.get_frame()方法输出一个HxWx3的numpy数组来表示剪辑在时间t时的一帧。它们分为两类,一种是动态剪辑(由VideoFileClipVideoClip组成),另一种是非动态剪辑,在任意无限长的持续时间中展示同一图片(ImageClipTextClipColorClip)。还有一种特殊的视频剪辑叫做遮罩,同属于上面的类别,但是输出灰度值帧以表示另一个剪辑里的可见部分。一个视频剪辑可以携带一个音频剪辑clip.audio作为她的音轨,和一个遮罩剪辑。

VideoClip

VideoClip是MoviePy中所有其它视频剪辑里最基本的种类。如果你只想编辑视频文件,你就永远不会用到它。当你想通过从别的库里生成的帧来生成动画时,这个类就会很有用。你需要做的只是定义一个make_frame(t)函数,使它返回一个HxWx3的numpy数组(8位整数)来代表时间t时的帧。这里是一个使用制图库Gizeh的例子:

import gizeh
import moviepy.editor as mpy

def make_frame(t):
    surface = gizeh.Surface(128,128) # width, height
    radius = W*(1+ (t*(2-t))**2 )/6 # the radius varies over time
    circle = gizeh.circle(radius, xy = (64,64), fill=(1,0,0))
    circle.draw(surface)
    return surface.get_npimage() # returns a 8-bit RGB array

clip = mpy.VideoClip(make_frame, duration=2) # 2 seconds
clip.write_gif("circle.gif",fps=15)

http://zulko.github.io/moviepy/_images/circle.gif

注意,剪辑使用make_frame并没有一个精确的帧速率,所以你必须要为write_gifwrite_videofile,以及需要遍历每一帧的方法提供帧速率(fps,每秒的帧数)。

VideoFileClip

视频文件剪辑是由视频文件(支持大多数格式)或GIF文件中读取的剪辑。你可以像这样加载一个视频:

myclip = VideoFileClip("some_video.avi")
myclip = VideoFileClip("some_animation.gif")

注意,这些剪辑都有fps(帧速率)属性,当你对剪辑做小改动时,帧速率将会被传送,而且会以write_videofilewrite_gif等的默认设置会使用。例如:

myclip = VideoFileClip("some_video.avi")
print (myclip.fps) # prints for instance '30'
# Now cut the clip between t=10 and 25 secs. This conserves the fps.
myclip2 = myclip.subclip(10, 25)
myclip2.write_gif("test.gif") # the gif will have 30 fps

详见VideoFileClip

ImageSequenceClip

这是一种由一系列图片组成的剪辑,你可以这样调用:

clip = ImageSequenceClip(images_list, fps=25)