moviepy音视频剪辑:moviepy中的剪辑基类Clip的属性和方法详解
一、概述
在moviepy中,所有剪辑的基类是Clip,对应的模块为moviepy.Clip,常用的剪辑类包括:VideoClip、AudioClip、VideoFileClip、AudioFileClip、ImageSequenceClip、ImageClip、CompositeVideoClip、CompositeAudioClip、TextClip、ColorClip,它们之间的继承关系如下:
二、Clip类的属性
2.1、start属性
start属性用于多个子剪辑拼接成一个剪辑的场景,每个子剪辑通过设置自己的start来指定自己在合成后的剪辑中的播放开始时间,该属性通过方法set_start来设置。
set_start语法:
set_start(self, t, change_end=True)
说明:
该方法会返回一段调用者的浅拷贝剪辑,该拷贝剪辑的start会被设置为t。
其中:
- t为需要设置的开始时间,表示方法可以是如下四种之一:
- 秒,为一个浮点数数字,如75.35;
- 分钟和秒组成的元组,如(1,15.35);
- 时、分、秒组成的元组,如(0,1,15.35)
- 用冒号分隔的时间字符串,如‘0:1:15.35’
下面剪辑的时间参数如无特别说明都可以是这四种形式的时间。
- change_end,表示是否修改剪辑的end的值
- 如果为False,则copy剪辑的end值保持不变,当end存在有效值时,copy剪辑的duration属性被设置为end-start
- 如果为True,且剪辑duration存在有效值,则拷贝剪辑的end属性被更改为:start+duration
2.2、end属性
end属性用于多个子剪辑拼接成一个剪辑的场景,每个子剪辑通过设置自己的end来指定自己在合成后的剪辑中的播放的结束时间,该属性通过方法set_end来设置。
set_end语法
set_end(self, t)
说明:
- 类似set_start方法,该方法返回一个调用者的拷贝剪辑,该拷贝剪辑的end被设置为t
- 如果该拷贝剪辑设置了start属性,则剪辑的duration属性会被设置为end-start,start属性保持不变
- 如果该拷贝剪辑未置start属性,则duration属性保持不变,start属性被设置为max(0,end-duration)
2.3、duration属性
duration属性保存剪辑的时长,如果为None,表示剪辑无限长。可以调用set_duration改变剪辑的时长。
set_duration调用语法:
set_duration(self, t, change_end=True)
2.4、memoize属性
memoize属性用于控制剪辑是否应保留内存读取的最后一帧,如果为True保留,否则不保留,默认值为False,可以通过方法set_memoize进行修改。
set_memoize 调用语法:
set_memoize(self, memoize)
2.5、memoized_t、memoized_frame属性
当memoize为True时,则memoized_t、memoized_frame用于保存最后一次读取的帧的位置和对应的帧。
三、Clip类的方法
3.1、copy方法
copy方法会将调用者对应剪辑用浅拷贝(Shallow copy )方式复制一份,如果对应剪辑有音轨和遮罩,同样会浅拷贝复制到新剪辑中。
调用语法:copy(self)
3.2、get_frame方法
get_frame方法返回剪辑指定时刻位置的视频或音频帧,每个帧实际上一个表示RGB图像或音频的numpy类型数组。
调用语法:get_frame(self, t)
如果剪辑的memoize属性为True,则会使用memoized_t、memoized_frame保留访问帧的位置和帧数据。
3.3、fl方法
fl方法是一个通用的剪辑处理方法,它返回一个新剪辑,新剪辑的所有帧是当前调用剪辑对象的帧经过函数fun变换处理后的帧。
调用语法:
fl(self, fun, apply_to=None, keep_duration=True)
说明:
- fun:参数fun是对剪辑帧进行变换的函数,带2个参数,第一个参数gf表示当前剪辑的get_frame方法,第二个参数为以秒为单位的剪辑位置t,t会作为gf的参数。fun函数的返回值为经过变换后的帧
- apply_to:apply_to表示变换过滤器fl是否需要同时作用于剪辑的音频和遮罩,其值可以为’mask’、‘audio’、[‘mask’,‘audio’]
- keep_duration:如果为True表示不改变剪辑的duration属性
3.4、fl_time方法
fl_time方法返回一个新剪辑,新剪辑是调用剪辑的一个浅拷贝,但新剪辑的时间线被调整,实际上这个方法就是对剪辑进行一个基于时间特效的处理,如快播、慢播、倒序播放等。
调用语法:
fl_time(self, t_func, apply_to=None, keep_duration=False)
说明:
- t_func:参数t_func是对剪辑帧进行变换的函数,它将剪辑位置 t 变为t_func(t)
- apply_to:apply_to表示变换是否需要同时作用于剪辑的音频和遮罩,其值可以为’mask’、‘audio’、[‘mask’,‘audio’]
- keep_duration:如果为True表示不改变剪辑的duration属性,缺省为False,如果变化修改了duration需要设置为False
- 关于fl_time方法的更多内容请参考《moviepy音视频剪辑:使用fl_time进行诸如快播、慢播、倒序播放等时间特效处理的原理和可能遇到的坑》
3.5、fx方法
fx方法是用于执行参数指定的函数,并返回函数的执行结果。
调用语法:
fx(self, func, *args, **kwargs)
说明:
该方法等同于执行:func(self, *args, **kwargs)
这个方法的用途是当需要使用一系列方法依次调用处理剪辑且每个方法返回的新剪辑作为下次调用者时可以简化语句。
3.6、set_fps方法
set_fps方法非常简单,就是用于设置fps的值,调用方法为:set_fps(self, fps)
,但该方法修改的不是调用剪辑对象的值,而是调用对象剪辑的浅拷贝对象的fps值,返回对象为新剪辑。
3.7、set_ismask方法
set_ismask方法非常简单,就是用于设置是否有遮罩,调用方法为:set_ismask(self, ismask)`,但该方法修改的不是调用剪辑对象的值,而是调用对象剪辑的浅拷贝对象的ismask值,返回对象为新剪辑。
3.8、is_playing方法
该方法用于判断对应时间是否在剪辑的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。
3.9、subclip方法
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。
3.10、cutout方法
cutout方法将调用剪辑对象的剪辑去除掉指定位置段后返回。
调用语法:cutout(self, ta, tb)
说明:
返回调用剪辑对象的剪辑去除ta到tb这一段之后的剪辑,如果原剪辑设置了duration属性,则返回剪辑的duration=原剪辑的duration-(tb - ta)。
3.11、iter_frames方法
iter_frames方法不是一个剪辑编辑的方法,其功能是为了迭代访问剪辑的所有帧,返回值为一个迭代器,每迭代一次返回下一帧。
调用语法:
iter_frames(self, fps=None, with_times = False, logger=None, dtype=None)
说明:
- iter_frames方法将剪辑的每帧作为一个HxWxN的numpy数组返回,N为1表示遮罩剪辑帧,N=3为RGB剪辑帧
- 如果剪辑本身有fps参数,则fps为可选参数
- 使用图片流编写视频时,dtype设置为“uint8”
3.12、close方法
释放剪辑使用的所有资源。
广告
老猿关于PyQt的付费专栏《使用PyQt开发图形界面Python应用》只需要9.9元,本专栏《PyQt+moviepy音视频剪辑实战》文档的同样内容在付费专栏上也有相应内容,总体来说付费专栏介绍更详细或案例更多。本节内容对应付费专栏的《moviepy音视频剪辑:moviepy中的剪辑基类clip详解》。如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。