Manim 的输出设置¶
本文档将重点介绍 Manim 的输出文件以及一些主要的命令行标志。
注意
本教程将承接快速入门的内容,因此请在阅读本文档之前先阅读该文档。
Manim 输出文件夹¶
此时,您刚刚执行了以下命令。
manim -pql scene.py SquareToCircle
让我们逐步剖析刚刚发生的一切。首先,此命令在包含我们动画代码的 scene.py
文件上执行 Manim。此外,此命令告诉 Manim 确切要渲染哪个 Scene
,在本例中是 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
标志,视频是从 scene.py
文件以 480 分辨率、15 帧每秒生成。因此,输出可以在 media/videos/scene/480p15
中找到。额外的文件夹 media/videos/scene/480p15/partial_movie_files
以及 media/text
和 media/Tex
包含 Manim 内部使用的文件。
您可以通过执行以下命令来查看 Manim 如何利用生成的文件夹结构,
manim -pqh scene.py SquareToCircle
-ql
标志(低质量)已被 -qh
标志(高质量)取代。Manim 渲染此文件将花费相当长的时间,并且由于我们使用了 -p
标志,它会在完成后播放。输出应如下所示
文件夹结构应如下所示。
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
,以及相应的 partial_movie_files
。
当处理包含多个场景并尝试多种分辨率的项目时,输出目录的结构将使您的所有视频保持井井有条。
此外,Manim 还可以选择在添加 -s
标志时输出场景的最后一帧。这是快速获取场景预览的最快选项。相应的文件夹结构如下所示
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):
# play the first animations...
# you don't need a section in the very beginning as it gets created automatically
self.next_section()
# play more animations...
self.next_section("this is an optional name that doesn't have to be unique")
# play even more animations...
self.next_section("this is a section without any animations, it will be removed")
这两个剪切之间的所有动画都将被连接成一个单独的输出视频文件。请注意,每个节中至少需要一个动画。例如,这不会创建输出视频
def construct(self):
self.next_section()
# this section doesn't have any animations and will be removed
# but no error will be thrown
# feel free to tend your flock of empty sections if you so desire
self.add(Circle())
self.next_section()
解决这个问题的一种方法是稍微等待一下
def construct(self):
self.next_section()
self.add(Circle())
# now we wait 1sec and have an animation to satisfy the section
self.wait()
self.next_section()
要为每个节创建视频,您必须将 --save_sections
标志添加到 Manim 调用中,如下所示
manim --save_sections scene.py
如果您这样做,media
文件夹将如下所示
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 文件包含每个节的一些有用信息
[
{
"name": "create square",
"type": "default.normal",
"video": "ElaborateSceneWithSections_0000.mp4",
"codec_name": "h264",
"width": 854,
"height": 480,
"avg_frame_rate": "15/1",
"duration": "2.000000",
"nb_frames": "30"
},
{
"name": "transform to circle",
"type": "default.normal",
"video": "ElaborateSceneWithSections_0001.mp4",
"codec_name": "h264",
"width": 854,
"height": 480,
"avg_frame_rate": "15/1",
"duration": "2.000000",
"nb_frames": "30"
},
{
"name": "fade out",
"type": "default.normal",
"video": "ElaborateSceneWithSections_0002.mp4",
"codec_name": "h264",
"width": 854,
"height": 480,
"avg_frame_rate": "15/1",
"duration": "2.000000",
"nb_frames": "30"
}
]
这些数据可以被第三方应用程序使用,例如演示系统或自动化视频编辑工具。
您也可以跳过渲染属于某个节的所有动画,如下所示
def construct(self):
self.next_section(skip_animations=True)
# play some animations that shall be skipped...
self.next_section()
# play some animations that won't get skipped...
一些命令行标志¶
执行命令时
manim -pql scene.py SquareToCircle
它指定要渲染的场景。现在这不是必需的。当单个文件只包含一个 Scene
类时,它将只渲染该 Scene
类。当单个文件包含多个 Scene
类时,Manim 将允许您选择一个 Scene
类。如果您的文件包含多个 Scene
类,并且您想渲染所有这些类,可以使用 -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 配置系统专题指南。