python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python moviepy视频转GIF

Python使用moviepy库实现将视频转GIF文件

作者:py小王子

moviepy 是一个用于视频编辑的 Python 库,这篇文章主要为大家详细介绍了Python如何使用moviepy库实现将视频转GIF文件,有需要的小伙伴可以了解下

前言

moviepy 是一个用于视频编辑的 Python 库,它提供了许多强大的功能,如视频剪辑、拼接、标题添加、视频效果应用、音频处理等。此外,moviepy 还可以将视频转换为 GIF 文件,这是许多用户喜欢使用它的一个原因。

pip install moviepy

或者

完整代码 

import os
# 从moviepy.editor模块中导入了VideoFileClip类,该类用于加载和处理视频文件。
from moviepy.editor import VideoFileClip
# 加载视频
# 使用VideoFileClip类的构造函数加载名为movie.mp4的视频文件,并将其存储在videoClip变量中。
is_video = input("请输入您的视频路径:")
videoClip = VideoFileClip(f"{is_video}")
# 判断并打印视频的原始时长
print(f"您的视频总时长为: {videoClip.duration} S")
# 调整帧率和大小,并设置时间范围
# 调用subclip方法,从原始视频中裁剪出从第second1秒到第second2秒的部分。裁剪后的视频将替换原来的videoClip对象。
second1 = input("开始截取时间:")
second2 = input("结束截取时间:")
videoClip = videoClip.subclip(second1, second2)  # 仅转换视频second1-second2的内容
gif_name = input("请输入您的GIF名字(或输入带后缀的名字如moviepy.gif):")
if not gif_name.lower().endswith('.gif'):
    # 检查后缀
    # 如果用户没有输入.gif,则添加.gif
    img_name = gif_name + ".gif"
# 允许用户输入保存目录和文件名
save_dir = input("请输入您想要保存GIF的目录(例如:C:/Users/YourName/Pictures/):")
# 确保目录末尾有斜杠(如果不是根目录的话)
# 使用os.sep来获取当前操作系统的路径分隔符,以确保路径在不同操作系统上都是正确的
# 首先检查 save_dir 是否不以 os.sep 结尾,并且确保它不是一个空字符串。
# 如果这两个条件都满足,那么它就在 save_dir 的末尾添加一个路径分隔符。
if not save_dir.endswith(os.sep) and save_dir != "":
    save_dir += os.sep
# 检查目录是否存在,不存在则创建(exist_ok=True参数允许目录已经存在而不引发错误)
os.makedirs(save_dir, exist_ok=True)
# 设置GIF的保存路径,构建完整的文件路径
output_path = os.path.join(save_dir, gif_name)
# 使用resize方法将视频的尺寸调整为原来的一半。这里的0.5表示宽度和高度都变为原来的50%。
videoClip = videoClip.resize(0.5)
videoClip.write_gif(output_path, fps=5)  # 将帧率设置为 5 FPS

输出: 

知识扩展

使用 Python 将视频转换为 GIF 文件,最常用的库是 moviepy 或 PIL 配合 imageio。这里提供两种主流方法:使用 moviepy(最简单)和使用 imageio(更轻量)。同时给出优化 GIF 文件大小的常用技巧。

方法一:使用 moviepy(推荐,功能丰富)

from moviepy.editor import VideoFileClip
# 加载视频文件
clip = VideoFileClip("input.mp4")
# 1. 截取片段(例如从10秒到20秒)
clip = clip.subclip(10, 20)
# 2. 调整大小(可选,减小文件体积)
clip = clip.resize(width=320)  # 按宽度缩放,高度自动
# 3. 输出为 GIF
clip.write_gif("output.gif", fps=10)  # fps 控制帧率,越低文件越小

参数说明

完整优化示例

clip = VideoFileClip("input.mp4").subclip(5, 10)
clip = clip.resize(height=360)  # 限制高度
clip.write_gif("output.gif", fps=8, program='ffmpeg', opt='optimize')

方法二:使用 imageio + PIL(轻量级,纯 Python)

import imageio
from PIL import Image
import numpy as np
# 读取视频
reader = imageio.get_reader("input.mp4")
fps = reader.get_meta_data()['fps']
# 准备存储帧列表
frames = []
# 取前 5 秒,每隔 2 帧取一帧(降低帧率)
for i, frame in enumerate(reader):
    if i > fps * 5:           # 只取前5秒
        break
    if i % 2 == 0:            # 降采样,每隔一帧取一帧
        # 可选:缩小画面(PIL)
        img = Image.fromarray(frame)
        img = img.resize((img.width//2, img.height//2), Image.LANCZOS)
        frames.append(np.array(img))
# 保存为 GIF
imageio.mimsave("output.gif", frames, fps=fps//2)

这种方法适合不想引入额外依赖(moviepy 依赖 FFmpeg)的场景。

优化 GIF 文件大小的小技巧

方法说明
缩短时长只转换最精彩的几秒,如 subclip(0, 5)
降低帧率从 30fps 降到 10-15 fps,体积明显减小
缩小分辨率resize(width=480) 或 height=360
减少颜色数moviepy 支持 colors=64,但默认已优化
裁剪画面使用 clip.crop(x1,y1,x2,y2) 去除无关区域

安装依赖

# 方法一需要
pip install moviepy
# 方法二需要
pip install imageio pillow

如果 moviepy 转换时报错 OSError: MoviePy Error: FFMPEG not found,需要安装 FFmpeg:

完整脚本:批量转换视频为 GIF

import os
from moviepy.editor import VideoFileClip
def video_to_gif(input_path, output_path, start=0, duration=5, width=480, fps=10):
    clip = VideoFileClip(input_path).subclip(start, start+duration)
    clip = clip.resize(width=width)
    clip.write_gif(output_path, fps=fps)
    clip.close()
# 批量处理文件夹下所有 mp4
input_dir = "videos"
output_dir = "gifs"
os.makedirs(output_dir, exist_ok=True)
for file in os.listdir(input_dir):
    if file.endswith(".mp4"):
        in_path = os.path.join(input_dir, file)
        out_path = os.path.join(output_dir, file.replace(".mp4", ".gif"))
        video_to_gif(in_path, out_path, start=0, duration=5)
        print(f"已生成: {out_path}")

总结

对于大多数需求,建议直接用 moviepy,代码简洁且功能完善。如果 GIF 文件依然过大,可以进一步降低 fps 到 8 或使用 program='ffmpeg' 参数(默认已启用)。

以上就是Python使用moviepy库实现将视频转GIF文件的详细内容,更多关于Python moviepy视频转GIF的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文