在《moviepy音视频剪辑:moviepy中的剪辑相关类及关系》介绍了剪辑相关类及关系,其中VideoClip有多个直接子类和间接子类。
本文中将介绍的DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip都是VideoClip的子类,其中DataVideoClip、UpdatedVideoClip在前面文中未进行介绍,之所以将这几个类在此一并介绍,是因为这几个类都在VideoClip类相同的模块文件VideoClip.py中。
DataVideoClip是VideoClip的直接子类,它的视频剪辑的连续帧都是从一系列数据集经过函数处理生成的,DataVideoClip类只有构造方法,没有独有属性和其他方法,因此DataVideoClip其实就是通过数据集经函数处理构造的视频剪辑。
__init__(self, data, data_to_frame, fps, ismask=False, has_constant_size=True)
实际上处理时,是将剪辑t时刻的帧取data[int(fps*t)]中的数据进行处理。
UpdatedVideoClip是VideoClip的直接子类。
__init__(self, world, ismask=False, duration=None)
对应剪辑生成t时刻的帧时,如果world的clip_t 小于t,则会循环执行world.update方法,直到clip_t 大于等于t,此时再调用world.to_frame()输出帧。
UpdatedVideoClip的帧数据依赖于world对象状态变更,该类在科学研究中有特殊用途,对于那些在生成帧数据前需要使用算法执行一些步骤进行处理时特别有用。
ImageClip是VideoClip的直接子类,用于生成固定不变的视频剪辑。ImageClip是从一个图像文件或内存中图像数组数据生成的视频剪辑,对应视频任何时候都是显示该图像。
__init__(self, img, ismask=False, transparent=True,fromalpha=False, duration=None)
针对ImageClip的构造方法,如果使用不带alpha通道的图片转为剪辑,则如果ismask为True,则彩色图像会变成灰色剪辑,否则会保持彩色图像,transparen和fromalpha这两个参数不起作用。下面截图中显示了原图像、标准剪辑、遮罩剪辑的对比:
带alpha通道的图像制作的剪辑情况比较复杂,处理结果无法完全解释,在此不进行展开介绍。
ColorClip是仅显示同一种颜色的剪辑。
__init__(self, size, color=None, ismask=False, duration=None, col=None)
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积分,但下载快,下载后解压直接点击执行文件运行即可。
__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)
kerning=-1
与默认间距相比,将使字母之间的间距更接近1个像素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:")]
search方法也是一个静态方法,直接带类名就可以调用,该方法是作为list方法的一个补充使用,因为list ‘font’和‘color’后,这两个类型一般取值都很多,因此输出会很多内容,不方便查看,而search除了指定参数名外,还可以对参数可取值进行过滤。实际上search实现时,也是先执行list方法,将list方法的结果再进行一次过滤再输出。
search(string, arg)
其中参数arg与list中的arg一样,而string是过滤条件的字符串,该字符串不区分大小写,最终结果只显示参数可取值中包含了string字符串内容的可取值。
本节详细介绍了VideoClip文件中包含的VideoClip的所有子类,这些子类可以在特定场景下使用,需要注意的是TextClip是基于安装了ImageMagick才能使用。
更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《专栏:使用PyQt开发图形界面Python应用》。
老猿关于PyQt的付费专栏《使用PyQt开发图形界面Python应用》只需要9.9元,本专栏《PyQt+moviepy音视频剪辑实战》文档的同样内容在付费专栏上也有相应内容,总体来说付费专栏介绍更详细或案例更多。
本节内容对应付费专栏的《moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip及使用案例》。如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。