☞ ░ 前往老猿Python博文目录 ░
一、引言
在《moviepy音视频剪辑:moviepy中的剪辑相关类及关系》介绍了VideoClip主要有六个直接子类(VideoFileClip、 ImageSequenceClip、CompositeVideoClip、ImageClip、DataVideoClip、UpdatedVideoClip)和两个间接子类(ColorClip, TextClip)。在《moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip类详解》介绍了DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip类,这是因为这几个子类都与VideoClip类在同一模块文件VideoClip.py中。本文将介绍VideofileClip、 ImageSequenceClip、CompositeVideoClip这三个子类。
二、VideoFileClip视频文件剪辑
2.1、概述
VideoFileClip类是VideoClip的直接子类,是从一个视频文件创建一个剪辑类,除了从父类继承的特性和方法外,VideoFileClip实现了自己的构造方法和close方法,另外VideoFileClip有1个自己独的属性filename。VideoFileClip加载视频文件时,可以调整剪辑对应分辨率大小,可以根据应用要求设定是否加载音频。VideoFileClip加载视频文件时,会调用FFMPEG_VideoReader来加载视频文件,加载时会对视频文件进行加锁处理。
2.2、filename属性
filename属性用于存储读取视频文件的文件名,该文件名与读取视频文件给的名字完全一致,无需进行本地化路径转换。
2.3、构造方法
调用语法:
__init__(self, filename, has_mask=False,
audio=True, audio_buffersize=200000,
target_resolution=None, resize_algorithm='bicubic',
audio_fps=44100, audio_nbytes=2, verbose=False,
fps_source='tbr')
参数说明:
- filename:视频文件名,可以带路径
- has_mask:是否有遮罩 ,如果视频文件带遮罩,则设置has_mask为True。视频文件一般很少带遮罩,但有些视频编码支持遮罩功能。例如如果moviepy合成了一个带遮罩的剪辑,则可以使用《moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解》介绍的VideoClip.write_videofile将剪辑和遮罩、音频信息一起保存到视频文件中
- audio:如果视频文件不带音频或者不希望加载视频文件的音频,可以将audio参数设置为False
- audio_buffersize:音频文件读取缓冲区大小,字节为单位,一般用缺省值足够,如果audio_buffersize比一个音频帧的大小还要小,会自动使用音频帧的大小代替
- target_resolution:设置为加载后需要变换到的分辨率,类型为列表或元组,第一个元素为分辨率的高,第二个为宽,如果高或宽有一个为None,则保持现有纵横比调整帧的大小。如果保持原分辨率不变,则不需要设置本参数或设置为None。如果设置了新的分辨率,则在调用ffmpeg 返回视频剪辑的帧之前会按新的分辨率调整帧的大小。这比使用转换为高分辨率流然后再调整分辨率会快很多
- resize_algorithm:要改变加载后的视频分辨率,可以通过resize_algorithm指定调整分辨率的算法,缺省值为 “bicubic”,还可以是 “bilinear” 、"fast_bilinear"等。关于算法的更多信息请参考:https://ffmpeg.org/ffmpeg-scaler.html
- audio_fps:声音的采样频率
- audio_nbytes:声音采样的位数
- verbose:是否在标准输出设备上显示处理信息
- fps_source:从视频的元数据metadata哪个数据中获取fps值,默认设置为’tbr’,但可以设置为’fps’,这可能有助于导入慢动作视频,否则可能会出意外。
2.2、close方法
构造方法会对视频文件进行加锁,并占用相关资源,如果要释放文件和资源,需要调用close方法或等加载处理的进程结束。close方法除了self无其他参数,其目的就是释放文件和其他占用的资源。
需要注意,如果一个VideoFileClip实例被浅拷贝到另一个对象,这两个对象中任意一个调用close方法都可能会释放文件导致另一个实例的close方法失败。具体情况与代码的上下文环境相关。
三、CompositeVideoClip合成视频剪辑
3.1、概述
CompositeVideoClip是一种由其他视频剪辑组合构成一起播放的视频剪辑,这是大多数合成剪辑的基类。《moviepy音视频剪辑:使用concatenate_videoclips和clips_array将多个视频合成一个顺序播放或同屏播放的视频》介绍的concatenate_videoclips在method参数设置为’compose’时,实际上就是调用的CompositeVideoClip完成合成的。
3.2、构造方法
调用语法:
__init__(self, clips, size=None, bg_color=None, use_bgclip=False,ismask=False)
参数说明:
- clips:多个视频剪辑的列表,列表中的每个元素都是VideoClip类型的对象。列表中的每个剪辑都将显示在列表中其后面出现的剪辑的下面。每个剪辑的pos属性决定剪辑放置在最终合成剪辑屏幕的位置,每个剪辑的mask遮罩属性决定每个剪辑哪部分可见哪部分不可见
- size:最终剪辑的大小(分辨率),如果size为None,则将clips中第一个剪辑的size作为最终剪辑的size
- bg_color:设置合成剪辑的背景色,背景色用于剪辑未填充且无遮罩的区域,如果要一个透明剪辑,则设置为None,否则为一个代表RGB颜色的三元组,如(0,0,0)代表黑色,也即透明色。该参数只有use_bgclip为False的情况下使用,实际上是通过构建一个由bg_color指定颜色的ColorClip来实现的
- use_bgclip:如果列表中的第一个剪辑应用作所有其他剪辑的“背景”,则设置为True。第一个剪辑的大小必须与最后合成剪辑的大小相同。如果没有透明度,则最终剪辑将没有遮罩
- ismask:最终合成剪辑是否为遮罩剪辑。
3.2、clips属性
clips属性保存合成剪辑所需要的所有剪辑的列表,但不包含背景剪辑,即如果use_bgclip为True,则clips保存的为构造方法clips参数对应列表第二个及之后的所有剪辑,如果use_bgclip为False,则就是构造方法clips参数对应的列表。
3.3、playing_clips方法
playing_clips方法用于判断clips属性中对应剪辑在参数指定的t时刻是否处于播放状态,对处于播放状态的剪辑存放到一个列表中返回。
调用语法:playing_clips(self, t=0)
3.4、close方法
用于关闭音频及由CompositeVideoClip创建的背景剪辑,其他资源的释放不处理。
四、ImageSequenceClip图像序列剪辑
4.1、引言
在《moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解》介绍了write_images_sequence方法,write_images_sequence方法用于将剪辑输出到一系列图像文件中,而ImageSequenceClip则基本上与write_images_sequence过程可逆,用于将一系列图像生成剪辑。
ImageSequenceClip是VideoClip的直接子类,该类自身只有构造方法,其他方法和属性都是继承自父类。
4.2、构造方法
调用语法:
__init__(self, sequence, fps=None, durations=None, with_mask=True,
ismask=False, load_images=False)
参数说明:
- sequence:参数sequence可以是如下三种之一
- 一个仅包含图片的文件夹路径目录名,目录下的文件将按字母顺序排列作为处理的系列图像文件
- 一个图像文件名的列表,在这种情况下开发者可以通过load_images参数控制选择将文件图像一次性加载到内存中
- 一个表示图像的numpy数组列表,注意这种情况不支持遮罩
- fps:每秒读入的图像帧数,该参数可以通过设定durations来替代
- durations:每个图像在剪辑中显示的时长列表,因此可以给每个图像不同的播放时间,如果设置了fps,该参数将不起作用
- with_mask:是否将PNG图像的alpha层作为遮罩
- ismask:是否将生成剪辑作为遮罩
- load_images:是否在处理前集中将图像文件加载到内存,如果为True,则对于sequence对应图像文件的情况,一次性的将所有图像文件先加载到内存,否则每处理一个文件加载一个。该参数仅对sequence为文件名列表的情况生效。
更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。
关于收费专栏
老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。
收费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》,本文收费专栏对应文章为《moviepy音视频剪辑:视频基类VideoClip子类VideoFileClip、CompositeVideoClip、ImageSequenceClip介绍及使用案例》。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。