MoviePy 是一款 Python 视频编辑库,GitHub 14.8k Stars,MIT 协议开源。几行代码搞定剪辑、拼接、字幕、水印、动画、转 GIF 等操作,支持 mp4/webm/gif 等主流格式。Python 3.9+ 全平台运行,v2.0 全新发布,自动化视频编辑神器。

🎤 引言

做短视频想批量加个片头水印?课程录屏要分章节剪掉课堂闲聊?社媒运营要给 50 个产品图自动拼成展示视频?

这些重复且套路化的视频操作,用 PR/剪映手动做既慢又累。MoviePy 给出了一个完全不同的思路——用 Python 代码写视频剪辑。GitHub 上 14.8k Stars,MIT 协议,最近刚发布了 v2.0 大版本(破坏性更新),适合所有想批量处理视频的 Python 玩家。


⭐ 核心功能

✂️ 基础剪辑操作

MoviePy 把视频当作带函数 F(t) 的对象,每个时刻生成一帧:

  • 剪切.subclipped(start, end) 截取时间片段
  • 拼接CompositeVideoClip([clip1, clip2, ...]) 多轨合成
  • 尺寸调整.resized((width, height)) 任意分辨率
  • 变速.with_speed_scaled(2.0) 快慢放
  • 音量调节.with_volume_scaled(0.8) 调整音频
  • 提取音频clip.audio.to_audiofile() 把视频里的音频单独导出

🎬 文字 / 标题 / 水印

TextClip 是 MoviePy 的招牌功能之一:

from moviepy import TextClip

txt_clip = TextClip(
    font="Arial.ttf",
    text="Hello there!",
    font_size=70,
    color='white',
    stroke_color='black',
    stroke_width=2
).with_duration(10).with_position('center')

支持自定义字体、颜色、描边、透明度。在教学视频、产品介绍里加个水印片头,或者做电商商品视频的标题,几行代码就完事。

🎞️ 视频拼接与合成

最常用的场景之一 —— 把多个短片段拼成完整视频:

from moviepy import VideoFileClip, concatenate_videoclips

clips = [
    VideoFileClip("part1.mp4"),
    VideoFileClip("part2.mp4"),
    VideoFileClip("part3.mp4"),
]
final = concatenate_videoclips(clips)
final.write_videofile("output.mp4")

或者并排展示两个摄像头画面、上下叠加画中画,都靠 CompositeVideoClip

🎨 视觉效果与动画

MoviePy 的核心思路是把媒体转成 numpy 数组,所以每一帧的每个像素都可编程

from moviepy import VideoClip
import numpy as np

def make_frame(t):
    # 任意逻辑生成当前帧
    img = np.zeros((480, 640, 3), dtype=np.uint8)
    img[:, :, 0] = (t * 10) % 255  # 红色随时间变化
    return img

clip = VideoClip(make_frame, duration=5)
clip.write_videofile("animated.mp4", fps=24)

配合 matplotlib.figure 可以画动态数据可视化视频(柱状图、折线图随时间变化),配合 ImageClip 可以做图文混排短视频,自动生成社交媒体卡点视频。

🔊 音频处理

  • 提取音频为 mp3/wav
  • 拼接 / 叠加多个音频轨道
  • 音量淡入淡出
  • 替换原视频音轨

📐 内置效果库

几十个开箱即用的效果:

  • vfx.resizevfx.cropvfx.rotate
  • vfx.fadeinvfx.fadeout
  • vfx.mirror_xvfx.mirror_y
  • vfx.invert_colorsvfx.blackwhite

加上 vfx.colorxvfx.lum_contrast 等调色函数,日常剪辑 95% 的需求都能覆盖

📦 格式支持

读写全主流音频视频格式:

  • 视频:mp4、webm、ogv、avi、mov
  • 图片:png、jpg(用于序列帧合成)
  • 音频:mp3、wav、ogg
  • GIF:MoviePy 的高频用例,把视频片段一键转 GIF

📥 安装与使用

安装

pip install moviepy

MoviePy 内部依赖 ffmpeg,首次安装如果找不到 ffmpeg,会自动下载一个 static binary(如果用的是 ImageMagick 还会用它做 GIF/字幕)。

如果想用系统已安装的 ffmpeg:

# Debian/Ubuntu
sudo apt install ffmpeg

# macOS
brew install ffmpeg

# Windows
# 下载 ffmpeg.exe 放入 PATH

完整示例代码

这段官方 README 的示例展示了加载 → 截取 → 加字幕 → 输出的完整流程:

from moviepy import VideoFileClip, TextClip, CompositeVideoClip

# 1. 加载视频(example2.mp4),截取 00:00:10 到 00:00:20 的片段
# 2. 把音量调到 80%
clip = (
    VideoFileClip("long_examples/example2.mp4")
    .subclipped(10, 20)
    .with_volume_scaled(0.8)
)

# 3. 生成文字片段(白色 70 号字 Arial)
txt_clip = TextClip(
    font="Arial.ttf",
    text="Hello there!",
    font_size=70,
    color='white'
).with_duration(10).with_position('center')

# 4. 把文字叠加到视频上
final_video = CompositeVideoClip([clip, txt_clip])
final_video.write_videofile("result.mp4")

运行后输出 result.mp4,一个带中文字幕的 10 秒视频片段,全程不需要打开任何剪辑软件

数据可视化动画

一个真实案例 —— 把每周活跃用户增长数据生成动态条形图视频:

import numpy as np
from moviepy import VideoClip
import matplotlib.pyplot as plt
from moviepy.video.io.bindings import mplfig_to_npimage

weekly_users = [120, 150, 300, 450, 600, 850, 1100]

def make_frame(t):
    current_week = int(t)
    fig, ax = plt.subplots(figsize=(12, 6), facecolor='white')
    ax.bar(range(current_week + 1), weekly_users[:current_week + 1])
    ax.set_ylim(0, max(weekly_users) * 1.1)
    frame = mplfig_to_npimage(fig)
    plt.close(fig)
    return frame

animation = VideoClip(make_frame, duration=7).set_fps(30)
animation.write_videofile("user_growth.mp4")

跑完得到一个 7 秒的动画视频,条形图一根根长出来,汇报里直接用。

产品介绍短视频批量生成

电商典型场景 —— 50 个商品自动生成 10 秒介绍视频:

from moviepy import ImageClip, TextClip, CompositeVideoClip, ColorClip

def create_product_video(product, output):
    # 背景 + 产品图 + 标题 + 价格 + Logo
    bg = ColorClip(size=(1080, 1080), color=(255, 255, 255)).with_duration(10)
    
    img = (
        ImageClip(product['image_path'])
        .resized(height=800)
        .with_position('center')
        .with_duration(10)
    )
    
    title = (
        TextClip(text=product['title'], font_size=60, color='black')
        .with_position(('center', 100))
        .with_duration(10)
    )
    
    price = (
        TextClip(text=product['price'], font_size=80, color='red')
        .with_position(('center', 850))
        .with_duration(10)
    )
    
    final = CompositeVideoClip([bg, img, title, price])
    final.write_videofile(output)

for p in products:
    create_product_video(p, f"output/{p['id']}.mp4")

GitHub 地址:https://github.com/zulko/moviepy
在线文档:https://zulko.github.io/moviepy/


🔍 对比 / 替代方案

维度MoviePyFFmpeg (直接调用)OpenCVPyAV
学习曲线平缓(Pythonic)陡峭(CLI 复杂)中等较陡
编程抽象高级(Clip 对象)极低(命令行参数)帧级容器级
视觉特效✅ 内置 30+ 效果⚠️ 需要 ffmpeg filter 链⚠️ 需要手写
添加字幕TextClip 一行⚠️ 复杂 drawtext⚠️ cv2.putText⚠️ 复杂
性能(大批量)较慢(数据来回 IO 多)最快(原生 C)
适合场景自动化、剪辑、可视化转码、性能优化CV 算法容器操作

怎么选

  • 批量加字幕/水印/片头 → MoviePy
  • 单纯转码、压视频 → 直接 FFmpeg
  • 做目标检测、视频分析 → OpenCV
  • 精细控制解封装/解复用 → PyAV

MoviePy 的优势是让 Python 开发者用熟悉的方式做视频,性能不是它的强项。


⚠️ 注意事项

  1. v2.0 是破坏性更新:v1 时代的代码 from moviepy.editor import * 已经不能用,必须改成 from moviepy import VideoFileClip, ...。最新写法参考 官方更新指南
  2. v1 不再维护:很多老教程还在用 VideoFileClip.subclip() 这种 v1 API,复制粘贴时务必改写成 v2 的 subclipped()
  3. 性能瓶颈:MoviePy 比直接 FFmpeg 慢不少,因为每帧都过 Python 互转。10 分钟以上长视频 + 复杂操作会卡,需要设 threads 参数多线程输出,或者干脆用 FFmpeg 做底层编码、MoviePy 处理创意合成。
  4. 依赖 ffmpeg:MoviePy 不自带 ffmpeg 也没事,pip 安装时如果检测不到会尝试下载 static binary;但很多生产环境推荐自己装系统级 ffmpeg(更快更稳)。
  5. 中文路径问题:ffmpeg 对带中文 / 空格的路径有时报"Invalid argument",编码前把工作目录改成纯英文最稳。
  6. TextClip 的字体:默认字体是随便装的,指定字体时要传字体文件绝对路径,否则不同机器字体不同导致最终视频字体不一样。
  7. 大量短片时内存占用:N 个 VideoFileClip 同时驻留内存可能 OOM,用完就 .close() 释放

✅ 总结

MoviePy 是 Python 生态里最容易上手的视频剪辑库,把视频编辑器的能力用代码复刻。对开发者来说,「代码能解决的事,就不该用人肉点点点」这种信念在 MoviePy 上完美兑现。

适合人群

  • 经常需要批量处理视频的开发者(电商、教育、社媒运营)
  • 做数据可视化 + 视频结合的科研人员
  • 想把视频剪辑塞进 n8n、Airflow 之类工作流的人
  • 想要自动化生成 GIF 预览的爬虫工程师

优点

  • 极简 API,几行代码就能输出专业视频
  • MIT 协议、14.8k Stars 长期维护
  • 支持所有主流音视频 + GIF 格式
  • numpy 数组底层,任何 Python 图像库都能接入
  • 跨平台 Windows / Linux / macOS

缺点

  • 性能比直接 FFmpeg 慢(数据 IO 多)
  • v2.0 API 大量变动,老教程容易踩坑
  • 中文路径和字体需要小心
  • 长视频(10+ 分钟)批量处理需要调线程

总的来说,MoviePy 是一个"用了就回不去"的工具——一旦习惯用代码批量剪辑视频,手动剪映/PR 一天能干的事,MoviePy 一分钟跑完。如果你在工作的某一环被视频剪辑卡过效率,强烈推荐花半小时入门。


GitHub:https://github.com/zulko/moviepy
PyPI:https://pypi.org/project/moviepy/
文档:https://zulko.github.io/moviepy/