☞ ░ 前往老猿Python博文目录 ░
moviepy音视频剪辑模块的视频剪辑基类write_gif方法用于将视频剪辑输出到gif文件,调用语法如下:
def write_gif(self, filename, fps=None, program='imageio',
opt='nq', fuzz=1, verbose=True,
loop=0, dispose=False, colors=None, tempfiles=False,
logger='bar'):
部分参数作用在moviepy官方文档中没有说明,经查阅相关源代码和验证测试,确认相关参数功能功能如下。
参数说明如下:
- program:用于转换的软件,可以是“imageio”(这将通过imageio使用FreeImage库),或者是“ImageMagick”,或者是“ffmpeg”
- opt:应用优化的选项,如果program参数是’imageio’,opt必须是’wu’(Wu)或“nq”(Neuquant),。如果program=‘ImageMagick’,opt可以是“optimizeplus”或“OptimizeTransparency”
- fuzz:仅当program='ImageMagick’时需要,通过考虑小于fuzz%的颜色差异实际上是相同的来压缩GIF文件大小
- loop:表示GIF文件播放时循环播放多少次,如果为0就一直不停地播放,否则播放设定次数后就停止,该参数由GIF文件头控制
- dispose:表示播放动画时渲染当前帧时,如何处理前一帧,该参数由GIF文件头控制,moviepy没有说明该参数怎么使用,缺省值为False,老猿查阅了相关资料,才基本确认该参数的作用,但GIF中该控制参数有四个取值,不知道是否都支持,取值及含义如下:
- 为0表示绘制一个完整大小的、不透明的GIF帧来替换上一帧,就算连续的两帧只在局部上有细微的差异,每一帧依然是完整独立的绘制
- 为1表示未被当前帧覆盖的前一帧像素将继续显示,这种方式常用于对GIF动画进行优化,当前帧只需在上一帧的基础上做局部刷新,上一帧中没有被当前帧覆盖的像素区域将继续展示。这种方式既能节省内存,也能提高解码速度
- 为2 表示绘制当前帧之前,会先把前一帧的绘制区域恢复成背景色,这种方式常用于优化很多帧背景相同的情况,上一帧的背景色能通过当前帧的透明区域显示
- 为3表示绘制当前帧时,会先恢复到最近一个设置为False或1的帧,然后再将当前帧叠加到上面,这种方式性能比较差,已经被慢慢废弃
- colors:关于这个参数moviepy没有说明,老猿将该值设置为一个比较大的值,结果报错“ValueError: GIF quantize param must be 2…256”,最后查阅资料确认该参数表示色彩量化使用的调色板索引,取值为2到256。GIF最高支持8位256色,那么如果原图是真彩色的,则在生成最终效果图时,就涉及到真彩色到256的降色。真彩色是24位的,有2的24种颜色,每个像素用3个字节标识一个颜色,R、G、B各占一个字节,而256色每个像素只用一个字节从调色板中索引一种颜色,调色板最多有256种颜色。将2^24种颜色降为256种颜色,降色的过程被成为色彩量化。色彩量化过程分两步:1、根据图片定制调色板;2、遍历像素,对于每一个像素,从调色板中找最接近的颜色,记录该颜色索引。关于调色板请参考《调色板详解》
- tempfiles:将每个帧写入一个文件,而不是将它们传递到RAM中。在内存很少的计算机上很有用,只能与ImageMagick或ffmpeg一起使用。
更多关于VideoClip的属性和方法请参考《moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解》(免费文章)或《moviepy音视频剪辑:视频剪辑基类VideoClip详解》(付费专栏文章,但内容更全、案例更多)。
更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。
关于收费专栏
老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。