创建电影

Godot 可以为任何 2D 或 3D 项目录制非实时音视频。这种录制也叫离线渲染。适合很多不同的场景:

  • 录制游戏预告片以供宣传使用。

  • 录制过场动画,这些过场动画将在最终游戏中 以预先录制的视频形式展现。这会在不管播放器硬件水平如何的情况下,允许使用更高质量的设置(以文件大小为代价)。

  • 记录程序生成的动画或动作设计。在视频录制过程中,仍可以进行用户交互,录制的视频中也可以包含音频(尽管在录制视频时你将无法听到它)。

  • 比较动画场景中图形设置、着色器或渲染技术的视觉输出。

借助 Godot 的动画功能,例如 AnimationPlayer 节点、Tweeners、粒子和着色器,它可以有效地用于创建任何类型的 2D 和 3D 动画(以及静态图像)。

如果你已经习惯了 Godot 的工作流程,你可能会发现使用 Godot 进行视频渲染会比 Blender 更加高效。 也就是说,非实时渲染器(例如 Cycles 和 Eevee)可以带来更好的视觉效果(代价是更长的渲染时间)。

与实时视频录像相比,非实时录像的一些优点包括:

  • 无论你的硬件性能如何,都可以使用任何图形设置(包括要求极高的设置)。输出视频 始终 具有完美的帧节奏;它永远不会出现丢帧或卡顿的情况。更快的硬件将允许你在更短的时间内渲染给定的动画,而视觉输出保持不变。

  • 以比屏幕分辨率更高的分辨率进行渲染,而无需依赖特定于驱动程序的工具,例如 NVIDIA 的动态超级分辨率(Dynamic Super Resolution)或 AMD 的虚拟超级分辨率(Virtual Super Resolution)。

  • 以高于视频目标帧率的帧率进行渲染,然后进行 后处理以生成高质量的运动模糊。这也使得在多个帧上聚合的效果(例如时间抗锯齿、SDFGI 和体积雾)看起来更好。

警告

此功能并非专为在游戏中捕捉实时镜头而设计。

玩家应该使用`OBS Studio <https://obsproject.com/>`__ 或`SimpleScreenRecorder <https://www.maartenbaert.be/simplescreenrecorder/>`__ 之类的工具来录制游戏视频,因为它们可以更好地截取合成器的输出,比 Godot 使用 Vulkan 或 OpenGL 所能完成的工作要多。

也就是说,如果你的游戏在录制时以接近实时的速度运行,你仍可以使用此功能(但它将缺少可被听见的音频播放,因为音频会直接保存到视频文件中)。

启用 Movie Maker 模式

要启用 Movie Maker 模式,请在 运行项目之前 单击编辑器右上角的“电影胶片卷”(movie reel)按钮:

Movie Maker 模式已禁用时,单击“电影胶片卷”图标即可启用

Movie Maker 模式已禁用时,单击“电影胶片卷”图标即可启用

当启用 Movie Maker 模式时,图标的背景会与强调色相匹配:

Movie Maker 模式启动后,再次点击“电影胶片卷”图标关闭

Movie Maker 模式启动后,再次点击“电影胶片卷”图标关闭

当编辑器退出时,Movie Maker 状态 不会 保留,因此如果需要,你必须在重新启动编辑器后再次重新启用 Movie Maker 模式。

备注

在项目重新启动之前,运行项目时切换 Movie Maker 模式不会产生任何效果。

在通过运行项目录制视频之前,仍然需要配置输出文件路径。可以在项目设置中为所有场景设置该路径:

Movie Maker 项目设置(启用高级选项)

Movie Maker 项目设置(启用高级选项)

或者,你可以通过将名为 movie_file 的 String 元数据添加到场景的 根节点 ,来设置每个场景的输出文件路径。仅当主场景设置为相关场景时,或者通过按 F6`(在 macOS 上 :kbd:`Cmd + R)直接运行场景时,该功能才会被使用。

创建 String 类型的 ``movie_file`` 元数据后的检查器视图

创建 String 类型的 movie_file 元数据后的检查器视图

项目设置或元数据中指定的路径可以是绝对路径,也可以是相对于项目根目录的路径。

在配置并启用 Movie Maker 模式后,从编辑器运行项目时将自动使用该模式。

命令行用法

Movie Maker 也可以通过命令行启用:

  1. godot --path /path/to/your_project --write-movie output.avi

If the output path is relative, then it is relative to the project folder, not the current working directory. In the above example, the file will be written to /path/to/your_project/output.avi. This behavior is similar to the --export-release command line argument.

由于 Movie Maker 的输出分辨率是由视口大小设置的,因此如果项目使用 disabledcanvas_items 拉伸模式,你可以在启动时调整窗口大小以覆盖它:

  1. godot --path /path/to/your_project --write-movie output.avi --resolution 1280x720

请注意,窗口大小受显示器分辨率的限制。如果你需要以比屏幕分辨率更高的分辨率录制视频,请参阅 以比屏幕分辨率更高的分辨率进行渲染

录制的 FPS 也可以在命令行上覆盖,而无需编辑项目设置:

  1. godot --path /path/to/your_project --write-movie output.avi --fixed-fps 30

备注

--write-movie--fixed-fps 命令行参数在导出的项目中都可用。项目运行时无法切换 Movie Maker 模式,但可以使用 OS.execute() 方法来运行导出项目的第二个实例以录制视频文件。

选择输出格式

输出格式由 MovieWriter 类提供。 Godot 有 2 个内置的 MovieWriter,更多格式可以通过扩展来实现:

AVI(推荐)

带有 MJPEG 的 AVI 容器,用于视频和未压缩的音频。具有有损视频压缩功能,可实现中等文件大小和快速编码。有损压缩质量可以通过更改 编辑器 > Movie Writer > MJPEG 质量 来调整。

生成的文件可以在大多数视频播放器中查看,但必须将其转换为另一种格式才能在 Web 上查看,或在 Godot 使用 VideoStreamPlayer 节点查看。 MJPEG 不支持透明度。 AVI 输出的文件大小目前限制为最大 4 GB。

要使用 AVI,请指定要在 编辑器 > Movie Writer > 电影文件 项目设置中创建的 .avi 文件的路径。

PNG

用于视频的 PNG 图像序列和用于音频的 WAV 图像序列。具有无损视频压缩功能,但代价是文件较大且编码速度较慢。这被设计为 录制后使用外部工具编码为视频文件

支持透明度,但根视口 必须 将其 transparent_bg 属性设置为 true ,以使透明度在输出图像上可见。这可以通过启用 渲染 > 视口 > 透明背景 高级项目设置来实现。 显示 > 窗口 > 大小 > 透明显示 > 窗口 > 像素级透明度 > 启用 可以选择启用,以允许在录制视频时预览透明度,但不必在录制视频时启用它们。输出图像包含透明度。

要使用 PNG,请指定要在 编辑器 > Movie Writer > 电影文件 项目设置中创建的 .png 文件。生成的 .wav 文件将与 .png 文件同名(去掉扩展名的话)。

自定义

如果你需要直接编码为不同的格式或通过第三方软件传输数据流,可以扩展 MovieWriter 类来创建你自己的电影编写器(movie writers)。出于性能原因,这通常应该使用 GDExtension 来完成。

配置

在项目设置的 编辑器 > Movie Writer 部分中可配置多个选项。其中一些仅在启用“项目设置”对话框右上角的 高级选项 后才可见。

  • 混音率: 编写电影时在录制的音频中使用的音频混合率。这可能与项目的混合速率不同,但该值必须能被录制的 FPS 整除,以防止音频随着时间的推移而失去同步。

  • 扬声器模式: 编写电影时录制的音频中使用的扬声器模式(stereo 立体声、5.1 环绕声或 7.1 环绕声)。

  • MJPEG 质量: 将视频写入 AVI 文件时使用的 JPEG 质量,介于 0.011.0 (包含)之间。质量值越高,输出效果越好,但文件大小会越大。建议的质量值在 0.750.9 之间。即使质量为 1.0 ,JPEG 压缩仍然是有损的。此设置不会影响音频质量,并且在写入 PNG 图像序列时会被忽略。

  • 电影文件: 电影的输出路径。这可以是绝对路径,或相对于项目根目录的相对路径。

  • 禁用垂直同步: 如果启用,则在写入电影时请求禁用垂直同步。如果硬件足够快,能够以高于显示器刷新率的帧速率渲染、编码和保存视频,这可以加快视频写入速度。如果操作系统或图形驱动程序强制垂直同步且应用程序无法禁用它,则此设置无效。

  • FPS: 输出影片中每秒渲染的帧数。值越高,动画越平滑,但代价是渲染时间更长和输出文件大小更大。大多数视频托管平台不支持高于 60 的 FPS 值,但你可以使用更高的值并用它来生成运动模糊。

备注

当使用 disabled2d 拉伸模式 时,输出文件的分辨率由窗口大小设置。确保在启动画面结束 之前 调整窗口大小。为此,建议调整高级设置中的 显示 > 窗口 > 大小 > 窗口宽度覆盖窗口高度覆盖

另见 以比屏幕分辨率更高的分辨率进行渲染

退出 Movie Maker 模式

为了安全退出使用 Movie Maker 模式的项目,请使用窗口顶部的 X 按钮,或在脚本中调用 get_tree().quit() 。你也可以使用 --quit-after N 命令行参数,其中 N 是退出前要渲染的帧数。

不建议 按 F8`(在 macOS 上按 :kbd:`Cmd + .)或在运行 Godot 的终端上按 Ctrl + C,因为这会导致 AVI 文件出现没有时长信息的不正确情况。对于 PNG 图像序列而言,PNG 图像不会有负面影响,但关联的 WAV 文件仍会缺少时长信息。

某些视频播放器可能仍然能够播放包含有效视频和音频的 AVI 或 WAV 文件。但是,使用 AVI 或 WAV 文件的软件(例如视频编辑器)可能无法打开该文件。在这些情况下, 使用视频转换器程序 可以提供一些帮助。

如果你使用 AnimationPlayer 来控制场景中的“主要动作”(例如摄像机移动),则可以在相关的 AnimationPlayer 节点上启用 Movie Quit On Finish 属性。启用后,当动画播放完毕 并且 引擎在 Movie Maker 模式下运行时,此属性将使 Godot 自行退出。请注意, 此属性对循环动画没有影响 。因此,你需要确保动画设置为非循环。

使用高质量的图形设置

movie 功能标签 可用于覆盖特定的项目设置。这对于启用高质量图形设置来说非常有用,但这些设置的速度不足以在硬件上以实时速度运行。请记住,将每个设置设为最大值仍然会降低影片保存速度,尤其是在以更高分辨率录制时。因此,建议仅在图形设置对输出图像产生可以有价值的影响时,再增加图形设置。

还可以在脚本中查询此功能标签,以提高环境资源中设置的质量设置。例如,为了进一步改善 SDFGI 细节并减少漏光:

  1. extends Node3D
  2. func _ready():
  3. if OS.has_feature("movie"):
  4. # When recording a movie, improve SDFGI cell density
  5. # without decreasing its maximum distance.
  6. get_viewport().world_3d.environment.sdfgi_min_cell_size *= 0.25
  7. get_viewport().world_3d.environment.sdfgi_cascades = 8

以比屏幕分辨率更高的分辨率进行渲染

通过4K或8K等高分辨率渲染可以显着提高整体渲染质量。

备注

对于 3D 渲染,Godot 在高级项目设置中提供了 渲染 > 缩放 3D > 缩放 ,可以将其设置为高于 1.0 以获得 超采样抗锯齿 。当 3D 渲染在视口上绘制时,它会被 降采样 。这提供了一种性能代价高昂但高质量的抗锯齿形式,并且不会增加最终的输出分辨率。

首先考虑使用此项目设置,因为与实际增加输出分辨率相比,它可以避免减慢影片写入速度和增加输出文件大小。

如果你希望以更高分辨率渲染 2D,或者实际上你需要更高的原始像素输出来进行 3D 渲染,则可以将分辨率提高到屏幕允许的分辨率之上。

默认情况下,Godot 在项目中使用 disabled 拉伸模式 。如果使用 disabledcanvas_items 拉伸模式,窗口大小决定输出视频分辨率。

另一方面,如果项目配置中使用 viewport 拉伸模式,则视口分辨率会决定输出视频分辨率。视口分辨率使用 显示 > 窗口 > 大小 > 视口宽度视口高度 项目设置进行设置。这可用于以比屏幕分辨率更高的分辨率渲染视频。

要在录制过程中缩小窗口而不影响输出视频分辨率,可以将高级项目设置中 显示 > 窗口 > 大小 > 窗口宽度覆盖窗口高度覆盖 设置为大于 0 的值。

要仅在录制电影时应用分辨率覆盖,可以使用 movie 功能标签 来覆盖这些设置。

后期处理步骤

以下列出一些常见的后期处理步骤。

备注

当使用多步后处理时,请尝试在单一 FFmpeg命令中执行所有这些步骤。这将避免掉多个有损的编码步骤从而节省编码时间并提高品质。

将 AVI 视频转换为 MP4

尽管 YouTube 等一些平台支持直接上传 AVI 文件,但许多其他平台则需要事先进行格式转换。HandBrake(GUI)和 FFmpeg(CLI)都是这方面非常流行的开源工具。FFmpeg 的学习曲线相对陡峭,但功能也更强大。

The command below converts an AVI video to an MP4 (H.264) video with a Constant Rate Factor (CRF) of 15. This results in a relatively large file, but is well-suited for platforms that will re-encode your videos to reduce their size (such as most video sharing websites):

  1. ffmpeg -i input.avi -crf 15 output.mp4

要以牺牲质量为代价获得较小的文件,请 增加 上述命令中的 CRF 值。

要获得具有更好的大小/质量比的文件(以较慢的编码时间为代价),请在上述命令中的 -crf 15 之前添加 -preset veryslow 。相反地, -preset veryfast 可用于实现更快的编码,但代价是尺寸/质量比更差。

将 PNG 图像序列 + WAV 音频转换为视频

如果你选择录制 PNG 图像序列和 WAV 文件,则需要先将其转换为视频,然后才能在其他地方使用。

Godot 生成的 PNG 图像序列的文件名始终包含 8 位数字,从 0 开始,数字以零填充。如果指定输出路径 folder/example.png ,Godot 将在该文件夹中写入 folder/example00000000.pngfolder/example00000001.png 等。音频将保存在 folder/example.wav 中。

FPS 使用 -r 参数指定。它应该与录制期间指定的 FPS 相匹配。否则视频会显得速度减慢或加快,并且音频与视频不同步。

  1. ffmpeg -r 60 -i input%08d.png -i input.wav -crf 15 output.mp4

如果你在启用透明度的情况下录制了 PNG 图像序列,则需要使用支持存储透明度的视频格式。 MP4/H.264 不支持存储透明度,因此可以使用 WebM/VP9 作为替代方案:

  1. ffmpeg -r 60 -i input%08d.png -i input.wav -c:v libvpx-vp9 -crf 15 -pix_fmt yuva420p output.webm

视频剪辑

录制视频后你可以剪辑掉不想保留的视频部分。例如,要丢弃 12.1 秒之前的所有内容,并仅保留该点之后 5.2 秒的视频:

  1. ffmpeg -i input.avi -ss 00:00:12.10 -t 00:00:05.20 -crf 15 output.mp4

也可以使用 GUI 工具 LosslessCut 来剪辑视频。

视频缩放

以下命令将视频大小调整为 1080 像素高 (1080p),同时保留其现有的宽高比:

  1. ffmpeg -i input.avi -vf "scale=-1:1080" -crf 15 output.mp4

降低帧率

下面的命令会将视频的帧率更改为 30 FPS,如果输入视频中帧率更高,则会丢弃一些原始帧:

  1. ffmpeg -i input.avi -r 30 -crf 15 output.mp4

使用 FFmpeg 生成累积运动模糊

Godot 没有内置对运动模糊的支持,但仍然可以在录制的视频中创建运动模糊。

如果你以原始帧率的几倍来录制视频,则可以将帧混合在一起,然后再减少帧率以生成具有 累积运动模糊 的视频。这种运动模糊看起来很棒,但因为必须每秒渲染更多帧,生成可能需要很长时间(除了后期处理所花费的时间之外)。

以 240 FPS 的源视频为例,生成 4 倍运动模糊并将其输出帧率降低至 60 FPS:

  1. ffmpeg -i input.avi -vf "tmix=frames=4, fps=60" -crf 15 output.mp4

因为这个操作将能够在给定时间内处理更多数据,所以也会使得在多个帧上的收敛效果(例如时间抗锯齿、SDFGI 和体积雾)变得更快,因此看起来表现更好。如果你想在不添加运动模糊的情况下获得这个表现提升,请参阅 降低帧率