本文将重点介绍如何理解 manim 的输出文件和一些可用的主要命令行标志.
备注 : 本教程承接 Quickstart 教程,因此请在开始本教程之前阅读 Quickstart 教程。
manim 输出文件
此时,您刚刚执行了以下命令。
manim -pql scene.py SquareToCircle
让我们一步步剖析刚才发生的一切。首先,该命令执行 manim 文件 scene.py,其中包含我们的动画代码。此外,这条命令还告诉 manim
要渲染的场景,在本例中是 SquareToCircle。这是必要的,因为一个场景文件可能包含多个场景。接下来,-p
标志告诉 manim 在渲染完成后播放场景,-ql
标志告诉 manim 以低质量渲染场景。
视频渲染完成后,您会看到 manim 生成了一些新文件,项目文件夹如下所示。
project/
├─scene.py
└─media
├─videos
| └─scene
| └─480p15
| ├─SquareToCircle.mp4
| └─partial_movie_files
├─text
└─Tex
有不少新文件。主要输出文件位于 media/videos/scene/480p15/SquareToCircle.mp4
文件夹中。默认情况下,media 文件夹将包含 manim 的所有输出文件。media/videos
子文件夹包含已渲染的视频。在其中,你会发现每个不同质量的视频都有一个文件夹。在我们的例子中,由于使用了 -l 标志,视频是以每秒 15 帧、480 分辨率从 scene.py 文件生成的。因此,输出结果可以在 media/videos/scene/480p15
文件夹中找到。附加文件夹 media/videos/scene/480p15/partial_movie_files
以及 media/text
和 media/Tex
包含 manim 内部使用的文件。
manim -pqh scene.py SquareToCircle
表示低质量的 -ql 标志已被表示高质量的 -qh 标志所取代。由于我们使用了 -p 标志,Manim 渲染该文件的时间将大大延长,而且渲染完成后还会播放该文件。输出结果应该是这样的
文件夹结构应如下所示。
project/
├─scene.py
└─media
├─videos
| └─scene
| ├─480p15
| | ├─SquareToCircle.mp4
| | └─partial_movie_files
| └─1080p60
| ├─SquareToCircle.mp4
| └─partial_movie_files
├─text
└─Tex
Manim 创建了一个新文件夹 media/videos/1080p60
,对应高分辨率和每秒 60 帧。你可以在其中找到新的 SquareToCircle.mp4
以及相应的部分电影文件。
当在一个项目中使用多个场景并尝试多种分辨率时,输出目录的结构将使所有视频井井有条。
此外,当添加 -s 标志时,manim 还可以输出场景的最后一帧。这是快速预览场景的最快选项。相应的文件夹结构如下
project/
├─scene.py
└─media
├─images
| └─scene
| ├─SquareToCircle.png
├─videos
| └─scene
| ├─480p15
| | ├─SquareToCircle.mp4
| | └─partial_movie_files
| └─1080p60
| ├─SquareToCircle.mp4
| └─partial_movie_files
├─text
└─Tex
使用 -s 保存最后一帧画面时,可结合不同分辨率的标记,例如 -s -ql
、-s -qh
分段输出
除了电影输出文件外,还可以使用分段。每个片段都有自己的输出视频。两个片段之间的切换可以这样设置:
def construct(self):
# 播放第一个动画...
# 开始时不需要章节,因为它会自动创建
self.next_section()
# 播放更多动画...
self.next_section("this is an optional name that doesn't have to be unique")
# 播放更多动画...
self.next_section("this is a section without any animations, it will be removed")
两个剪辑之间的所有动画都会串联成一个输出视频文件。请注意,每个部分至少需要一个动画。例如,这样就无法创建输出视频:
def construct(self):
self.next_section()
# 此部分没有任何动画,将被移除
# 但不会出错
# 如果你愿意,可以随意管理你的空部分群
self.add(Circle())
self.next_section()
解决这个问题的方法之一是稍作等待:
要为每个部分创建视频,必须在 Manim 调用中添加 --save_sections 标记,如下所示:
manim --save_sections scene.py
这样,媒体文件夹就会变成这样:
media
├── images
│ └── simple_scenes
└── videos
└── simple_scenes
└── 480p15
├── ElaborateSceneWithSections.mp4
├── partial_movie_files
│ └── ElaborateSceneWithSections
│ ├── 2201830969_104169243_1331664314.mp4
│ ├── 2201830969_398514950_125983425.mp4
│ ├── 2201830969_398514950_3447021159.mp4
│ ├── 2201830969_398514950_4144009089.mp4
│ ├── 2201830969_4218360830_1789939690.mp4
│ ├── 3163782288_524160878_1793580042.mp4
│ └── partial_movie_file_list.txt
└── sections
├── ElaborateSceneWithSections_0000.mp4
├── ElaborateSceneWithSections_0001.mp4
├── ElaborateSceneWithSections_0002.mp4
└── ElaborateSceneWithSections.json
如您所见,每个部分都会在 sections 目录中接收自己的输出视频。这里的 JSON 文件包含每个部分的一些有用信息。
第三方应用程序(如演示系统或自动视频编辑工具)可以使用这些数据。
您还可以跳过渲染属于该部分的所有动画:
def construct(self):
self.next_section(skip_animations=True)
# 播放一些应跳过的动画...
self.next_section()
# 播放一些不会被跳过的动画...
另一些命令行指令
执行命令时,会指定要渲染的场景。现在不需要了。当单个文件只包含一个场景类时,它将只渲染该场景类。如果单个文件包含多个场景类,manim 会让您选x择一个场景类。如果您的文件包含多个场景类,而您又想渲染所有场景类,可以使用 -a 标志。
如前所述,-ql 指定了较低的渲染质量(854x480 15FPS)。这看起来不太好,但对于快速原型设计和测试非常有用。其他指定渲染质量的选项有 -qm、-qh、-qp 和 -qk,分别代表中等(1280x720 30FPS)、高(1920x1080 60FPS)、2k(2560x1440 60FPS)和 4k 质量(3840x2160 60FPS)。
一旦动画渲染完成,-p 标志就会播放动画。如果想在动画所在位置打开文件浏览器,而不是播放动画,可以使用 -f 标志。也可以省略这两个标记。
最后,默认情况下 manim 会输出 .mp4 文件。如果你想将动画转换成 .gif 格式,请使用 --format gif 标志。输出文件将与 .mp4 文件放在同一文件夹中,文件名相同,但扩展名不同。
以上是对一些最常用的命令行标记的快速回顾。如需全面了解所有可用标记,请参阅 Manim 配置系统专题指南。thematic guide on Manim’s configuration system.