OBS Lecture Recording Script
OBS录课妙妙脚本(自动在电脑屏幕与外置摄像头之间切镜头)
- 每隔一段时间采样一次系统范围内的鼠标和键盘输入空闲时长,距最后一次输入不足 X 秒即视为“回来”,切换到活跃场景。
- 无操作持续 X 秒,视为“离开”,切换到离开场景。可选开启屏幕变化检测,若屏幕画面仍在持续变化则会阻止“离开”。
- 打开 OBS → 工具 → 脚本 → “+”,选择本目录里的
activity-scene-switch.lua。 - 在脚本设置里选择(或输入)活跃场景与离开场景,按需调整各项数值。
- 关闭设置窗口即可生效,加载日志与每次切换都会写进“脚本日志”。
| 设置 | 默认 | 说明 |
|---|---|---|
| Active scene (recent input) | 空 | “回来”时切换到的场景 |
| Away scene (no input) | 空 | “离开”时切换到的场景 |
| Check interval (seconds) | 0.2 | 采样间隔 |
| Activity window (seconds) | 0.4 | 距最后一次输入小于该值视为“回来” |
| Idle time before away (seconds) | 10 | 无操作持续多久算“离开” |
| Screen change detection (prevents the away state) | 开 | 画面变化会阻止“离开” |
| Screen capture area | Primary monitor | 对比的画面区域;另一个值是 All monitors |
| Screen compare interval (seconds) | 1 | 画面对比间隔(0.5–60) |
| Screen change threshold (bits of 64) | 6 | dHash 汉明距离达到该值算“画面在变” |
- 只在状态翻转时动作:脚本只会在“离开 → 回来”和“回来 → 离开”两个时机切换场景。手动切换场景后,仅在下次发生状态翻转时脚本才会重新接管。
- 持续画面对比:开启后只要不处于离开状态,就按一定间隔持续对显示器截图,随时刷新“画面安静多久”的计时。只有离开状态期间暂停,回来后重取一次基线。
- 加载时不评估:脚本加载之后发生第一次状态翻转时才开始自动切换场景,而不会在脚本加载好之后立即切换场景。
- 场景缺失:配置的场景在当前场景集合里不存在时,跳过本次切换并在日志里警告。场景恢复存在后,下一次状态翻转即可正常切换。
- 原生转场:切换场景时会使用 OBS 当前的转场配置,可享受到 OBS 的原生转场动画。
- 仅支持 Windows 操作系统,因为依赖
user32.GetLastInputInfo。 - 部分行为不会算作有效输入操作:
- 手柄原生输入不算“操作”,但被 Steam Input、DS4Windows、reWASD 等映射成鼠标键盘的输入会被算作操作。
- 长按鼠标键并保持不动时不会产生新的输入事件;但键盘长按有自动重复事件,不受影响。
- 锁屏与 UAC 安全桌面上的输入可能不计入输入事件。
- 判定是系统级的:任何程序(包括自动化工具、远程桌面)产生的输入都会刷新计时。
- 轮询跑在 OBS 图形线程的帧时刻上,检查间隔是“至少多久”而不是精确定时。
- 屏幕变化检测依赖桌面级 GDI 截图,独占全屏游戏、HDR 输出下可能黑屏或偏色,从而影响检测。
examples/ 里是一份脱敏后的场景集合与配置档案(场景集合与配置档案都叫「讲课」),
install.ps1 可以把它们装到另一台电脑的 OBS 上:
- 关闭 OBS(运行中的 OBS 会在退出时覆盖配置)。
- 在仓库目录里运行
powershell -ExecutionPolicy Bypass -File .\install.ps1; 想先看看会改成什么样就加-DryRun。 - 脚本会自动检测 OBS、必要时从 GitHub 下载本仓库、遇到同名场景或配置时询问是否替换 (替换前备份)、安装并激活,然后把能确定的变量(素材与脚本路径、录制目录)改成本机实际值。
- 按脚本末尾打印的清单手动完成剩下的部分:选显示器、选摄像头、填推流服务器与密钥、 确认麦克风与音频滤镜、开播前检查画面。