TiXL 连续录制(Continuous Capture)完全指南:无固定时长的实时渲染导出
【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3
TiXL 的Render To File(渲染到文件)功能支持一种区别于常规定长导出的录制方式——Continuous(连续)录制:按下渲染后立即开始捕捉,直到你再次按下停止为止,没有预设的结束时间。本文基于 TiXL 开源仓库中的 连续录制人工测试集 与 视频导出帮助文档,并结合渲染窗口、渲染进程的源码实现,完整讲解 Continuous 录制的界面操作、两种时钟模型(Realtime / Deterministic)、编码器警告与持久化行为,让你能够用它录制不限时长的现场演出与即兴 Session。
Continuous 是什么:一种“开放结尾”的录制模式
TiXL 绝大多数导出都针对一个已知起止的固定区间:设定 Start / End,渲染到进度条走完为止。Continuous则完全不同——它是一个open-ended(开放结尾)的录制:
- 按下Render后立即开始捕捉;
- 持续录制,直到你再次按下捕捉控制(Stop)才收尾并保存文件;
- 没有固定的结束时间,非常适合现场演出、VJ Session、音频反应式即兴创作这类“不知道会演多长”的场景。
与之对应,录制过程中常规进度条会被替换成一个来回扫动的“仍在进行”指示器(sweeping activity indicator),直观表示录制没有确定的进度终点。
在 RenderSettings.cs 中,TimeRanges枚举的第四个成员即为此模式:
/// <summary>Open-ended recording: capture starts immediately and runs until the user stops it, with no /// predetermined end. See <see cref="ContinuousClock"/> for how playback time is driven.</summary> Continuous,前置条件:先准备好输出
根据测试集 frontmatter 的prerequisites,使用 Continuous 录制前需要满足:
- 项目中打开了一个具有 Texture2D 输出的算子,并且该输出已在Output Window(输出窗口)中选中或固定(pin),这样 “Render To File” 才有内容可渲染;
- 理想情况下画面带有可见的运动,这样录制出来的帧之间容易区分,便于验证效果。
第一步:在 Source 面板中启用 Continuous(第四种 Range 模式)
操作:打开Render To File窗口(输出窗口工具栏的滑块图标,或通过主菜单进入),在左侧边栏选择Source区块,观察Range(范围)分段按钮。
预期结果(与 测试步骤 1 一致):
- Range控件提供四种选项:Custom(自定义)/ Loop(循环)/ Soundtrack(配乐)/ Continuous(连续);
- 选择Continuous后,Scale / Start / End三行被隐藏,取而代之的是:
- Clock(时钟)控件(Realtime / Deterministic二选一);
- Frame Rate(帧率)控件。
在 RenderWindow.cs 中,isContinuous为真时即切换到DrawContinuousOptions(s)绘制 Continuous 专属选项;窗口底部的一行摘要也会变为类似:
Continuous · 1920×1080 · H.264 · realtime · 60 fps(参见 RenderWindow.cs 的BuildSummaryLine实现——连续模式没有时长与体积预估,因为根本没有固定终点。)
两种时钟模型:Realtime 与 Deterministic
Continuous 的核心区别在于用什么驱动播放时间。你在Clock中选择其一:
| 维度 | Realtime(实时) | Deterministic(确定性) |
|---|---|---|
| 捕捉内容 | 现场输出,所见即所得(OBS/VJ 风格) | 按目标 FPS 推进时间轴 |
| 播放控制权 | 完全交给你,播放保持实时、可交互 | 编辑器接管,逐帧推进 |
| 帧完整性 | 受编码速度影响,可能丢帧/重复帧 | 逐帧完美(frame-perfect),即使编码慢于实时 |
| 音频 | 暂不支持(video only) | 开启 Export Audio 可包含配乐 |
| 分辨率 | 使用输出的原始分辨率 | 受 Resolution Scale 控制 |
源码枚举 ContinuousCaptureClock 对两种时钟给出了准确定义:
- Realtime:“Leave playback under live/user control and grab whatever the output shows each frame (OBS/VJ-style). Best for live performance and audio-reactive/interactive content.”(保持播放由用户实时控制,逐帧抓取输出画面,最适合现场演出与音频反应式/交互内容。)
- Deterministic:“Step playback forward at the target FPS like a normal render, but without a fixed end — frame-perfect even when encoding is slower than realtime.”(像普通渲染一样按目标 FPS 推进时间,但没有固定终点——即使编码慢于实时也能保证帧完整。)
在界面上,Clock 下方会显示一行随选项变化的提示(见 测试步骤 2):
- Realtime:提到抓取实时输出,且“仅视频 / 暂无音频”;
- Deterministic:提到按目标 FPS 推进、帧完美但不实时。
对应 UI 文案见 RenderWindow.cs:
Grabs the live output as you perform; press capture again to stop. (Video only — no audio yet.) Advances time at the target FPS until you stop. Frame-perfect, but not realtime.Frame Rate 与 Resolution Scale 的实时行为
Frame Rate(帧率):当前仅实现Fixed FPS(固定帧率)。测试集明确要求:该控件处于禁用状态并显示 “Fixed FPS”,提示“可变帧率(VFR)即将推出”。源码中 ContinuousFrameRateMode 枚举确实预留了Variable成员,但注释标注为“Reserved — not yet implemented”(保留,尚未实现);UI 层通过ImGui.BeginDisabled()将其置灰(RenderWindow.cs)。
Resolution Scale(分辨率缩放):当Clock = Realtime时,该行被禁用并提示“Realtime capture uses the native output resolution.”(实时捕捉使用输出的原始分辨率)。原因见 RenderProcess.cs:实时捕捉直接抓取现场纹理,因此强制ResolutionFactor = 1f,不可缩放;而 Deterministic 模式下 Resolution Scale 正常可用(2 倍即可从 1080p 产出 4K 母版)。
慢速编码器会警告,但录制仍然允许
操作:保持 Continuous 选中,进入Format & Quality区块,将Codec切换为较慢的编码器(如VP9或ProRes),再换回H264(在显卡支持硬件编码的机器上)。
预期结果(测试步骤 3):
- 对于无法使用显卡加速的编码器,编码器指示器下方出现警告行,大意:“No hardware encoder — continuous capture may drop or duplicate frames.”(无硬件编码器——连续捕捉可能丢帧或重复帧);
- Render 按钮保持可用——它只警告、不阻拦;
- 在可用显卡加速的机器上选择H.264,警告消失。
TiXL 的编码器生态是分层级的(详见 ExportVideos.md 的编码器表格):
- H.264 / HEVC使用显卡硬件编码器(NVIDIA NVENC、Intel Quick Sync、AMD AMF),速度快;无硬件时回退到慢速软件编码;
- ProRes / VP9 / AV1 / FFV1依赖软件编码,明显更慢。
UI 逻辑位于 RenderWindow.cs:当TimeRange == Continuous且VideoEncoderAvailabilityCache.Get(codec).Kind != Hardware时,绘制警告。这也解释了为什么实时捕捉强烈建议搭配硬件编码器——帮助文档中专门有一条提示:“Hardware encoding (NVENC / Quick Sync / AMF) is the fast path and matters most for realtime Continuous capture. NVENC needs an NVIDIA driver version 570 or newer.”(NVENC 需要 NVIDIA 驱动 570 或更新版本。)
实战一:Realtime 捕捉——抓取现场输出直到停止
操作(测试步骤 4):
- 设置Range = Continuous、Clock = Realtime、Codec = H.264;
- 开始播放,让输出处于动画中;
- 按下Render(或使用渲染动画快捷键);
- 让输出持续播放几秒,再次按下捕捉控制停止。
预期结果:
- 录制立即开始;底部 footer 用扫动活动段取代进度条,并显示“Capturing… N frames / ”(已捕捉帧数 / 已用时长),数字随时间增长;
- 输出窗口顶部边缘也出现一条细的扫动指示条(OutputWindow.cs 中以约 30% 宽的扫动段绘制);
- 播放保持实时、响应正常——它不会被强制或拖动(test 原文:it is not forced or scrubbed);
- 再次按下捕捉控制后停止并保存文件,状态显示“Captured N frames (…) to …”,回放视频可见刚才屏幕上的实时动态(此模式无音频)。
底层原理:实时捕捉的核心实现是 WriteRealtimeContinuousFrames。它采用**墙钟累加器(wall-clock accumulator)**控制节奏:
- 记录首次写入帧时的
Playback.RunTimeInSecs作为锚点,因此初始化延迟不计入录制时长; - 每帧根据
elapsed * fps - FrameIndex计算应写入的帧数,编辑器刷新率高于目标 FPS 时直接跳过本帧抓取; - 若遇到长时间停顿(弹窗、编辑器暂停),最多补写 4 帧后重新同步墙钟基线,避免用重复帧灌满文件(
maxCatchUpFrames = 4); - 播放时间完全不被接管——这正是实时模式下停止录制时不会把用户的
PlaybackSpeed拉回 0 的原因(RenderProcess.cs)。
实战二:Deterministic 捕捉——逐帧推进直到停止
操作(测试步骤 5):将Clock切换为Deterministic,按下Render,短暂运行后停止。
预期结果:
- 出现同样的活动指示器与 “Capturing…” 读数;
- 时间按目标帧率稳步推进(输出逐帧前进,即使无法实时跟上);
- 停止后保存的视频可正常回放;开启 Export Audio 时包含配乐。
与 Realtime 不同,Deterministic 走的是普通渲染的时间驱动路径:编辑器逐帧驱动时间轴,结果完全可复现(exactly repeatable)。正如 ExportVideos.md 的技术背景所述,确定性导出不是实时过程,遇到异步算子(如从网络加载图片、seek 视频)时 TiXL 会等待其完成再写帧,以速度换取正确性。
停止、保存与取消的差异
连续录制结束后有两种收尾方式,语义不同:
- StopContinuous(正常的“第二次按下”):完成混流、保留文件,并像普通渲染一样自动递增版本号(RenderProcess.cs);
- Cancel:视为放弃,不保留文件。
快捷键行为见 RenderProcess.cs:连续录制进行中再次触发渲染动画快捷键,会调用StopContinuous()而非Cancel()——即第二次按下就是正常的“停止并保存”。
此外,连续录制出错时(如输出文件被其他进程占用)会记录“Continuous capture stopped after an error.”并清理会话(RenderProcess.cs)。
Continuous 选项在保存与重载后保持
操作(测试步骤 6):将Range = Continuous、Clock = Deterministic,保存项目,关闭并重新打开(或重载),再打开 Render To File 窗口的 Source 区块。
预期结果:Range 仍为 Continuous,Clock 仍为 Deterministic。
原理在于渲染设置是按合成(per-composition)持久化的:RenderSettings.Current从当前聚焦合成对象的SymbolUi.RenderSettings读取(RenderSettings.cs),并通过WriteToJson序列化为.t3ui文件中的"RenderExport"属性(RenderSettings.cs)。ContinuousClock与ContinuousFrameRate均为该结构的字段并被CopyFrom完整拷贝,因此选择在保存/重载后自然保留。
当前限制与 Roadmap
- Realtime 模式暂无音频:界面中 “Export Audio” 复选框在实时连续录制下被禁用(RenderWindow.cs),渲染进程也会强制
ExportAudio = false; - 仅支持 Fixed FPS:可变帧率(VFR)在源码中已预留
Variable枚举,但未实现; - 当前导出为 8-bit:HDR 输出(如 EXR 图像序列)与可变帧率连续捕捉在 Roadmap 中列出;
- 实时捕捉依赖硬件编码器保证帧节奏,软件编码时可能出现丢帧/重复帧(界面会警告但允许继续)。
相关文档与源码索引
- 本文所依据的测试集:.tests-manual/continuous-capture.md
- 测试集格式规范(frontmatter、Step 结构、标签约定):.tests-manual/README.md
- 用户帮助文档(编码器表格、Continuous Capture 章节、技术背景):.help/docs/using/ExportVideos.md
- 渲染设置与枚举定义:Editor/Gui/Windows/RenderExport/RenderSettings.cs
- 渲染窗口 UI(Range/Clock 控件、警告、footer):Editor/Gui/Windows/RenderExport/RenderWindow.cs
- 渲染进程(实时墙钟节奏、Stop/Cancel、会话管理):Editor/Gui/Windows/RenderExport/RenderProcess.cs
- 输出窗口扫动指示条:Editor/Gui/Windows/Output/OutputWindow.cs
要点回顾:Continuous 是 TiXL 为“无固定时长”场景设计的第四种 Range 模式;Realtime 模式抓取现场输出、保留播放控制权、仅视频;Deterministic 模式逐帧推进、帧完美且可录音频。录制过程中进度条被扫动活动指示器取代,第二次按下即停止保存,且所有 Continuous 选项会随项目持久化。对现场/VJ 使用,请优先选择支持硬件编码的 H.264/HEVC,以获得平滑的实时捕捉。
【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考