moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip类详解
☞ ░ 前往老猿Python博文目录 ░
一、概述
在《moviepy音视频剪辑:moviepy中的剪辑相关类及关系》介绍了剪辑相关类及关系,其中VideoClip有多个直接子类和间接子类。
本文中将介绍的DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip都是VideoClip的子类,其中DataVideoClip、UpdatedVideoClip在前面文中未进行介绍,之所以将这几个类在此一并介绍,是因为这几个类都在VideoClip类相同的模块文件VideoClip.py中。
二、DataVideoClip
DataVideoClip是VideoClip的直接子类,它的视频剪辑的连续帧都是从一系列数据集经过函数处理生成的,DataVideoClip类只有构造方法,没有独有属性和其他方法,因此DataVideoClip其实就是通过数据集经函数处理构造的视频剪辑。
构造方法如下:
__init__(self, data, data_to_frame, fps, ismask=False, has_constant_size=True)
说明:
- data:用于生成视频剪辑的原始数据集列表
- data_to_frame:用于对数据进行处理的函数,带一个参数为生成一个帧的原始数据,data_to_frame对该数据进行处理后生成帧数据
- fps:生成剪辑的帧率
- has_constant_size:与父类的has_constant_size参数相同
实际上处理时,是将剪辑t时刻的帧取data[int(fps*t)]中的数据进行处理。
三、UpdatedVideoClip
UpdatedVideoClip是VideoClip的直接子类。
构造方法语法如下:
__init__(self, world, ismask=False, duration=None)
说明:
- UpdatedVideoClip的构造方法是个闭包,其内定义了用于构造帧的嵌套函数make_frame
- 参数world是一个有特殊要求的对象,该对象必须有一个属性clip_t、两个方法update和to_frame:
- world.clip_t :与world状态对应的剪辑时间
- world.update()方法:更新world的状态(包括增加clip_t一个时间步)的方法
- world.to_frame()方法:根据world的状态生成一个帧的方法
- ismask:如果生成的剪辑是值为0-1 WxH遮罩则为True
- duration:剪辑的时长,单位是秒
对应剪辑生成t时刻的帧时,如果world的clip_t 小于t,则会循环执行world.update方法,直到clip_t 大于等于t,此时再调用world.to_frame()输出帧。
UpdatedVideoClip的帧数据依赖于world对象状态变更,该类在科学研究中有特殊用途,对于那些在生成帧数据前需要使用算法执行一些步骤进行处理时特别有用。
四、ImageClip
4.1、概述
ImageClip是VideoClip的直接子类,用于生成固定不变的视频剪辑。ImageClip是从一个图像文件或内存中图像数组数据生成的视频剪辑,对应视频任何时候都是显示该图像。
4.2、构造方法
4.2.1、调用语法:
__init__(self, img, ismask=False, transparent=True,fromalpha=False, duration=None)
4.2.2、参数说明:
- img:任何图像文件或代表一个RGB图像的数组(例如一个视频剪辑的帧数据)
- ismask:剪辑是否为遮罩,如果要构建遮罩剪辑需要设置为True
- transparent:如果希望图片的alpha层(如果存在)用作构建剪辑的遮罩,此参数应设置为True,此时图像的背景层作为视频剪辑,图片的alpha层作为剪辑的遮罩剪辑
- fromalpha:如果只是将图片的alpha层构建剪辑,则fromalpha应设置为True
4.2.3、案例
针对ImageClip的构造方法,如果使用不带alpha通道的图片转为剪辑,则如果ismask为True,则彩色图像会变成灰色剪辑,否则会保持彩色图像,transparen和fromalpha这两个参数不起作用。下面截图中显示了原图像、标准剪辑、遮罩剪辑的对比:
带alpha通道的图像制作的剪辑情况比较复杂,处理结果无法完全解释,在此不进行展开介绍。
4.3、fl方法、fl_image方法和fl_time方法
- fl方法:与父类的VideoClip.fl方法是等效的,但返回值不再是ImageClip对象,而是VideoClip对象
- fl_image方法:和父类 VideoClip.fl_image方法功能相同,但ImageClip中由于每个帧相同,因此仅在最开始进行一次变换
- fl_time方法:ImageClip的fl_time方法对ImageClip不进行任何处理,因为ImageClip任何时刻都是固定图像,但该方法可能会影响剪辑的遮罩或音频。返回值是一个ImageClip对象
五、ColorClip
ColorClip是仅显示同一种颜色的剪辑。
5.1、构造方法
调用语法:
__init__(self, size, color=None, ismask=False, duration=None, col=None)
参数说明:
- size:剪辑的大小,一个宽和高组成的元组
- color:如果ismask为False,则为一个RGB的三元组(缺省为黑色全0),如果ismask为True,则color代表灰度值,为一个0到1之间的浮点数
- ismask:是否将剪辑作为遮罩
- duration:剪辑时长
- col:已经废弃参数,被color所代替
六、TextClip
TextClip用于生成文本剪辑,对应剪辑内容来自于指定文本或文本文件,TextClip是ImageClip的直接子类。在具体处理时,TextClip先调用ImageMagick将文本转换成一个png图片,再调用ImageClip的构造方法将该图片构造成剪辑,因此使用TextClip前需要先下载并安装ImageMagick应用(不是Python模块)。安装ImageMagick后,还需要修改moviepy的config_defaults.py模块的配置,将下行代码:
IMAGEMAGICK_BINARY = os.getenv('IMAGEMAGICK_BINARY', 'auto-detect')
替换为:
IMAGEMAGICK_BINARY = r"C:\Program Files\ImageMagick-7.0.8-Q16\magick.exe"
具体的替换值需要确认ImageMagick安装目录进行更改。
说明:
ImageMagick是一套功能强大、稳定而且开源的多平台工具集和开发包,可以用来读、写和处理超过200种基本格式的图片文件,包括PNG,JPEG,GIF,HEIC,TIFF,DPX,EXR,WebP,Postscript,PDF和SVG等格式。利用ImageMagick,可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,既可以通过命令行进行,也可以通过C/C++、Perl、Java、PHP、Python或Ruby编程来完成。ImageMagic的主要精力集中在性能,减少bug以及提供稳定的API和ABI上。
ImageMagick的功能通常通过命令行使用,也可以通过编程来使用。moviepy使用的方式就是通过命令行方式调用的。因此在使用TextClip前,必须安装独立的ImageMagick应用,该应用对应官方下载地址为:
http://www.imagemagick.org/script/index.php,该网站从国内访问非常慢,老猿好不容易才弄到该工具包的windows 64位16通道图像处理的版本放在CSDN的资源服务器上,如果大家需要使用该版本可以从CSDN的资源服务器对应链接下载,下载地址为:https://download.csdn.net/download/LaoYuanPython/12539159,不过需要5个CSDN积分,但下载快,下载后解压直接点击执行文件运行即可。
6.1、构造方法
TextClip的构造方法语法如下:
__init__(self, txt=None, filename=None, size=None, color='black',
bg_color='transparent', fontsize=None, font='Courier',
stroke_color=None, stroke_width=1, method='label',
kerning=None, align='center', interline=None,
tempfilename=None, temptxt=None,
transparent=True, remove_temp=True,
print_cmd=False)
构造方法参数说明:
- txt:需要在剪辑中显示的文字,这个参数和参数filename可以相互替换,二者同时存在时txt优先
- filename:存储需要在剪辑中显示文字的文件名
- size:剪辑的大小,如果method参数为’label’可以设置为None,由moviepy自动根据文字设定,但如果method参数为’caption’,则必须设置,此时高度也可以设置为None,由moviepy根据文字数量、大小以及宽度自动设置
- color:文字显示的前景色,请参考下面介绍list方法时的说明
- bg_color:剪辑的背景色
- fontsize:文字字体大小
- font:字体设置,字体和运行机器相关,在机器上能使用的字体请参考下面介绍list方法时的说明
- stroke_color:文字轮廓线的颜色,如果为None则没有轮廓线
- stroke_width:轮廓线的宽度,可以为浮点数
- method:可以设置为’label’或’caption’,设置为’label’时,图片将自动调整大小以适合剪辑的大小,这是该参数的缺省值。设置为’caption’时,文字将在size参数指定范围内显示,此时文字会自动换行,但自动换行功能由于使用的ImageMagick库的问题有时不能正确工作
- kerning:更改字母之间的默认间距。例如
kerning=-1
与默认间距相比,将使字母之间的间距更接近1个像素 - align:文字的对齐方式,仅在method设置为caption时生效,确实值为center,可选择的值包括:center 、 East 、 West 、 South 、 North
- transparent:如果要考虑图像的透明度需要设置为True,这也是缺省值
- remove_temp:是否删除临时文件
6.2、list方法
list方法用于返回TextClip构造方法中font和color参数在执行机器上可以使用的相关取值列表。
调用语法为:
list(arg)
其中参数arg只有两个取值‘font’和‘color’,注意该方法是一个静态方法,直接带类名就可以调用。
注意:
由于moviepy对多语言环境支持存在一些问题,因此在执行TextClip.list(‘font’)会报错,报错信息为:
File "C:\Program Files\Python37\lib\site-packages\moviepy\video\VideoClip.py", line 1177, in list
return [l.decode('UTF-8')[8:] for l in lines if l.startswith(b" Font:")]
File "C:\Program Files\Python37\lib\site-packages\moviepy\video\VideoClip.py", line 1177, in <listcomp>
return [l.decode('UTF-8')[8:] for l in lines if l.startswith(b" Font:")]
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb7 in position 8: invalid start byte
在这种情况下,要支持中文环境,需要修改VideoClip的1177行,具体修改内容如下:
if arg == 'font':
#return [l.decode('UTF-8')[8:] for l in lines if l.startswith(b" Font:")]
return [l.decode('ANSI')[8:] for l in lines if l.startswith(b" Font:")]
6.3、search方法
search方法也是一个静态方法,直接带类名就可以调用,该方法是作为list方法的一个补充使用,因为list ‘font’和‘color’后,这两个类型一般取值都很多,因此输出会很多内容,不方便查看,而search除了指定参数名外,还可以对参数可取值进行过滤。实际上search实现时,也是先执行list方法,将list方法的结果再进行一次过滤再输出。
调用语法:
search(string, arg)
其中参数arg与list中的arg一样,而string是过滤条件的字符串,该字符串不区分大小写,最终结果只显示参数可取值中包含了string字符串内容的可取值。
七、小结
本节详细介绍了VideoClip文件中包含的VideoClip的所有子类,这些子类可以在特定场景下使用,需要注意的是TextClip是基于安装了ImageMagick才能使用。
更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。
关于收费专栏
老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。
收费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》,本文收费专栏对应文章为《moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip及使用案例》。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。
跟老猿学Python、学5G!
☞ ░ 前往老猿Python博文目录 ░
moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip类详解的更多相关文章
- moviepy音视频剪辑:视频基类VideoClip子类VideoFileClip、CompositeVideoClip、ImageSequenceClip介绍
☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑相关类及关系>介绍了VideoClip主要有六个直接子类(VideoFileClip ...
- Bullet核心类介绍(Bullet 2.82 HelloWorld程序及其详解,附程序代码)
实验平台:win7,VS2010 先上结果截图: 文章最后附有生成该图的程序. 1. 刚体模拟原理 Bullet作为一个物理引擎,其任务就是刚体模拟(还有可变形体模拟).刚体模拟,就是要计算预测物体的 ...
- Java基础学习(五)-- Java中常用的工具类、枚举、Java中的单例模式之详解
Java中的常用类 1.Math : 位于java.lang包中 (1)Math.PI:返回一个最接近圆周率的 (2)Math.abs(-10):返回一个数的绝对值 (3)Math.cbrt(27): ...
- 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解
前面一节介绍了构造方法定义的语法,并进行了语法解释说明,本节将通过案例来说明构造方法参数传递及返回值的情况. 一. 案例说明 本节定义一个汽车类,它有四个实例变量:wheelcount, pow ...
- PyQt+moviepy音视频剪辑实战文章目录
☞ ░ 前往老猿Python博文目录 ░ 本专栏为moviepy音视频剪辑合成相关内容介绍的免费专栏,对应的收费专栏为<moviepy音视频开发专栏>. 一.moviepy基础能力系统介绍 ...
- Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载
☞ ░ 前往老猿Python博文目录 ░ 一.简介 MoviePy是一个用于视频编辑的Python模块,可用于进行视频的基本操作(如剪切.拼接.标题插入).视频合成(也称非线性编辑).视频处理或创建高 ...
- moviepy音视频开发:使用credits1给视频加片头片尾字幕
☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip.UpdatedVideoClip.ImageClip. ...
- moviepy音视频开发专栏文章目录
☞ ░ 前往老猿Python博文目录 ░ <moviepy音视频开发专栏>为收费专栏,基于老猿阅读moviepy1.03版本的源代码以及大量测试验证的基础上,详细介绍moviepy主要音视 ...
- javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
随机推荐
- Group指定的方式如下: @Test(groups = {"fast", "unit", "database" })
Group指定的方式如下: @Test(groups = {"fast", "unit", "database" }) public voi ...
- Centos7系统kvm虚机忘记密码进不去, 通过宿主机修改/etc/shadow文件改密码,重启后系统起不来故障排错
问题描述 某天, 因为其他项目组交接问题, kvm里面的堡垒机系统用户root密码登录不上,然后他通过宿主机修改/etc/shadow文件修改密码,但是修改完后重启系统后发现kvm宿主机连接不上虚机了 ...
- leetcode105: jump-game-ii
题目描述 给出一个非负整数数组,你最初在数组第一个元素的位置 数组中的元素代表你在这个位置可以跳跃的最大长度 你的目标是用最少的跳跃次数来到达数组的最后一个元素的位置 例如 给出数组 A =[2,3, ...
- leetcode138container-with-water
题目描述 给定n个非负整数a1,a2,-,an,其中每个数字表示坐标(i, ai)处的一个点.以(i,ai)和(i,0)(i=1,2,3...n)为端点画出n条直线.你可以从中选择两条线与x轴一起构成 ...
- Python中列表逆序
1.list.reverse() 该方法是直接在原来的列表里面将元素进行逆序排列,不需要创建新的副本用于存储结果. 这种方式,有好处也有坏处.好处是节省内存使用,因为我们不需要重新申请空间来保存最后的 ...
- python_面向对象_组合
组合: 一个类的对象是另外一个类对象的属性 # 组合 # 一个类的对象是另一个类对象的属性 # 什么时候使用组合:当两个类之间的关系是 :什么有什么的关系 : 班级有学生 学生有班级 班级有课程 图书 ...
- MyBatis 中 @Param 注解的四种使用场景
https://juejin.im/post/6844903894997270536 第一种:方法有多个参数,需要 @Param 注解 第二种:方法参数要取别名,需要 @Param 注解 第三种:XM ...
- 连续子数组的和的绝对值的最大值、最小值(非绝对值的话直接dp动态规划)
前缀和的思路: sum[i] = num[0]+num[1]+......+num[i-1] sum[j] = num[0]+num[1]+......+num[j-1] 那么:num[i]+num[ ...
- 利用matlibplot绘制雷达图
之前在一些数据分析案例中看到用 Go 语言绘制的雷达图,非常的漂亮,就想着用matlibplot.pyplot也照着画一个,遗憾的是matlibplot.pyplot模块中没有直接绘制雷达图的函数,不 ...
- day05-类型转换和变量
1.类型转换概念 java是强类型语言,所以有些运算的时候,需要用到类型转换 类型转换原则:低-->高,byte,short,char-->int-->long-->float ...