Manim 长视频为什么要拆成每章 60 秒以内?2026 最新的分章教程
2026 年 10 月 12 日 · 极坐标⋅XYZ
Manim 长视频为什么要拆成每章 60 秒以内?2026 最新的分章教程
Manim 的入门教程大多停在十几秒的单个场景,几分钟的长视频该怎么组织,很少有人讲。这篇按 2026 年最新的 Manim 0.21.0 写,讲我们自己在用的一套分章做法。
因为一个大 Scene 改不动。三五分钟的讲解写成一个 construct,改第 40 秒的一处颜色要把前面全部重渲一遍,旁白动一句,后面所有的等待时间都要重算。拆成每章一个 Scene、每章配一条自己的语音轨,每一章就可以单独渲染、单独返工,最后按顺序接起来。我们在极坐标⋅XYZ 工作区的「长动画」里用的就是这个结构:最多 8 章,每章不超过 60 秒。
这套组织方式不依赖我们的平台,在自己电脑上写 Manim 也适用。Manim 是 Grant Sanderson 为 3Blue1Brown 写的数学动画库,现在大家用的多是社区维护的版本,2026 年的最新版是 0.21.0,本文的代码按这个版本写(没用过的话先看这篇介绍)。文中用到的 Scene、self.wait、run_time 这些基础,极坐标⋅XYZ 上那套 2026 年更新的中文教程里都有对应的课。
一章一个 Scene,一章一个文件
目录长这样:
storyboard.json 分镜和口播稿
common.py 全片共用的配色、字号、辅助函数
chapters/ch1.py 第一章
chapters/ch2.py 第二章
voice/ch1.json 第一章口播的时间表
voice/ch1.wav 第一章的语音轨
几个取舍:
每章从空白画面开始,不接上一章留下的东西。上一章的图想继续用,就在这一章重新画。听起来浪费,换来的是任何一章都能单独跑,顺序也能调。
全片要统一的东西放进 common.py,比如「对角线一律黄色、线宽 4」「一般说明文字 28 号」。各章 from common import *。这个文件一改,所有章都要重渲,所以尽量一开始定好。
时间表按章分开存。如果全片共用一个文件,改第二章的一句话,文件变了,所有读过它的章都得当成「可能受影响」重新来过。
声音不动,动画去贴
带旁白的 Manim 视频,最省事的做法是先把声音定下来。每章的口播一句一句合成好,拼成一条语音轨,同时得到一张时间表,写着每一句从第几秒到第几秒。
场景开头用 add_sound 把这条轨放进去,之后声音就不管了,动画照着时间表走。我们写了一个很小的基类来做这件事,核心就四个方法:
from manim import *
from voice_align import Chapter
from common import *
class Ch2Force(Chapter):
CH = "ch2"
def construct(self):
# 2-1 小球受到重力 mg 和沿摆线指向悬点的拉力。
self.cue(0) # 等到第 1 句开始
self.play(Create(rod), FadeIn(bob), run_time=1.0)
self.at(0, 2.6) # 这句话说到 2.6 秒,正好念到「重力」
self.play(GrowArrow(gravity), Write(g_label), run_time=1.0)
self.at(0, 5.6) # 念到「拉力」
self.play(GrowArrow(tension), Write(t_label), run_time=1.0)
# 2-2 把重力沿两个方向分解……
self.cue(1)
self.play(GrowArrow(radial), GrowArrow(tangent),
run_time=min(1.4, self.rest(1)))
self.finish() # 等到这一章的语音结束
(节选,图形的定义省略了。)
cue(i) 等到第 i 句的起点,at(i, 秒) 等到这句话里的某个词,rest(i) 告诉你离下一句还剩多少时间,finish() 等到语音轨结束。整章里没有一个手算的 self.wait(2.37)。
cue 还顺手做了一件事:如果执行到它的时候,时间已经过了这句话的起点,说明上一段动画超时了,它会把晚了多少记下来。我们的标准是晚了超过 0.15 秒就算不合格,要回去压缩上一段的 run_time。

为什么是 60 秒
60 秒不是 Manim 的限制,引擎渲多长都行。这是从改起来的成本倒推的。
一章 30 到 50 秒,对应五六句口播、一两个要讲清的点。这个大小,AI 写一遍、跑一遍、看一遍画面,三四个来回能收敛。章再长,第 50 秒出的问题要等前 50 秒都渲完才看得到,改一轮的时间跟着变长,改后面的时候也更容易把前面碰坏。
另一个原因是画面检查。每章渲完,我们在每句口播结束前取一帧,拼成一张图给 AI 看,让它对照分镜里写的画面要求找问题。一章五六句话,这张图上每一格都还看得清;塞进去十几句,每一格就小得看不出标签有没有压线了。
8 章的上限是内存定的。5 章的预览画面留在浏览器内存里,我们实测是 117MB,8 章还在安全范围内。

几章同时写,排队渲染
各章互相独立,所以可以同时写。我们让最多三章的 AI 同时工作,每章各写各的文件,谁也看不到别人的代码,只共享分镜和 common.py。
渲染是排队的,一次只渲一章。浏览器里只有一个 Python 运行环境,这一点躲不开,不过渲染本身不慢。我们拿三个 5 章的片子比过,浏览器里逐章渲完和本机装的 Manim 用时差不多:单摆那部浏览器 36.2 秒、本机 35.6 秒,定积分那部 29.4 秒对 28.4 秒。时间主要花在 AI 写代码上。
哪些章需要重渲,靠的是给每章算一个「指纹」,只包含它自己的文件、它 import 的模块、它读的那份时间表和语音。指纹没变就用上次的结果。所以改第三章,第二章不会动;改 common.py,全部重渲。

最后怎么拼
在自己电脑上,最直接的办法是每章各渲一个 mp4,再用 ffmpeg 接起来。
工作区里没有中间文件这一步。导出时各章按顺序重新渲染一遍,画面一帧接一帧送进同一个视频编码器,各章的语音按各自的起点混成一条音轨。这样做要求各章的画幅和帧率一致,这个由分镜里的全片设置管着。章与章之间是直接切,没有转场。
常见问题
Q:我自己写 Manim,不用 AI,这套结构也适合吗?
A:适合,而且更省心。一章一个文件、声音先行、动画追时间点,这三条照搬就行。那个对齐基类在工作区做过长动画的项目里能直接看到,文件名是 voice_align.py,只有几十行。
Q:一定要先有配音吗?先做动画行不行? A:行,但后面录音要迁就画面,很难说得自然。没有配音的时候,可以先按每秒 4.7 个字估一张时间表,把动画做出来,之后补上真的语音再对一遍。
Q:章和章之间想要连贯的过渡怎么办?
A:让下一章开头的画面和上一章结尾一致:把那几个图形的定义放进 common.py,两章都用它。直接切过去时观众看不出换了一章。
Q:一章里口播说完了、动画还没演完怎么处理? A:给那一句加一段停顿。分镜里每一句可以设「说完后多留几秒」,这段是真的静音,后面的句子整体后移。
Q:这些在浏览器里都能做吗? A:能。打开「长动画」开关,分章、配音、对齐、拼接都是自动的,流程见这篇。
想直接看一个分好章的项目长什么样,在工作区用「长动画」做一部短片,然后打开 chapters/ 里的文件读一读。run_time、wait 和各种动画怎么控制时长,在教程的动画部分。
来源:极坐标⋅XYZ(jizuobiao.xyz),2026 年 10 月 12 日更新,基于 Manim 社区版 0.21.0。渲染用时为 2026 年 10 月的对比实测。