python读取视频并转换成gif图片
1. 安装三方库 moviepy
将视频转换成gif,需要使用 moviepy库
确保已经安装了moviepy库
pip install moviepy
2. 代码实现:
from moviepy.editor import VideoFileClip
myclip = VideoFileClip("video.mp4")
myclip2 = myclip.subclip(0, 10).resize(width=300)
# save gif
myclip2.write_gif("video.gif")
出现的问题1:
直接运行发现报错
提示module 'PIL.Image' has no attribute 'ANTIALIAS'
原因是因为 我安装的PIL版本是 10.4.0,而 ANTIALIAS
方法已经在新的版本中移除了,替换成了Image.LANCZOS
和
Image.Resampling.LANCZOS
所以我们可以把pillow降级或修改源代码
解决办法:
- 方法 1:降级 Pillow 版本
你可以将Pillow
降级到9.4.0
或更早的版本,这些版本中ANTIALIAS
属性依然存在:
pip uninstall -y Pillow
pip install Pillow==9.4.0
- 方法 2:修改 moviepy 源代码
如果不想降级Pillow
,你也可以修改moviepy
的源码,替换ANTIALIAS
为LANCZOS
。具体步骤如下:
-
找到
moviepy
的安装目录,可以通过以下命令查看路径:import moviepy print(moviepy.__file__)
-
通过上述报错可以发现 方法调用是在
moviepy
源码中的moviepy/video/fx/resize.py
文件中,找到ANTIALIAS
并替换为LANCZOS
。
替换完成之后就可以生成gif格式的动图了
问题二:
生成gif 后发现大小比原视频还大。所以要接着减少大小
解决方法:
1. 降低分辨率
降低 GIF 的分辨率可以显著减少文件大小。在 resize
中指定更小的宽度(或高度):
myclip2 = myclip.subclip(0, 10).resize(width=150) # 适当减小宽度
2. 降低帧率
GIF 不需要太高的帧率,通常 10-15 fps 就足够了。使用 moviepy
的 set_fps
函数来降低帧率:
myclip2 = myclip.subclip(0, 10).resize(width=150).set_fps(10)
3. 减少颜色数量
GIF 支持的颜色最多是 256 色,减少颜色数量可以减小文件大小。可以使用 moviepy
的 write_gif
函数的 colors
参数:
myclip2.write_gif("output.gif", fps=10, colors=128) # 降低颜色数量
4. 减少播放时间
如果可以,将 GIF 的时长尽量缩短,例如:
myclip2 = myclip.subclip(0, 5) # 只截取前5秒
通过以上方法,可以有效减少生成gif的大小。
总结:通过moviepy可以生成gif图片,通过resize方法可以有效减少生成文件的大小