在《moviepy音视频剪辑:moviepy中的剪辑基类Clip详解》介绍了剪辑基类的fl、fl_time、fx方法,在《moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解》介绍了fl_image和subfx方法,在《Python+moviepy音视频剪辑:视频帧数据的本质、Clip的fl方法进行变换处理的原理以及滚屏案例》及《moviepy音视频剪辑:使用fl_time进行诸如快播、慢播、倒序播放等时间特效处理的原理和可能遇到的坑》分别介绍了fl和fl_time进行视频剪辑变换的原理及使用方法。html
实际上moviepy全部视频变换的方法都是以Clip的fl方法为基础衍生出来的,最后都会调用到fl方法实施真正的变换,只是变换处理的逻辑由上面方法提供,如fl_time就是针对剪辑的时间线进行变换、fl_image就是针对剪辑的内容进行变换,开发者也能够根据本身的须要实现本身的变换方法。python
为了支持一些常规的变换处理,moviepy提供了一系列经常使用的变换函数,开发者能够直接使用这些方法进行变换,这些函数都在moviepy.video.fx包下,基本上一个函数就是一个文件,在moviepy.editor经过import moviepy.video.fx.all as vfx
中将这些函数都加载到了vfx模块下,能够直接经过vfx.函数名方式调用,也能够经过VideoClip类+函数名直接调用,这是由于在moviepy.editor执行录入以下语句:web
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的派生子类中不能这样使用。ide
这些函数的调用能够经过Clip的fx方法和VideoClip的subfx方法进行调用,具体调用语法请参考上面介绍的博文内容。svg
因为变换函数比较多,老猿将其以本身的标准分为了大小变换、时间变换、颜色变换、内容变换四个部分分别介绍,这种分法不必定很是对,好比有些部分的变换可能既和时间相关又和内容相关,两个归类均可以,你们就没必要深究了。函数
本文主要介绍和剪辑时间线相关的变换函数。oop
freeze函数用于将指定时刻位置的帧延时显示freeze_duration秒,剪辑的总体时长也增长了freeze_duration秒。学习
freeze(clip, t=0, freeze_duration=None, total_duration=None, padding_end=0)
测试
freeze_region函数主要用于将剪辑中指定屏幕范围内容固定为参数指定的某个时刻的内容,它包括三种形式的设定:动画
freeze_region(clip, t=0, region=None, outside_region=None, mask=None)
loop函数将当前剪辑重复n次或无限循环。
loop(self, n=None, duration=None)
make_loopable使剪辑在它本身的末端逐渐淡入,这样它就可使用loop进行循环处理时过渡比较好。
参数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函数返回的剪辑的播放速度是原剪辑的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函数返回原剪辑的一个倒序播放剪辑,该函数只带一个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)
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。
若是有兴趣也愿意支持老猿的读者,欢迎如今购买付费专栏。