在《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方法进行调用,具体调用语法请参考上面介绍的博文内容。
由于变换函数比较多,老猿将其以自己的标准分为了大小变换、时间变换、颜色变换、内容变换四个部分分别介绍,这种分法不一定非常对,比如有些部分的变换可能既和时间相关又和内容相关,两个归类都可以,大家就不必深究了。在研究这些函数的功能时,是按字母顺序来研究的,研究完后按其变换归类放到4篇博文中,有些函数花的时间比较多,如内容变换的函数scroll、rotate、颜色变换的mask_color,还有个别函数到现在虽然知道功能但不知道怎么使用,因此这个研究过程耗时比较多,对这些函数的研究起始时间是6月22日,到现在已经一个多星期过去了,完全弄懂所有函数的功能和使用方法预计还需要几天时间。
不过到今天颜色相关的变换函数全部完成,因此本文作为介绍和剪辑颜色相关的变换函数就先发布了。
blackwhite函数用于将剪辑变成灰度剪辑,也就是将剪辑中的彩色像素灰度化。
blackwhite(clip, RGB = None, preserve_luminosity=True)
colorx函数函数是将剪辑中每个帧的每个像素的RGB值与参数factor相乘,使得明度增大(参数factor大于1)或降低(参数factor小于1)。
下面的剪辑是对原视频剪辑加载后,将其明度乘以2和除以2之后的两个剪辑合成到一个剪辑中。
合成后的剪辑由于位置不同且明度大的覆盖了明度小的一半位置,效果就是两个不同明度的剪辑各显示了一半,可以看到明显的对比差异。如图:
fadein函数使剪辑在开始播放后的指定时间内从某种颜色(默认为黑色)逐渐显示出来。fadeout使剪辑在剪辑快结束前的指定时间内逐渐淡隐于某种颜色(默认为黑色)。两个函数不改变剪辑的总时长。
这2个函数也可以用于遮罩,不过初始颜色必须取值为0-1之间的浮点数。
fadein(clip, duration, initial_color=None)
fadeout(clip, duration, final_color=None)
二者参数类似,duration为淡入淡出的时长,单位为秒。
if __name__=='__main__':
threads = 8
clipVideo = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4").fx(vfx.fadein,5,(0,0,255)).fx(vfx.fadeout,5,(0,0,0))
clipVideo.write_videofile(r"F:\video\fadeinout.mp4", threads=threads)
clipVideo.close()
以上代码在剪辑首尾各设了5秒的淡入和淡出时间。
gamma_corr函数用于对屏幕图像的色彩进行gamma修正,相关原理请参考《图像处理gamma修正(伽马γ校正)的原理和实现算法》,可能由于实现性能的问题,本函数实现时并没有完整实现gamma修正的算法。
gamma_corr(clip, gamma)
参数gamma为修正的gamma值,典型的Gamma值是0.45,它会使CRT的影像亮度呈现线性。
invert_colors将像素对应颜色进行反转,具体反转方式为,对于标准剪辑,采用255减各RGB的值,对于遮罩剪辑,采用1.0减原值。颜色反转又称为负片转换。
invert_colors函数非常简单,就带一个clip参数。
lum_contrast函数用于对剪辑的亮度对比度(luminosity-contrast )进行校正,这儿的亮度也即明度(参考《音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概念介绍》)。
lum_contrast(clip, lum = 0, contrast=0, contrast_thr=127)
mask_color函数用于将一个剪辑自身进行变换后变成原剪辑的遮罩,当原剪辑与其他剪辑合成时,可以根据遮罩的透明度来确认其他剪辑的显示情况。
mask_color(clip, color=None, thr=0, s=1)
本文详细介绍了moviepy与颜色变换相关的blackwhite、colorx、fadeinout、gamma_corr、invert_colors、lum_contrast、mask_color函数的功能和使用方法,这些函数可以在某些剪辑中用于制造特殊的特效。
更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。
老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。
收费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》,本文收费专栏对应文章为《moviepy音视频剪辑:颜色相关变换函数blackwhite、colorx、fadein/out、gamma_corr、invert_colors、lum_contrast、mask_color详解》。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。