在moviepy中,所有剪辑的基类是Clip,对应的模块为moviepy.Clip,常用的剪辑类包括:VideoClip、AudioClip、VideoFileClip、AudioFileClip、ImageSequenceClip、ImageClip、CompositeVideoClip、CompositeAudioClip、TextClip、ColorClip,它们之间的继承关系如下:
VideoClip的子类还有DataVideoClip、UpdatedVideoClip这2个。
start属性用于多个子剪辑拼接成一个剪辑的场景,每个子剪辑通过设置自己的start来指定自己在合成后的剪辑中的播放开始时间,该属性通过方法set_start来设置。
set_start(self, t, change_end=True)
该方法会返回一段调用者的浅拷贝剪辑,该拷贝剪辑的start会被设置为t。
其中:
下面剪辑的时间参数如无特别说明都可以是这四种形式的时间。
end属性用于多个子剪辑拼接成一个剪辑的场景,每个子剪辑通过设置自己的end来指定自己在合成后的剪辑中的播放的结束时间,该属性通过方法set_end来设置。
set_end(self, t)
duration属性保存剪辑的时长,如果为None,表示剪辑无限长。可以调用set_duration改变剪辑的时长。
set_duration(self, t, change_end=True)
memoize属性用于控制剪辑是否应保留内存读取的最后一帧,如果为True保留,否则不保留,默认值为False,可以通过方法set_memoize进行修改。
set_memoize(self, memoize)
当memoize为True时,则memoized_t、memoized_frame用于保存最后一次读取的帧的位置和对应的帧。
copy方法会将调用者对应剪辑用浅拷贝(Shallow copy )方式复制一份,如果对应剪辑有音轨和遮罩,同样会浅拷贝复制到新剪辑中。
copy(self)
get_frame方法返回剪辑指定时刻位置的视频或音频帧,每个帧实际上一个表示RGB图像或音频的numpy类型数组。
get_frame(self, t)
如果剪辑的memoize属性为True,则会使用memoized_t、memoized_frame保留访问帧的位置和帧数据。
fl方法是一个通用的剪辑处理方法,它返回一个新剪辑,新剪辑的所有帧是当前调用剪辑对象的帧经过函数fun变换处理后的帧。
fl(self, fun, apply_to=None, keep_duration=True)
fl_time方法返回一个新剪辑,新剪辑是调用剪辑的一个浅拷贝,但新剪辑的时间线被调整,实际上这个方法就是对剪辑进行一个基于时间特效的处理,如快播、慢播、倒序播放等。
fl_time(self, t_func, apply_to=None, keep_duration=False)
fx方法是用于执行参数指定的函数,并返回函数的执行结果。
fx(self, func, *args, **kwargs)
该方法等同于执行:func(self, *args, **kwargs)
这个方法的用途是当需要使用一系列方法依次调用处理剪辑且每个方法返回的新剪辑作为下次调用者时可以简化语句。
set_fps方法非常简单,就是用于设置fps的值,调用方法为:set_fps(self, fps)
,但该方法修改的不是调用剪辑对象的值,而是调用对象剪辑的浅拷贝对象的fps值,返回对象为新剪辑。
set_ismask方法非常简单,就是用于设置是否有遮罩,调用方法为:set_ismask(self, ismask)`,但该方法修改的不是调用剪辑对象的值,而是调用对象剪辑的浅拷贝对象的ismask值,返回对象为新剪辑。
该方法用于判断对应时间是否在剪辑的start和end之间。
is_playing(self, t)
如果t是一个时间,且位于剪辑的start和end之间,则返回True,否则返回False。
如果t是一个numpy数组,如果数组的所有元素代表时间都不在剪辑的start和end之间则返回False,否则返回一个向量[b_1, b_2, b_3…], 如果数组指定位置i的时间在剪辑的start和end之间,则b_i为True,否则为False。
subclip方法用于从调用剪辑中取指定的剪辑段构造一个新剪辑对象返回,原剪辑保持不变。
subclip(self, t_start=0, t_end=None)
返回调用剪辑的t_start到t_end之间的剪辑段,如果t_end为None,则t_end被设置为剪辑的duration,如果t_end为负数,则t_end被设置为剪辑的duration + t_end。
cutout方法将调用剪辑对象的剪辑去除掉指定位置段后返回。
cutout(self, ta, tb)
返回调用剪辑对象的剪辑去除ta到tb这一段之后的剪辑,如果原剪辑设置了duration属性,则返回剪辑的duration=原剪辑的duration-(tb - ta)。
iter_frames方法不是一个剪辑编辑的方法,其功能是为了迭代访问剪辑的所有帧,返回值为一个迭代器,每迭代一次返回下一帧。
iter_frames(self, fps=None, with_times = False, logger=None, dtype=None)
释放剪辑使用的所有资源。
老猿关于PyQt的付费专栏《使用PyQt开发图形界面Python应用》只需要9.9元,本专栏《PyQt+moviepy音视频剪辑实战》文档的同样内容在付费专栏上也有相应内容,总体来说付费专栏介绍更详细或案例更多。本节内容对应付费专栏的《moviepy音视频剪辑:moviepy中的剪辑基类clip详解》。如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。