Manim 的输出设置#

本文档的重点将放在理解Manim的输出文件和一些主要的命令行参数上。

Note

教程是在Quickstart(快速入门教程)的基础上继续讲解的, 因此在开始本教程之前,请先阅读那个文档。

Manim输出目录#

到了现在, 你可以已经在命令行中运行了下面的命令。

manim -pql scene.py SquareToCircle

我们一步一步来分享整个过程,命令行终端中输入,它告诉Manim去执行名为scene.py的Python脚本, 这个脚本包含了我们的动画代码。 这个命令告诉Manim渲染哪个场景(Scene),在本例中, 它对应是SquareToCircle。 这是必要的,因为一个场景文件可能包含多个场景。在Manim中,一个场景文件通常包含多个场景,每个场景都是一个Scene类的实例。 因此,在执行Manim命令时,需要明确指定要渲染的场景类,以便Manim知道要生成哪个场景的动画效果。 如果不指定场景类,则Manim将无法确定要渲染的场景,可能会出现错误或生成不正确的动画效果。 因此,在执行Manim命令时,通常需要指定场景类,以确保生成正确的动画效果。 接下来,标志 "-p" 告诉Manim在渲染完场景后立即播放它。这句话的意思是,选项标志 "-ql" 告诉Manim在低质量模式下渲染场景。具体来说,"-ql" 是Manim命令中的一个选项标志,它告诉Manim以较低的分辨率和帧速率来渲染场景,以减少渲染时间和资源消耗。这对于快速查看和调试动画效果非常有用,可以加快渲染速度并降低电脑负载。

在视频渲染完成后,你会发现Manim生成了一些新的文件,并且project文件夹的结构会如下所示。

project/
├─scene.py
└─media
  ├─videos
  |  └─scene
  |     └─480p15
  |        ├─SquareToCircle.mp4
  |        └─partial_movie_files
  ├─text
  └─Tex

生成了很多新文件。 主要是一个视频文件: media/videos/scene/480p15/SquareToCircle.mp4. 默认,media 文件夹会放入所有生成的输出文件。media/videos 子目录件存放视频。不同的分辨率会存在不同的文件夹中。在这里我们使用了 -l标志, 视频为 480 像素每秒15帧。 因此输出结果在这个目录: media/videos/scene/480p15中找到. 额外的文件夹 "media/videos/scene/480p15/partial_movie_files"、 "media/text" 和 "media/Tex" 包含了Manim内部使用的文件。具体来说,这些文件夹中包含了Manim渲染视频时使用的各种资源文件,例如场景定义文件、图片、音频、字体文件、LaTeX模板等。这些资源文件的作用是为Manim提供必要的元素来渲染视频或图形,并且通常不需要手动修改或删除。其中,"media/videos/scene/480p15/partial_movie_files" 文件夹通常包含临时渲染文件、缓存文件或部分渲染的视频文件,可以用于加快渲染速度或恢复中断的渲染过程。这些文件夹和文件对于理解Manim的内部机制和调试渲染过程非常有帮助。

你可以通过执行以下命令来查看Manim如何利用生成的文件夹结构。

manim -pqh scene.py SquareToCircle

Manim中原本用于设置低质量输出的 "-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.

当在同一个 project 中又多个 scenes, 并且输出多种分辨率格式的视频,这种输出目录的结构将使您的所有视频井井有条。

此外, 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

切片#

除了电影输出文件外,还可以使用sections(切片). 每个section(切片)可以产生自己单独的视频文件。 每个sections(切片)可以像这样处理:

def construct(self):
    # 播放第一个动画...
    # 一开始不需要section,因为它是自动创建
    self.next_section()
    # 播放后面的一些动画...
    self.next_section("这是一个可选的名称,不必是唯一的")
    # 播放更多动画...
    self.next_section("这是一个没有任何动画的部分,它将被删除")

所有这些剪切之间的动画被连接到一个单独的输出视频文件。请注意,每个部分至少需要一个动画。例如,这样写就不会输出视频:

def construct(self):
    self.next_section()
    # 他的部分没有任何动画,将被删除
    # 但是不会抛出错误信息
    # 如果您愿意,可以随意处理您的空白部分
    self.add(Circle())
    self.next_section()

有一个小技巧可以修正这个错误,就是使用一个 wait 延时一下:

def construct(self):
    self.next_section()
    self.add(Circle())
    # 现在我们等待1秒,这样会产生一个空白动画
    self.wait()
    self.next_section()

为了使每个切片产生一个视频需要使用 --save_sections 标志选项,像这样:

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)
    #播放一些应该跳过的动画 ...
    self.next_section()
    # 播放一些不跳过的动画...

一些命令行 flags#

当我们执行下面命令的时候

manim -pql scene.py SquareToCircle

渲染时需要指定要渲染的Scene 类。这是如果单个文件可以包含多个Scene 类。多个Scene 类,你都想要渲染它们,可以使用-a标志。

如前所述,-ql指定了低渲染质量。 这样渲染出来的效果可能不太好,但对于快速原型设计和测试非常有用。指定渲染质量的其他选项包括-qm-qh-qk ,分别指定了中等,高和4k质量。

-p标志在渲染完成后播放动画。 如果你想要打开文件浏览器并跳转到动画的位置,而不是播放动画,可以使用 -f标志。你也可以不使用这两个标志。

最后,默认会导出 .mp4 文件。如果你想产生.gif格式的文件, 可以使用-i flag。输出文件会被放到 .mp4文件相同的路径下面, 同时文件名也一样,只是后缀名不同而已。

这是一次快速回顾一些最常用的命令行标志。如果你想全面了解所有可用的标志,请查看Manim配置系统的主题指南。 .