高级主题
本页介绍在通过时间轴深度驱动 OBS 时需要了解的行为:State 分段如何还原、停止时哪些状态会被恢复、性能保护机制,以及如何进行调试。
退出动作(仅限 State 类型)
对于 State 类型的动作(参见 分段类型),可配置分段结束时的行为:
- 不执行任何操作:动作在分段结束后持续生效。
- 自动反向:系统自动生成反向动作(例如,静音 → 取消静音)。
- 自定义退出动作:指定另一个动作来执行。
注意: 自动反向退出动作仅在启用还原且未设置显式退出动作时才会生成。反向播放会颠倒进入/退出语义:分段的”退出”动作将在反向播放时于分段起始处执行。
动画前状态恢复
启用 bRestoreStateOnTearDown 后,轨道会在播放前捕获 OBS 状态,并在以下情况下恢复:
- 序列播放停止时。
- 拖拽预览离开分段时。
- 序列关闭时。
当前已恢复的内容:
- 输出:录制(活跃、暂停)、推流、虚拟摄像头、Replay Buffer。
- 场景:当前直播场景。
- 场景项目:可见性、锁定状态、混合模式(通过 Continuous State tracks)。
- 场景项目变换:位置、缩放、旋转、裁剪(通过 OBS Transform Track)。
- 音频:输入静音状态、输入音量(dB)(通过 OBS Volume Track)、输入平衡(通过 OBS Balance Track)。
- 转场:当前转场、转场时长(通过 OBS Transition Duration Track)。
- 工作室模式:工作室模式是否启用、预览场景。
- 滤镜:滤镜启用状态、滤镜设置值(通过 OBS Filter Setting Track)。
- 来源:文本内容、浏览器 URL、图像文件、媒体文件及循环、颜色(通过 OBS Color Source Track)。
- 媒体:游标位置(通过 OBS Media Cursor Track)。
未恢复的内容(即时动作):
- 录制分割/章节标记、保存 Replay Buffer、推流字幕。
- 媒体输入动作(播放/暂停/停止)、媒体游标位置。
- 工作室模式转场触发。
- 截图(无法撤销已拍摄的截图)。
注意: 动画前恢复使用了防抖处理(约 150ms 冷却时间,按分段而非按输入应用)。在该窗口内结束的两个分段可能会掩盖合法的状态变更。捕获操作针对的是最后缓存的 OBS 状态,而非实时查询,因此可能存在数据过时的情况。请注意,可关键帧轨道的目标(
InputName/来源)位于轨道上,而非分段上。
性能特性
Sequencer 集成包含多项优化:
| 特性 | 说明 |
|---|---|
| 动作队列 | 33ms 节流(约 30fps),确保关键帧动画流畅,同时防止请求泛滥 |
| 去重 | 同一帧内的重复动作会被合并 |
| 批处理请求 | 多个动作作为单次 OBS 请求发送(每批最多 48 个) |
| 防抖恢复 | 150ms 冷却时间,防止拖拽预览期间频繁触发状态恢复 |
| 统一路由 | 所有可关键帧轨道均通过动作队列路由,保证节流/批处理的一致性 |
编辑器通知
当动作执行失败时,编辑器中会出现弹出通知并显示错误详情。主要动作(开始/停止录制、开始/停止推流)的成功通知可按需启用。
使用案例示例
电影级录制
[0:00] StartRecord section
[0:05] SwitchScene("CloseUp") section
[0:15] SwitchScene("WideShot") section
[0:30] StopRecord section
直播节目自动化
[Intro] SwitchScene("TitleCard") + StartStream
[Main] SwitchScene("MainCamera") + UnmuteInput("Mic")
[Outro] SwitchScene("EndCard") + MuteInput("Mic")
[End] StopStream
Replay 精彩片段
[Boss Defeated] SaveReplayBuffer section
[Victory Screen] SwitchScene("Victory") section
C++ 访问
// The Sequencer system uses these key classes:
#include "Sequencer/MovieSceneOBSTrack.h"
#include "Sequencer/MovieSceneOBSSection.h"
#include "Sequencer/InhyeongOBSSequencerTypes.h"
// Action metadata is available via the registry
const FOBSSequencerActionMetadata* Meta = FOBSSequencerActionRegistry::GetMetadata(EOBSSequencerAction::SwitchScene);
if (Meta && Meta->bRequiresTargetName)
{
// This action needs a target name (scene name)
}
// Get all actions in a category
TArray<EOBSSequencerAction> RecordingActions =
FOBSSequencerActionRegistry::GetActionsForCategory(EOBSSequencerActionCategory::Recording);
完整的 EOBSSequencerAction 值列表请参见 动作参考。
Sequencer 故障排除
| 问题 | 解决方法 |
|---|---|
| 动作未触发 | 检查轨道是否被静音。若处于拖拽预览状态,还需确认 bFireActionsWhenScrubbing 已启用。 |
| 轨道头显示红点 | OBS 未连接。请通过 Editor Subsystem 或 OBS Component 进行连接。 |
| 状态未恢复 | 确保轨道上的 bRestoreStateOnTearDown 已启用 |
| 动作触发多次 | 在快速拖拽预览时属正常现象。队列会将最小间隔节流至 33ms。 |
| 弹出通知显示错误 | 检查 OBS 是否正在运行,以及动作参数是否有效 |