一、引言

在《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的同名实例变量。

这些函数的调用可以通过Clip的fx方法和VideoClip的subfx方法进行调用,具体调用语法请参考上面介绍的博文内容。

由于变换函数比较多,老猿将其以自己的标准分为了大小变换、时间变换、颜色变换、内容变换四个部分分别介绍,这种分法不一定非常对,比如有些部分的变换可能既和时间相关又和内容相关,两个归类都可以,大家就不必深究了。

本文主要介绍和剪辑内容相关的变换函数,包括headblur、mask_and、mask_or、mirror_x、mirror_y、painting、rotate、scroll、supersample。

二、headblur函数

调用语法:

headblur(clip,fx,fy,r_zone,r_blur=None)

说明:

其中参数fx和fy是两个函数,该函数带参数t,用于确认t时刻需要模糊化范围的中心点位置,moviepy将对以中心点为圆心半径r_zone的圆范围内的图像进行模糊化处理,模糊化处理时的卷积核大小由r_blur指定。关于r_blur参数的作用请大家参考《moviepy音视频剪辑:headblur的参数r_blur卷积核的功能作用及用途》。关于headblur的案例请参考《moviepy1.03音视频剪辑:使用manual_tracking和headblur实现追踪人脸打马赛克》。

三、mask_and函数

mask_and函数用于将两个遮罩剪辑的所有像素的RGB值各取最小值作为新剪辑的像素RGB值。

调用语法:mask_and(clip, other_clip)
说明:
  • clip是调用剪辑
  • other_clip可以是剪辑,也可以是一个内存的中的图像(numpy数组)
  • 新剪辑的duration被设置为clip的duration
  • 两个剪辑的大小必须相同
  • 虽然文档说明上解释mask_and的操作对象为两个遮罩剪辑,实际上函数未对剪辑的类型进行任何限制,如两个标准剪辑也可以这样处理。
案例:
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_or函数与mask_and相对应,用于将两个遮罩剪辑的所有像素的RGB值各取最大值作为新剪辑的像素RGB值。

调用语法:mask_or(clip, other_clip)
说明:
  • clip是调用剪辑
  • other_clip可以是剪辑,也可以是一个内存的中的图像(numpy数组)
  • 新剪辑的duration被设置为clip的duration
  • 两个剪辑的大小必须相同
  • 虽然文档说明上解释mask_and的操作对象为两个遮罩剪辑,实际上函数未对剪辑的类型进行任何限制,如两个标准剪辑也可以这样处理。

五、mirror_x、mirror_y函数

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称为画笔特效,使得剪辑中的图像看起来象用画笔绘画出来一样。

调用语法:painting(clip, saturation=1.4, black=0.006)
说明:
  • saturation表示饱和度,black表示黑色线条的数量,black值的含义老猿暂时没弄明白,估计与边缘检测相关
  • painting函数如果将整个剪辑进行处理,开销大不说,剪辑的效果看起来也比较怪异,其实最合适的是取某些时刻的帧进行处理后输出或者重新更新到剪辑中可能会得到比较好的特效
  • painting使用了边缘检测,需要安装支持sobel方法进行边缘检测的图像处理模块skimage或scipy,老猿安装的是skimage,安装指令: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函数用于将剪辑逆时针旋转指定的角度或弧度。

调用语法: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函数是实现在屏幕上水平或垂直滚动播放剪辑的内容,如影片的片尾。

调用语法:

scroll(clip, w=None, h=None, x_speed=0, y_speed=0, x_start=0, y_start=0, apply_to="mask")

参数说明:
  • w,h:滚动内容显示区域的大小,也是变换完后剪辑的大小
  • x_speed,y_speed:滚动速度,单位为:像素/秒
  • x_start,y_start:从剪辑的哪个位置开始滚动
  • apply_to:是否对遮罩等进行同样处理

九、supersample函数

supersample函数返回一个新剪辑,新剪辑每个帧的像素值被替换为该帧前后时段范围内的多个等间距帧的算术平均值。

调用语法:supersample(clip, d, nframes)
说明:

supersample返回的剪辑每个t时刻帧的像素的值计算方法如下:

  1. 将[t-d,t+d]时间段平均分成nframes个等间距时刻
  2. 取nframes时刻对应的nframes个帧
  3. 将nframes个帧对应位置的像素值取算术平均值作为新帧的像素值。
注意:
  1. 如果[t-d,t+d]时间段平均分成nframes个等间距时刻出现了负值,则从剪辑剪辑的duration+t位置获取帧数据
  2. 如果t时刻没有对应的帧,则取最接近t时刻的比t小的对应帧;
  3. 这种取平均值的方法可能会导致运动影像的模糊,并且由于运算量大,输出文件会比一般情况慢很多,这种处理方式不适于一般的影像处理,对于一些与科学相关的影像可能有特殊用途。
案例:

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。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学5G!

☞ ░ 前往老猿Python博文目录

moviepy音视频剪辑:视频变换处理与内容相关的变换函数headblur、mask_and/or、mirror_x/y、rotate、painting、scroll介绍的更多相关文章

  1. PyQt+moviepy音视频剪辑实战文章目录

    ☞ ░ 前往老猿Python博文目录 ░ 本专栏为moviepy音视频剪辑合成相关内容介绍的免费专栏,对应的收费专栏为<moviepy音视频开发专栏>. 一.moviepy基础能力系统介绍 ...

  2. Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载

    ☞ ░ 前往老猿Python博文目录 ░ 一.简介 MoviePy是一个用于视频编辑的Python模块,可用于进行视频的基本操作(如剪切.拼接.标题插入).视频合成(也称非线性编辑).视频处理或创建高 ...

  3. moviepy音视频开发:使用credits1给视频加片头片尾字幕

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip.UpdatedVideoClip.ImageClip. ...

  4. 视频剪辑什么鬼?Python 带你高效创作短视频

    ​阅读文本大概需要 10 分钟. 近两年,抖音.快手将短视频推到风口浪尖上,要生产出高质量的视频,离不开视频剪辑这一环节:在全民剪片浪潮中,大众使用最多的剪辑软件如:Pr.FCPX.剪印.Vue 等. ...

  5. Python+moviepy音视频剪辑:视频帧数据的本质、Clip的fl方法进行变换处理的原理以及滚屏案例

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...

  6. moviepy音视频剪辑:使用rotate函数实现视频变换处理以及参数expand取值为True时的花屏问题解决方案

    ☞ ░ 前往老猿Python博文目录 ░ 一.rotate函数功能介绍 moviepy的rotate函数用于将剪辑逆时针旋转指定的角度或弧度. 调用语法:rotate(clip, angle, uni ...

  7. PyQt+moviepy音视频剪辑实战2:一个剪裁视频文件精华内容留存工具的实现

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 ...

  8. PyQt+moviepy音视频剪辑实战2:实现一个剪裁视频文件精华内容留存工具

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 ...

  9. moviepy音视频剪辑:mask clip遮罩剪辑、遮片、蒙版的作用以及其包含的构成内容

    ☞ ░ 前往老猿Python博文目录 ░ 在阅读moviepy的类ImageClip的构造方法代码时,对于其中涉及遮罩的处理没有理解,到处查找遮罩的资料没有查到,最后到moviepy的官网上尝试了一下 ...

随机推荐

  1. 数据结构 - 二叉树的遍历(递归VS非递归)

    import java.util.LinkedList; public class BinaryTree { public static void main(String[] args) { int ...

  2. 【Kata Daily 190910】Who likes it?(谁点了赞?)

    题目: Description: You probably know the "like" system from Facebook and other pages. People ...

  3. Loading descriptor for XXX.'has encountered a problem' A internal error occured during:"Loading ....."

    在JavaWeb部署Tomcat后启动Jsp发现这样的报错 这可能是Tomcat的运行欢迎有问题,按下图所示打开Tomcat界面.Servers目录就是当前工作空间对所有工程适用的的Tomcat环境, ...

  4. ant-design-vue 快速避坑指南

    ant-design-vue是蚂蚁金服 Ant Design 官方唯一推荐的Vue版UI组件库,它其实是Ant Design的Vue实现,组件的风格与Ant Design保持同步,组件的html结构和 ...

  5. 【SpringCloud】08.客户端负载均衡器:Ribbon

    客户端负载均衡器:Ribbon Ribbon实现软负载均衡核心: 服务发现 :依据服务的名字,把该服务下所有的实例都找出来 服务选择规则:依据规则策略,如果从多个实例中,选出有效的服务 服务监听:检测 ...

  6. 手写简易React-Fiber

    1.首先创建createElement函数 1 function createElement ( 2 type, 3 config, 4 ...children 5 ) { 6 7 const pro ...

  7. mdp文件-Chapter1-MINIM.mdp

    mdp文件是能量最小化,NVT模拟,NPT模拟与MD模拟的必须文件. mdp文件的详细解释可以参考官方文档http://manual.gromacs.org/online/mdp_opt.html 接 ...

  8. TP5 RCE

    Thinkphp5 RCE 复现 环境: win10+wamp+thinkphp5.1.29 下载地址 源码分析 程序首先跳转到 public目录下的index.php,然后执行 thinkphp/l ...

  9. spring mvc 基础知识

    spring mvc 在web.xml中的配置: 例子: <?xml version="1.0" encoding="UTF-8"?> <we ...

  10. pycharm远程编译

    1. 按照 https://www.cnblogs.com/xiongmao-cpp/p/7856596.html 完成配置 2. 使用步骤: (1)在本地新建代码文件或工程 (2)编写代码,完成后若 ...