在《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的同名实例变量。算法
这些函数的调用能够经过Clip的fx方法和VideoClip的subfx方法进行调用,具体调用语法请参考上面介绍的博文内容。数组
因为变换函数比较多,老猿将其以本身的标准分为了大小变换、时间变换、颜色变换、内容变换四个部分分别介绍,这种分法不必定很是对,好比有些部分的变换可能既和时间相关又和内容相关,两个归类均可以,你们就没必要深究了。app
本文主要介绍和剪辑内容相关的变换函数,包括headblur、mask_and、mask_or、mirror_x、mirror_y、painting、rotate、scroll、supersample。ide
调用语法:
headblur(clip,fx,fy,r_zone,r_blur=None)svg
说明:
其中参数fx和fy是两个函数,该函数带参数t,用于确认t时刻须要模糊化范围的中心点位置,moviepy将对以中心点为圆心半径r_zone的圆范围内的图像进行模糊化处理,模糊化处理时的卷积核大小由r_blur指定。关于r_blur参数的做用请你们参考《moviepy音视频剪辑:headblur的参数r_blur卷积核的功能做用及用途》。关于headblur的案例请参考《moviepy1.03音视频剪辑:使用manual_tracking和headblur实现追踪人脸打马赛克》。函数
mask_and函数用于将两个遮罩剪辑的全部像素的RGB值各取最小值做为新剪辑的像素RGB值。oop
mask_and(clip, other_clip)
if __name__=='__main__': clip1 = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4").crop(0,300,540,660) clip2 = VideoFileClip(r"F:\video\rahdms.mp4").crop(0, 300, 540, 660) newclip = clip1.fx(vfx.mask_and,clip2 ) #preview(newclip) newclip.write_videofile(r"F:\video\WinBasedWorkHard_mask.mp4", threads=8)
剪辑1播放时6秒时刻的截图:
剪辑2播放时6秒时刻的截图:
执行mask_and后的新剪辑6秒时刻的播放截图:
mask_or函数与mask_and相对应,用于将两个遮罩剪辑的全部像素的RGB值各取最大值做为新剪辑的像素RGB值。
mask_or(clip, other_clip)
mirror_x、mirror_y函数分别将剪辑内容左右或上下颠倒。
mirror_x(clip, apply_to="mask")
mirror_y(clip, apply_to="mask")
若是apply_to=“mask”,则遮罩也进行一样处理。
clip = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4").crop(0, 300, 540, 660).subclip(0,15) newclip1 = clip.fx(vfx.mirror_x) newclip2 = clip.fx(vfx.mirror_y) newclip1.write_videofile(r"F:\video\WinBasedWorkHard_mirrorx.mp4", threads=8) newclip2.write_videofile(r"F:\video\WinBasedWorkHard_mirrory.mp4", threads=8)
painting称为画笔特效,使得剪辑中的图像看起来象用画笔绘画出来同样。
painting(clip, saturation=1.4, black=0.006)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Scikit-Image
,更多关于skimage的内容请参考《python skimage图像处理(一)》、《python skimage图像处理(二)》。if __name__=='__main__': clip = VideoFileClip(r"F:\video\WinBasedWorkHard_src.mp4").crop(0, 300, 540, 660) newclip = clip.fx(vfx.painting,saturation=1.6) preview(newclip)
rotate函数用于将剪辑逆时针旋转指定的角度或弧度。
rotate(clip, angle, unit="deg", resample="bicubic", expand=True)
angle:一个表明角度或弧度的数值或者是一个返回两者数值的与时间线相关的函数(带一个参数t)
unit:用于确认angle值对应弧度仍是角度,若是是角度为“deg”,不然为“rad”,弧度和角度的换算关系为:1°=(360/2πr),其中r为半径
resample:图像重采样的算法,缺省为‘bicubic’,能够取值范围包括"nearest", “bilinear”, or “bicubic”
注:图像处理从形式上来讲主要包括两个方面:1 单像素或者邻域像素的处理,好比影像的相加或者滤波运算等;2 图像几何空间变换,如图像的重采样,配准等。经常使用的重采样算法主要包括如下三种:1 最近邻nearest;2 双线性bilinear;3 三次卷积bicubic。
expand:若是为True,会自动扩展每帧剪辑的大小以容纳旋转后的全部图像内容,确保全部图像信息不丢失,不然每帧大小保持和原剪辑一致,新剪辑也与原剪辑同样大小,超出剪辑大小部分的内容将被裁减
下面案例视频随时间线变换旋转不一样的角度,三个不一样播放时刻的截图:
scroll函数是实如今屏幕上水平或垂直滚动播放剪辑的内容,如影片的片尾。
scroll(clip, w=None, h=None, x_speed=0, y_speed=0, x_start=0, y_start=0, apply_to="mask")
supersample函数返回一个新剪辑,新剪辑每一个帧的像素值被替换为该帧先后时段范围内的多个等间距帧的算术平均值。
supersample(clip, d, nframes)
supersample返回的剪辑每一个t时刻帧的像素的值计算方法以下:
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.supersample,1,20) newclip.write_videofile(r"F:\video\WinBasedWorkHard_supersample.mp4", threads=8)
生成剪辑的播放截屏:
能够看到图像模糊化比较厉害。
本文详细介绍了moviepy的视频内容变换相关的函数,这些函数能够实现各自对应的内容变换特效。
更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《专栏:使用PyQt开发图形界面Python应用》。
这篇博文的主要内容7月11日就写好了,但因为headblur函数的测试进展一直不顺就一直耽搁了,这阵子弄清楚又先写了几篇有关的文章(相关文章你们能够到博文目录中查看),耽搁到今天才回头补充完整这篇文章。
更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。
老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只须要19.9元,都适合有必定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深刻、案例更多。本文对应收费专栏的文章为《moviepy音视频剪辑:视频变换处理与内容相关的变换函数介绍》。
收费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》,本文收费专栏对应文章为《moviepy音视频剪辑:视频变换处理与内容相关的变换函数介绍》。
对于缺少Python基础的同仁,能够经过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。
若是有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。