☞ ░ 前往老猿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 FilesImageMagick-7.0.8-Q16magick.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 FilesPython37libsite-packagesmoviepyvideoVideoClip.py", line 1177, in list
return [l.decode('UTF-8')[8:] for l in lines if l.startswith(b" Font:")]
File "C:Program FilesPython37libsite-packagesmoviepyvideoVideoClip.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。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。