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.resize、vfx.crop、vfx.rotatevfx.fadein、vfx.fadeoutvfx.mirror_x、vfx.mirror_yvfx.invert_colors、vfx.blackwhite
加上 vfx.colorx、vfx.lum_contrast 等调色函数,日常剪辑 95% 的需求都能覆盖。
📦 格式支持
读写全主流音频视频格式:
- 视频:mp4、webm、ogv、avi、mov
- 图片:png、jpg(用于序列帧合成)
- 音频:mp3、wav、ogg
- GIF:MoviePy 的高频用例,把视频片段一键转 GIF
📥 安装与使用
安装
pip install moviepyMoviePy 内部依赖 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/
🔍 对比 / 替代方案
| 维度 | MoviePy | FFmpeg (直接调用) | OpenCV | PyAV |
|---|---|---|---|---|
| 学习曲线 | 平缓(Pythonic) | 陡峭(CLI 复杂) | 中等 | 较陡 |
| 编程抽象 | 高级(Clip 对象) | 极低(命令行参数) | 帧级 | 容器级 |
| 视觉特效 | ✅ 内置 30+ 效果 | ⚠️ 需要 ffmpeg filter 链 | ⚠️ 需要手写 | ❌ |
| 添加字幕 | ✅ TextClip 一行 | ⚠️ 复杂 drawtext | ⚠️ cv2.putText | ⚠️ 复杂 |
| 性能(大批量) | 较慢(数据来回 IO 多) | 最快(原生 C) | 快 | 快 |
| 适合场景 | 自动化、剪辑、可视化 | 转码、性能优化 | CV 算法 | 容器操作 |
怎么选:
- 批量加字幕/水印/片头 → MoviePy
- 单纯转码、压视频 → 直接 FFmpeg
- 做目标检测、视频分析 → OpenCV
- 精细控制解封装/解复用 → PyAV
MoviePy 的优势是让 Python 开发者用熟悉的方式做视频,性能不是它的强项。
⚠️ 注意事项
- v2.0 是破坏性更新:v1 时代的代码
from moviepy.editor import *已经不能用,必须改成from moviepy import VideoFileClip, ...。最新写法参考 官方更新指南。 - v1 不再维护:很多老教程还在用
VideoFileClip.subclip()这种 v1 API,复制粘贴时务必改写成 v2 的subclipped()。 - 性能瓶颈:MoviePy 比直接 FFmpeg 慢不少,因为每帧都过 Python 互转。10 分钟以上长视频 + 复杂操作会卡,需要设
threads参数多线程输出,或者干脆用 FFmpeg 做底层编码、MoviePy 处理创意合成。 - 依赖 ffmpeg:MoviePy 不自带 ffmpeg 也没事,pip 安装时如果检测不到会尝试下载 static binary;但很多生产环境推荐自己装系统级 ffmpeg(更快更稳)。
- 中文路径问题:ffmpeg 对带中文 / 空格的路径有时报"Invalid argument",编码前把工作目录改成纯英文最稳。
- TextClip 的字体:默认字体是随便装的,指定字体时要传字体文件绝对路径,否则不同机器字体不同导致最终视频字体不一样。
- 大量短片时内存占用: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/