moviepy音视频剪辑:与time时间线相关的变换函数freeze_region、make_loopable、speedx、time_mirror、time_symmetrize介绍
☞ ░ 前往老猿Python博文目录 ░
一、引言
在《moviepy音视频剪辑:moviepy中的剪辑基类Clip详解》介绍了剪辑基类的fl、fl_time、fx方法,在《moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解》介绍了fl_image和subfx方法,在《Python+moviepy音视频剪辑:视频帧数据的本质、Clip的fl方法进行变换处理的原理以及滚屏案例》及《moviepy音视频剪辑:使用fl_time进行诸如快播、慢播、倒序播放等时间特效处理的原理和可能遇到的坑》分别介绍了fl和fl_time进行视频剪辑变换的原理及使用方法。
实际上moviepy所有视频变换的方法都是以Clip的fl方法为基础衍生出来的,最后都会调用到fl方法实施真正的变换,只是变换处理的逻辑由上面方法提供,如fl_time就是针对剪辑的时间线进行变换、fl_image就是针对剪辑的内容进行变换,开发者也可以根据自己的需要实现自己的变换方法。
为了支持一些常规的变换处理,moviepy提供了一系列常用的变换函数,开发者可以直接使用这些方法进行变换,这些函数都在moviepy.video.fx包下,基本上一个函数就是一个文件,在moviepy.editor通过import moviepy.video.fx.all as vfx中将这些函数都加载到了vfx模块下,可以直接通过vfx.函数名方式调用,也可以通过VideoClip类+函数名直接调用,这是因为在moviepy.editor执行录入如下语句:
for method in [
    "afx.audio_fadein",
    "afx.audio_fadeout",
    "afx.audio_normalize",
    "afx.volumex",
    "transfx.crossfadein",
    "transfx.crossfadeout",
    "vfx.crop",
    "vfx.fadein",
    "vfx.fadeout",
    "vfx.invert_colors",
    "vfx.loop",
    "vfx.margin",
    "vfx.mask_and",
    "vfx.mask_or",
    "vfx.resize",
    "vfx.rotate",
    "vfx.speedx",
]:
    exec("VideoClip.%s = %s" % (method.split(".")[1], method))
将这些函数动态赋值给了VideoClip的同名实例变量,但这些实例变量是在moviepy.editor中定义的,因此在VideoClip的派生子类中不能这样使用。
这些函数的调用可以通过Clip的fx方法和VideoClip的subfx方法进行调用,具体调用语法请参考上面介绍的博文内容。
由于变换函数比较多,老猿将其以自己的标准分为了大小变换、时间变换、颜色变换、内容变换四个部分分别介绍,这种分法不一定非常对,比如有些部分的变换可能既和时间相关又和内容相关,两个归类都可以,大家就不必深究了。
本文主要介绍和剪辑时间线相关的变换函数。
二、freeze函数
freeze函数用于将指定时刻位置的帧延时显示freeze_duration秒,剪辑的整体时长也增加了freeze_duration秒。
调用语法:
freeze(clip, t=0, freeze_duration=None, total_duration=None, padding_end=0)
参数说明:
- t、padding_end:t为剪辑冻结位置的时间位置,一般为浮点数,单位为秒,但如果t的值为字符串‘end’,则t=剪辑的时长-padding_end-1
- freeze_duration:该帧持续显示的时间,浮点数,单位秒
- total_duration:为新剪辑的duration,实际冻结时间freeze_duration=total_duration-原剪辑的duration
三、freeze_region函数
功能说明:
freeze_region函数主要用于将剪辑中指定屏幕范围内容固定为参数指定的某个时刻的内容,它包括三种形式的设定:
- 将剪辑中参数矩形指定的范围固定为指定时刻该剪辑的帧在该矩形内的范围
- 将剪辑中除了参数矩形指定的范围是正常播放外,其他部分固定为指定时刻的内容
- 将剪辑中参数指定时刻的帧加遮罩后与正常剪辑剪辑叠加
调用语法:freeze_region(clip, t=0, region=None, outside_region=None, mask=None)
参数说明:
- t:t为在剪辑中要固定显示内容对应在剪辑中的时刻,即freeze_region函数是将剪辑中t时刻对应的屏幕显示中参数指定区域的内容固定显示在剪辑所有时刻的对应屏幕位置
- region:取t时刻region对应矩形的屏幕内容作为固定显示内容,矩形是一个四元组 (x1, y1, x2, y2),分别指定矩形的左上角和右下角
- outside_region:取t时刻outside_region对应矩形外的屏幕内容作为固定显示内容,矩形是一个四元组 (x1, y1, x2, y2),分别指定矩形的左上角和右下角,即正常播放内容是outside_region指定区域的内容,其他区域固定为t时刻的内容
- mask:将t时刻对应屏幕的内容构建一个固定画面的剪辑后,将该剪辑的mask设置为参数mask指定的遮罩后,将该剪辑与原剪辑合成叠加播放
- 参数region、outside_region、mask是有优先级的,三者中前面的如果出现了后面的不起作用
四、loop函数
loop函数将当前剪辑重复n次或无限循环。
调用语法:loop(self, n=None, duration=None)
说明:
- 如果n有值则重复n次
- 如果n和duration都有值,则剪辑重复n次后的时长被设置为duration
- 如果n为None,duration有值,则剪辑的时长被强制值为duration,如果duration比原剪辑duration大,则会重复原剪辑的内容
- 如果n和duration都为None,则剪辑无限制循环。
五、make_loopable函数
make_loopable使剪辑在它自己的末端逐渐淡入,这样它就可以使用loop进行循环处理时过渡比较好。
调用语法:make_loopable(clip, cross)
参数cross是淡入的持续时间(秒)。
处理逻辑说明:
具体处理时,将剪辑clip的拷贝从duration-cross时开始进行淡入处理得到的新剪辑与原剪辑在duration-cross时叠加,最后剪辑的时长保留为原剪辑的时长。
上述处理后,原剪辑从duration-cross开始会淡入到剪辑的开头。
示例代码:
if __name__=='__main__':
    threads = 8
    clip = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4").subclip(0, 10)
    newclip = clip.fx(vfx.make_loopable, 3).set_fps(clip.fps)
    newclip.write_videofile(r"F:\video\WinBasedWorkHard_loopable.mp4", threads=threads)
六、speedx函数
speedx函数返回的剪辑的播放速度是原剪辑的n倍,n为相关参数指定或计算得出。
调用语法:speedx(clip, factor=None, final_duration=None)
speedx函数很简单,就三个参数,clip为原剪辑,factor为需要达到的倍数,final_duration为新剪辑的最终播放时长。factor和final_duration只要有一个存在有效值就可以,如果二者都存在或者仅final_duration存在有效值,则factor值被置为原剪辑的时长除以final_duration的值。如果原剪辑的duration存在有效值,新剪辑的时长设置为clip.duration/factor。
案例:
if __name__=='__main__':
    clip = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4", audio=False).crop(0, 300, 540, 840).subclip(0, 10)
    newclip = clip.speedx(2)
    newclip.write_videofile(r"F:\video\WinBasedWorkHard_speedx.mp4", threads=8)
以上代码输出的视频的播放速度是原剪辑的2倍。
七、time_mirror函数
time_mirror函数返回原剪辑的一个倒序播放剪辑,该函数只带一个clip参数。
案例:
if __name__=='__main__':
    clip = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4", audio=False).fx(vfx.crop,0, 300, 540, 840).subclip(0, 10)
    newclip = clip.fx(vfx.time_mirror)
    newclip.write_videofile(r"F:\video\WinBasedWorkHard_time_mirror.mp4", threads=8)
注意:
- 该函数会同时对剪辑的遮罩和音频生效;
- 经老猿验证测试,moviepy 1.03版本中该函数处理效率大大低于moviepy 2.0.0Dev1版本,但moviepy 2.0.0Dev1版本在处理到最后时存在BUG,老猿已经在GitHub的moviepy项目中上报,应该会很快解决。
八、time_symmetrize函数
time_symmetrize函数将当前调用剪辑进行处理后,返回一个调用剪辑和调用剪辑倒序播放的剪辑的拼接剪辑,该剪辑前半部分为调用剪辑的内容,后半部分为调用剪辑的倒序播放的剪辑。这种处理方法能使得剪辑能构成循环播放,在制作动画时非常有用。该函数同步作用于剪辑的遮罩和音频。该函数只带一个clip参数。
案例:
if __name__=='__main__':
    clip = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4", audio=False).fx(vfx.crop,0, 300, 540, 840).subclip(0,10)
    newclip = clip.fx(vfx.time_symmetrize)
    newclip.write_videofile(r"F:\video\WinBasedWorkHard_time_symmetrize.mp4", threads=8)
九、小结
本节详细介绍了moviepy提供的与时间线相关的变换函数,这些函数本质上是调用fl_time函数完成变换的,只是提供了一些更典型场景的时间线变换处理函数,有了这些经典时间线变换场景支持的函数,开发者可以更快的实现诸如倍速、倒序、循环播放等基本的时间特效。
更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《专栏:使用PyQt开发图形界面Python应用》。
关于收费专栏
老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。
收费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》,本文收费专栏对应文章为《moviepy音视频剪辑:与time时间线相关的变换函数freeze_region、make_loopable、speedx、time_mirror、time_symmetrize详解及使用案例》。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎现在购买付费专栏。
跟老猿学Python、学5G!
☞ ░ 前往老猿Python博文目录 ░
moviepy音视频剪辑:与time时间线相关的变换函数freeze_region、make_loopable、speedx、time_mirror、time_symmetrize介绍的更多相关文章
- PyQt+moviepy音视频剪辑实战文章目录
		☞ ░ 前往老猿Python博文目录 ░ 本专栏为moviepy音视频剪辑合成相关内容介绍的免费专栏,对应的收费专栏为<moviepy音视频开发专栏>. 一.moviepy基础能力系统介绍 ... 
- moviepy音视频剪辑:使用rotate函数实现视频变换处理以及参数expand取值为True时的花屏问题解决方案
		☞ ░ 前往老猿Python博文目录 ░ 一.rotate函数功能介绍 moviepy的rotate函数用于将剪辑逆时针旋转指定的角度或弧度. 调用语法:rotate(clip, angle, uni ... 
- moviepy音视频剪辑:视频变换处理与内容相关的变换函数headblur、mask_and/or、mirror_x/y、rotate、painting、scroll介绍
		一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<moviepy音视频剪辑:视频剪辑基类VideoC ... 
- moviepy音视频剪辑:与大小相关的视频变换函数crop、even_size、margin、resize介绍
		☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ... 
- moviepy音视频剪辑:与大小相关的视频变换函数详解
		☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ... 
- moviepy音视频剪辑:颜色相关变换函数blackwhite、colorx、fadein/out、gamma_corr、invert_colors、lum_contrast、mask_color介绍
		☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ... 
- Python+moviepy音视频剪辑:视频帧数据的本质、Clip的fl方法进行变换处理的原理以及滚屏案例
		专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ... 
- moviepy音视频剪辑:使用fl_time进行诸如快播、慢播、倒序播放等时间特效处理的原理和可能遇到的坑
		专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ... 
- moviepy音视频剪辑:moviepy中的剪辑基类Clip的属性和方法详解
		专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ... 
随机推荐
- 动态链接的PLT与GOT
			本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/147 最近在研究缓冲区溢出攻击的试验,发现其中有一种方法叫做re ... 
- python动态规划
			动态规划: 动态规划表面上很难,其实存在很简单的套路:当求解的问题满足以下两个条件时, 就应该使用动态规划: 主问题的答案 包含了 可分解的子问题答案 (也就是说,问题可以被递归的思想求 ... 
- Python基础学习之常用模块
			1. 模块 告诉解释器到哪里查找模块的位置:比如sys.path.append('C:/python') 导入模块时:其所在目录中除源代码文件外,还新建了一个名为__pycache__ 的子目录,这个 ... 
- wpf 全局异常捕捉+错误日志记录+自动创建桌面图标
			/// /// 创建桌面图标 /// public static void CreateShortcutOnDesktop(string LnkName) { String shortcutPath ... 
- 【转】jps 命令使用
			jps(Java Virtual Machine Process Status Tool)是JDK1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简 ... 
- linux后台开发常用调试工具
			一.编译阶段 nm 获取二进制文件包含的符号信息 strings 获取二进制文件包含的字符串常量 strip ... 
- windows10  vs2017编译opencv_contrib3.4.7的小坑及编译好的资源
			1.注意要用正斜杠 / 不要用 \ https://github.com/opencv/opencv/issues/11655 CMake Error at cmake/OpenCVModu ... 
- socket套接字(字节序、地址转换)
			什么是socket: socket可以看成是用户进程与内核网络协议栈的编程接口. socket不仅可以用于本机的进程间通信,还可以用于网络上 不同主机之间的进程通信.IPv4套接口地址结构 struc ... 
- ESP8266 鼓捣记 - 从零制作一个温湿度计
			一.前言 经过上一篇文章 <ESP8266 鼓捣记 - 入门(环境搭建) >搭建好环境后,肯定不会满足于 Hello World ,想快速做一个实际有用的东西出来,我认为温湿度计就非常合适 ... 
- 【鸿蒙应用开发】使用确切位置布局(PositionLayout)实现登录页面
			上一节我们了解了PositionLayout(确切位置布局,我更倾向于称为绝对布局),虽然应用场景稀少.维护不方便,但是该有的示例还是不能少. UI图拆解及代码实现 这个界面我们是不是很熟悉,打开浏览 ... 
 
			
		
