CLI 基础与章节分段¶
manim 命令的完整形式是 manim render [OPTIONS] FILE [SCENE_NAMES]...,其中 render 是默认子命令,可以省略。除 render 外还有四个子命令:cfg(管理配置文件)、checkhealth(检查安装健康度)、init(创建项目/场景模板)、plugins(管理插件)。
render 常用选项¶
选项 |
作用 |
|---|---|
|
画质档位,对应 |
|
自定义分辨率(覆盖画质档位) |
|
自定义帧率 |
|
渲染结束后预览 |
|
渲染结束后打开输出目录 |
|
只保存最后一帧为 PNG |
|
渲染文件中的全部场景 |
|
只渲染第 N 到第 M 个动画(0 起编号) |
|
输出格式,默认 mp4 |
|
自定义输出文件名 |
|
自定义 media 根目录 |
|
指定额外的配置文件 |
|
日志详细程度(DEBUG/INFO/WARNING/ERROR) |
|
本次渲染不使用部分视频缓存 |
|
渲染前清空部分视频缓存 |
|
只执行逻辑,不产出任何文件 |
|
固定随机种子,保证随机效果可复现 |
|
选择渲染器,默认 cairo |
|
进度条开关( |
|
额外导出章节视频,见下文 |
废弃提醒
-g, --save_pngs 与 -i, --save_as_gif 在 v0.21.0 已标记为 Deprecated:请改用 --format png 与 --format gif。旧标志暂时仍可用,但会在日志中给出警告,且未来版本可能移除。
如果文件里有多个场景类,直接在文件名后面跟上场景名即可指定;不写则渲染第一个,-a 渲染全部:
manim -pqm scene.py MyScene OtherScene
Section¶
Section(type_, video, name, skip_animations) 官方文档 ↗
Section 是场景内“章节”的数据载体,记录在 manim.scene.section 中。开启 --save_sections 后,场景会按章节切成独立的小视频,并生成一份 JSON 清单,供交互式播放器、自动剪辑等第三方应用使用。
五要素即构造函数的四个参数:
name |
type |
default |
desc |
|---|---|---|---|
|
str |
— |
章节类型,取 |
|
str | None |
None |
章节视频文件名(位于 sections 输出目录) |
|
str |
— |
章节名称,来自 |
|
bool |
— |
该章节是否跳过了动画 |
通常不需要手动构造 Section——调用 next_section() 时场景会自动创建并追加到 self.sections。
next_section¶
Scene.next_section() 标记一个章节的起点:从上一次 next_section() 调用(或场景开头)到这一次调用之间的所有动画,属于上一个章节。
Scene.next_section(
name="unnamed",
section_type=DefaultSectionType.NORMAL,
skip_animations=False,
)
典型写法是在 construct() 开头和每个内容分界处调用:
三次 next_section() 把场景切成 intro / shift / outro 三个章节;配合 --save_sections 会额外导出 3 个章节视频与一份 JSON 清单。
查看源码 sections_demo.py
"""SectionsDemo: split one Scene into named sections via next_section()."""
from manim import *
class SectionsDemo(Scene):
def construct(self):
self.next_section("intro")
title = Text("Section 演示", font_size=48)
self.play(Write(title), run_time=1.0)
self.wait(0.5)
self.next_section("shift")
self.play(title.animate.shift(UP * 2), run_time=1.0)
self.wait(0.5)
self.next_section("outro")
self.play(FadeOut(title), run_time=1.0)
self.wait(0.5)
DefaultSectionType¶
DefaultSectionType(*values) 官方文档 ↗
DefaultSectionType 是定义章节类型的 StrEnum,目前只有唯一成员:
class DefaultSectionType(StrEnum):
NORMAL = "default.normal"
它是为第三方应用预留的扩展点:播放器或剪辑工具可以按 type 区分章节的语义(例如正文、跳过、循环等)。当前所有章节都是 NORMAL,在 sections.json 中体现为 "type": "default.normal"。
废弃提醒
旧版教程中的 SectionScene 在 v0.21.0 不存在,请直接使用 Scene.next_section()。从旧版本迁移时,删除 SectionScene 的继承并在 construct() 里插入 next_section() 调用即可。
--save_sections 与 sections.json¶
渲染时加上 --save_sections:
manim -qm --save_sections examples/ch01/sections_demo.py SectionsDemo
输出结构:
media/videos/sections_demo/720p30/
├── SectionsDemo.mp4 # 完整视频
└── sections/
├── SectionsDemo.json # 章节清单
├── SectionsDemo_0000_intro.mp4
├── SectionsDemo_0001_shift.mp4
└── SectionsDemo_0002_outro.mp4
SectionsDemo.json 是一个数组,每个元素描述一个章节:名称、类型、视频文件、分辨率、帧数、时长、编码等元数据。文件名中的序号是章节在场景中的顺序,名称取自 next_section(name=...)。
常见错误与建议¶
常见错误
next_section() 只切分视频,不影响播放顺序和动画本身;忘加 --save_sections 时它不会产生任何文件,日志里也没有明显提示。
提示
-n 与 --save_sections 可以组合:跳过的动画不进入任何章节,章节序号会相应前移。用 -n 调试后半段场景时,不要惊讶于 sections 目录里只有部分章节。
自测¶
✏️ 练习
场景里有 8 个 play() 调用,如何只渲染第 3 到第 5 个(按 1 起数)?
✅ 参考答案
动画编号从 0 开始,第 3 到第 5 个对应编号 2 到 4:
manim -qm -n 2,4 scene.py MyScene
✏️ 练习
已经用 next_section() 把场景分好章节,为什么 media/ 里找不到章节视频?
✅ 参考答案
next_section() 本身不产生文件,必须加 --save_sections 才会导出 sections/ 目录(章节视频 + <场景名>.json 清单)。
✏️ 练习
旧脚本里的 -i 标志在 v0.21.0 还能用吗?推荐怎么改?
✅ 参考答案
暂时仍可用,但它已标记为 Deprecated 并会打印警告。推荐改用 --format gif;同理 -g 改用 --format png,其他输出格式(mp4/webm/mov)也由 --format 统一控制。
下一步¶
入门板块到此结束:你已经会安装、写场景、控制画质和输出。下一板块进入图形世界,从 Mobject 核心概念讲起。