moviepy 音视频剪辑:moviepy 中的剪辑基类 Clip 的属性和方法详解
一、概述
在 moviepy 中,所有剪辑的基类是 Clip,对应的模块为 moviepy.Clip,常用的剪辑类包括:VideoClip、AudioClip、VideoFileClip、AudioFileClip、ImageSequenceClip、ImageClip、CompositeVideoClip、CompositeAudioClip、TextClip、ColorClip,它们之间的继承关系如下:
###### 说明:
VideoClip 的子类还有 DataVideoClip、UpdatedVideoClip 这 2 个。
二、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、memoizedt、memoizedframe 属性
当 memoize 为 True 时,则 memoizedt、memoizedframe 用于保存最后一次读取的帧的位置和对应的帧。
三、Clip 类的方法
3.1、copy 方法
copy 方法会将调用者对应剪辑用浅拷贝(Shallow copy )方式复制一份,如果对应剪辑有音轨和遮罩,同样会浅拷贝复制到新剪辑中。
调用语法:copy(self)
3.2、get_frame 方法
get_frame 方法返回剪辑指定时刻位置的视频或音频帧,每个帧实际上一个表示 RGB 图像或音频的 numpy 类型数组。
##### 调用语法:get_frame(self, t)
如果剪辑的 memoize 属性为 True,则会使用 memoizedt、memoizedframe 保留访问帧的位置和帧数据。
3.3、fl 方法
fl 方法是一个通用的剪辑处理方法,它返回一个新剪辑,新剪辑的所有帧是当前调用剪辑对象的帧经过函数 fun 变换处理后的帧。
调用语法:
fl(self, fun, apply_to=None, keep_duration=True)
说明:
fun:参数 fun 是对剪辑帧进行变换的函数,带 2 个参数,第一个参数 gf 表示当前剪辑的 get_frame 方法,第二个参数为以秒为单位的剪辑位置 t,t 会作为 gf 的参数。fun 函数的返回值为经过变换后的帧
applyto:applyto 表示变换过滤器 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:参数 tfunc 是对剪辑帧进行变换的函数,它将剪辑位置 t 变为 t_func(t)
applyto:applyto 表示变换是否需要同时作用于剪辑的音频和遮罩,其值可以为'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 方法
setismask 方法非常简单,就是用于设置是否有遮罩,调用方法为:setismask(self, ismask)`,但该方法修改的不是调用剪辑对象的值,而是调用对象剪辑的浅拷贝对象的 ismask 值,返回对象为新剪辑。
3.8、is_playing 方法
该方法用于判断对应时间是否在剪辑的 start 和 end 之间。
调用语法:is_playing(self, t)
说明:
如果 t 是一个时间,且位于剪辑的 start 和 end 之间,则返回 True,否则返回 False。
如果 t 是一个 numpy 数组,如果数组的所有元素代表时间都不在剪辑的 start 和 end 之间则返回 False,否则返回一个向量[b1, b2, b_3...], 如果数组指定位置 i 的时间在剪辑的 start 和 end 之间,则 b_i 为 True,否则为 False。
3.9、subclip 方法
subclip 方法用于从调用剪辑中取指定的剪辑段构造一个新剪辑对象返回,原剪辑保持不变。
调用语法:subclip(self, t_start=0, t_end=None)
说明:
返回调用剪辑的 tstart 到 tend 之间的剪辑段,如果 tend 为 None,则 tend 被设置为剪辑的 duration,如果 tend 为负数,则 tend 被设置为剪辑的 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 方法
释放剪辑使用的所有资源。
四、小结
本节详细介绍了 Moviepy 中的剪辑基类 Clip 的属性和方法,Clip 是 Moviepy 所有剪辑的基类,对应的模块为 moviepy.Clip,其包含的属性和方法是其他剪辑类的操作基本方法。
更多 moviepy 的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《[moviepy 音视频开发专栏](https://blog.csdn.net/laoyuanpython/category_10232926.html)》。
版权声明: 本文为 InfoQ 作者【老猿Python】的原创文章。
原文链接:【http://xie.infoq.cn/article/1a2407251e1df69a007b5ebc9】。文章转载请联系作者。
评论