MovieWriter
继承: Object
非实时视频录制编码器的抽象类。
描述
Godot 能够使用非实时模拟技术录制视频。与 --fixed-fps
命令行参数类似,会强制让 Node._process 等函数每一帧都收到相同的 delta
,无论实际渲染花费了多长的时间。这个技术可用于录制高画质的视频,无论你的硬件性能如何,帧率始终都是恒定的。
Godot 内置的 MovieWriter 有两个:
使用 MJPEG 视频和未压缩音频的 AVI 容器(文件扩展名为
.avi
)。有损压缩、文件大小中等、编码速度较快。有损压缩质量可以通过修改 ProjectSettings.editor/movie_writer/mjpeg_quality 来调整。生成的文件可以使用大多数视频播放器查看,但如果要在 Web 上查看或者用 Godot 的 VideoStreamPlayer 查看,则必须先进行格式的转换。MJPEG 不支持透明度。AVI 输出的文件目前最多为 4 GB 大小。视频使用 PNG 图像序列、音频使用 WAV(文件扩展名为
.png
)。无损压缩、文件大小较大、编码速度较慢。旨在录制后使用 FFmpeg 等其他工具编码为视频文件。目前不支持透明度,即便将根视口设为透明。
如果你需要编码为其他格式,或者将流导入到第三方软件中,你可以扩展 MovieWriter 类,创建自己的影片写入器。出于性能考虑,一般应该使用 GDExtension 实现。
编辑器使用:默认影片文件路径可以在 ProjectSettings.editor/movie_writer/movie_file 指定。或者在运行单个场景时,也可以在根节点上添加元数据 movie_file
,可以指定录制该场景时所使用的影片文件路径。设置路径后,请点击编辑器右上角的电影胶卷图标,启动 Movie Maker 模式,然后和平常一样运行场景即可。引擎会在启动画面结束后开始录制,只会在引擎退出时停止录制。再次点击电影胶卷图标可以禁用 Movie Maker 模式。请注意,Movie Maker 模式的开关不会影响正在运行的项目实例。
注意:MovieWriter 既可以在编辑器中使用,也可以在导出的项目中使用,但这个功能不应用来让最终用户录制游戏视频。希望录制游戏视频的玩家应该安装 OBS Studio 或 SimpleScreenRecorder 等工具。
方法
_get_audio_mix_rate() virtual const | |
_get_audio_speaker_mode() virtual const | |
_handles_file(path: String) virtual const | |
_write_begin(movie_size: Vector2i, fps: int, base_path: String) virtual | |
void | _write_end() virtual |
_write_frame(frame_image: Image, audio_frame_block: | |
void | add_writer(writer: MovieWriter) static |
方法说明
int _get_audio_mix_rate() virtual const 🔗
当引擎请求用于录制音频的音频采样率时调用。返回的值必须以 Hz 为单位指定。如果 _get_audio_mix_rate 未被重写,则默认为 48000 Hz。
SpeakerMode _get_audio_speaker_mode() virtual const 🔗
当引擎请求用于录制音频的音频扬声器模式时调用。这可能会影响生成的音频文件/流中的输出通道数。如果 _get_audio_speaker_mode 未被重写,则默认为 AudioServer.SPEAKER_MODE_STEREO。
bool _handles_file(path: String) virtual const 🔗
当引擎确定该 MovieWriter 是否能够处理位于 path
的文件时调用。如果该 MovieWriter 能够处理给定的文件路径,则必须返回 true
,否则返回 false
。通常,_handles_file 如下被重写,以允许用户使用给定文件扩展名,在任何路径下记录一个文件:
func _handles_file(path):
# 允许指定一个带有 `.mkv` 文件扩展名(不区分大小写)的输出文件,
# 在项目设置中或使用 `--write-movie <path>` 命令行参数。
return path.get_extension().to_lower() == "mkv"
Error _write_begin(movie_size: Vector2i, fps: int, base_path: String) virtual 🔗
在引擎开始写入视频和音频数据之前调用一次。movie_size
是要保存的视频的宽度和高度。fps
是指定的每秒帧数,在项目设置中或使用 --fixed-fps <fps>
《命令行参数》指定。
void _write_end() virtual 🔗
当引擎完成写入时调用。当引擎通过按下窗口管理器的关闭按钮退出时,或调用 SceneTree.quit 时,会发生这种情况。
注意:在运行编辑器/项目的终端上,按 Ctrl + C,不会导致 _write_end 被调用。
Error _write_frame(frame_image: Image, audio_frame_block: const void*
) virtual 🔗
在每个渲染的帧结束时被调用。应写入 frame_image
和 audio_frame_block
函数参数。
void add_writer(writer: MovieWriter) static 🔗
添加一个可供引擎使用的编写器。可以通过重写 _handles_file,来设置支持的文件扩展名。
注意:add_writer 必须在引擎初始化期间尽早调用才能工作,因为电影编写被设计为与引擎的其余部分同时启动。