创建电影

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

如果输出路径是相对路径,那么它是 相对于项目文件夹 ,而不是当前工作目录。在上面的示例中,文件将被写入 /path/to/your_project/output.avi 。此行为类似于 --export 命令行参数。

由于 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 模式

To safely quit a project that is using Movie Maker mode, use the X button at the top of the window, or call get_tree().quit() in a script. You can also use the --quit-after N command line argument where N is the number of frames to render before quitting.

不建议 按 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 的学习曲线相对陡峭,但功能也更强大。

下面的命令将 AVI 视频转换为恒定速率因子 (Constant Rate Factor ,CRF) 为 15 的 MP4 (H.264) 视频。这会产生相对较大的文件,但非常适合各种平台(例如大多数视频共享网站),因为平台会重新编码视频将其压缩到它们设置的大小:

  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 和体积雾)变得更快,因此看起来表现更好。如果你想在不添加运动模糊的情况下获得这个表现提升,请参阅 降低帧率

Previous Next


© 版权所有 2014-present Juan Linietsky, Ariel Manzur and the Godot community (CC BY 3.0). Revision b1c660f7.

Built with Sphinx using a theme provided by Read the Docs.