创建和导出视频片段
视频和音频剪辑是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(t)方法的剪辑,该方法输出代表时间t处剪辑帧的HxWx3 numpy数组。 主要有两类:动画剪辑(由VideoFileClip和VideoClip制作)和无动画剪辑,它们以先验的无限持续时间显示同一张图片(ImageClip,TextClip,``ColorClip'')。 还有一些特殊的视频剪辑调用遮罩,它们属于上述类别,但会输出灰度帧,指示其他剪辑的哪些部分可见或不可见。 视频剪辑可以包含音频剪辑(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)

请注意,使用make_frame进行剪辑的剪辑没有明确的帧频,因此必须为write_gif和write_videofile提供帧频(fps,每秒帧数),更普遍的是,需要迭代这些帧的任何方法。
VideoFileClip
VideoFileClip是从视频文件(支持大多数格式)或GIF文件读取的剪辑。 您按以下方式加载视频:
myclip = VideoFileClip("some_video.avi")
myclip = VideoFileClip("some_animation.gif")
请注意,这些剪辑将具有fps(每秒帧数)属性,如果您对该剪辑进行了少量修改,则将传输该属性,默认情况下,它们将在write_videofile,write_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)
其中images_list可以是按此顺序的图像名称(将要播放)的列表,文件夹名称(在这种情况下,文件夹中的所有图像文件将按字母数字顺序播放)或帧列表(Numpy数组) ),例如从其他剪辑中获得。
提供文件夹名称或文件名称列表时,可以选择load_images = True来指定所有图像都应加载到RAM中。 仅当您有少量图像将被多次使用(例如,如果图像形成循环动画)时,这才有意义。
ImageClip
ImageClip是始终显示相同图像的视频剪辑。 您可以如下创建一个:
myclip = ImageClip("some_picture.jpeg")
myclip = ImageClip(somme_array) # a (height x width x 3) RGB numpy array
myclip = some_video_clip.to_ImageClip(t='01:00:00') # frame at t=1 hour.
有关更多信息,请参见ImageClip。
下面显示的ImageClip的两个示例是TextClip和ColorClip
TextClip
生成TextClip需要安装ImageMagick,并且(对于Windows用户)链接到MoviePy,请参阅安装说明。
这是制作文本剪辑的方式(您一直不需要所有这些选项):
myclip = TextClip("Hello", font='Amiri-Bold')
该字体可以是计算机上安装的任何字体,但是ImageMagick将具有特定的名称。 例如,普通的Amiri字体将被称为Amiri-Regular,而Impact字体将被称为Impact-Normal。 要获取可能的字体列表,请键入TextClip.list('font')。 要查找与给定字体相关的所有字体名称,请使用例如
TextClip.search('Amiri', 'font') # Returns all font names containing Amiri
还要注意,对小写字母使用笔画(或轮廓)不能很好地工作,因此,如果需要带有轮廓的小文本,最好先生成一个大文本,然后将其缩小:
myclip = TextClip("Hello", fontsize=70, stroke_width=5).resize(height=15)
TextClips有很多选择:对齐,字距调整(字母之间的距离),笔划大小,背景,自动换行等。有关更多信息,请参见TextClip。
Mask clips
遮罩是一种特殊的视频剪辑,它指示带有该遮罩的视频剪辑将与其他视频剪辑一起组成时,哪些像素是可见的(请参阅混合剪辑)。 当您将剪辑导出为GIF文件或PNG时,遮罩还可以用于定义透明度。
蒙版和标准剪辑之间的根本区别在于,标准剪辑输出的帧每像素具有3个分量(RGB),介于0和255之间,而蒙版每个像素只有一种成分,介于0和1之间(1表示完全可见的像素 0表示透明像素)。 否则,遮罩将始终处于灰度状态。
创建或加载要用作遮罩的剪辑时,需要声明它:
maskclip = VideoClip(makeframe, duration=4, ismask=True)
maskclip = ImageClip("my_mask.jpeg", ismask=True)
maskclip = VideoFileClip("myvideo.mp4", ismask=True)
对于视频和图像文件,如果还不是黑白文件,它们将被自动转换。
然后,使用myclip.set_mask(maskclip)将此蒙版附加到剪辑(必须具有相同的尺寸)。
某些图像格式(例如PNG)支持带有alpha图层的透明度,MoviePy将其用作遮罩:
myclip = ImageClip("image.png", transparent=True) # True is the default
myclip.mask # <- the alpha layer of the picture.
可以使用clip.to_mask()将任何视频剪辑转换为遮罩,并使用my_mask_clip.to_RGB()将遮罩转换为标准RGB视频剪辑。
遮罩在许多方面有不同的处理方式(因为它们的帧不同),但是您可以使用遮罩来处理标准剪辑中几乎所有的操作:您可以对其进行剪切,编辑,预览,将其写入视频文件, 制作快照等
导出视频片段
视频文件(.mp4,.webm,.ogv…)
要将片段作为视频文件写入,请使用
my_clip.write_videofile("movie.mp4") # default codec: 'libx264', 24 fps
my_clip.write_videofile("movie.mp4",fps=15)
my_clip.write_videofile("movie.webm") # webm format
my_clip.write_videofile("movie.webm",audio=False) # don't render audio.
MoviePy具有最常见文件扩展名的默认编解码器名称。 如果要使用外来格式,或者对默认设置不满意,可以为编解码器提供codec ='mpeg4'。 编写视频时,有很多选项(比特率,音频编写的参数,文件大小优化,要使用的处理器数量等)。 请参考write_videofile()以获得更多信息。
有时MoviePy无法猜测剪辑的持续时间属性(请记住,某些剪辑(例如显示图片的ImageClip)具有先验的无限持续时间)。 然后,必须使用clip.set_duration手动设置持续时间:
# Make a video showing a flower for 5 seconds
my_clip = Image("flower.jpeg") # has infinite duration
my_clip.write_videofile("flower.mp4") # Will fail ! NO DURATION !
my_clip.set_duration(5).write_videofile("flower.mp4") # works !
GIF动画
要以动画GIF格式编写视频,请使用
my_clip.write_gif('test.gif', fps=12)
请注意,这需要安装ImageMagick。 否则,您还可以通过添加选项program ='ffmpeg'来使用ffmpeg创建GIF,它会快得多,但效果不会很好,也不会进行优化。
有许多选项可以优化gif的质量和大小。 请参考write_gif()。
请注意,编辑gif的最佳方法是按以下说明在笔记本中预览它们:ipython_display
有关使用示例,请参见此博客文章,以获取有关从视频文件制作GIF的信息,以及另一篇有关具有矢量图形的GIF动画的文章。
导出图像
您可以使用以下命令将框架写入图像文件
myclip.save_frame("frame.png") # by default the first frame is extracted
myclip.save_frame("frame.jpeg", t='01:00:00') # frame at time t=1h
如果剪辑具有遮罩,除非您指定withmask = False,否则它将被导出为图像的Alpha层。
网友评论