商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Python使用moviepy库实现将视频转GIF文件

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

  发布于2026-06-30 阅读(0)

扫一扫,手机访问

前言

moviepy 在视频处理圈里算得上是一把趁手的瑞士军刀——剪辑、拼接、加特效、调音频,样样能来。不过,很多人最早接触它其实是为了一个很“轻”的需求:把视频片段转成GIF动图。这个功能看起来简单,真要做得顺手、文件还不大,里面其实有不少门道。

安装就更简单了:

pip install moviepy

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

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

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

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

完整代码

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"
# 允许用户输入保存目录和文件名
sa ve_dir = input("请输入您想要保存GIF的目录(例如:C:/Users/YourName/Pictures/):")
# 确保目录末尾有斜杠(如果不是根目录的话)
# 使用os.sep来获取当前操作系统的路径分隔符,以确保路径在不同操作系统上都是正确的
# 首先检查 sa ve_dir 是否不以 os.sep 结尾,并且确保它不是一个空字符串。
# 如果这两个条件都满足,那么它就在 sa ve_dir 的末尾添加一个路径分隔符。
if not sa ve_dir.endswith(os.sep) and sa ve_dir != "":
    sa ve_dir += os.sep
# 检查目录是否存在,不存在则创建(exist_ok=True参数允许目录已经存在而不引发错误)
os.makedirs(sa ve_dir, exist_ok=True)
# 设置GIF的保存路径,构建完整的文件路径
output_path = os.path.join(sa ve_dir, gif_name)
# 使用resize方法将视频的尺寸调整为原来的一半。这里的0.5表示宽度和高度都变为原来的50%。
videoClip = videoClip.resize(0.5)
videoClip.write_gif(output_path, fps=5)  # 将帧率设置为 5 FPS

输出:

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

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

知识扩展

用Python把视频转成GIF,其实主流路线就两条:一条是用moviepy(功能全面,但依赖FFmpeg),另一条是用imageio加PIL(更轻量,纯Python搞定)。下面把两种方法都拆开聊聊,顺便附上几个压缩文件体感的实用技巧。

方法一:使用 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 控制帧率,越低文件越小

参数说明

  • fps:帧率,原视频一般 24-30 fps,转 GIF 建议 10-15,可大幅减小文件大小。
  • resize:缩小尺寸,例如 width=480
  • subclip(start, end):截取片段,单位秒。
  • program:可指定 ffmpeg(默认)或 ImageMagick(支持更多颜色优化)。

完整优化示例

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.mimsa ve("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:

  • Windows:下载 ffmpeg 并添加到 PATH
  • Linux:sudo apt install ffmpeg
  • Mac:brew install 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 一行 write_gif 搞定。
  • 精细控制:使用 imageio 自己控制帧率和缩放。
  • 体积优化:务必降低 fps 和分辨率。

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

本文转载于:https://www.jb51.net/python/364904kpq.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注