首页
/ OBS Studio 场景集编辑的命令行化实践:解读 CLI-Anything 中基于 JSON 场景集的 OBS CLI Harness

OBS Studio 场景集编辑的命令行化实践:解读 CLI-Anything 中基于 JSON 场景集的 OBS CLI Harness

2026-09-08 23:29:39作者:谭伦延

导读

本文以 CLI-Anything 仓库中 OBS Studio 的 agent-harness 文档(obs_studio/README.md)为核心,介绍一套**无需安装 OBS Studio 即可离线编辑场景集(scene collection)**的"有状态"命令行接口:它把 OBS 的推流/录播工程抽象成一份 JSON 工程文件,通过 project / scene / source / filter / audio / transition / output / session 八组命令完成从建工程、加摄像头、挂绿幕滤镜、排版画面到配置 Twitch 推流的全流程。读完本文,你将掌握:这套 CLI 的安装与双模式(一次性命令 / 交互式 REPL)用法、JSON 场景集文件结构与校验规则、全部资源类型与滤镜参数表,以及其"会话快照 + 撤销/重做"机制在源码中的实现方式,可直接迁移到 Agent 自动化或脚本化 OBS 场景编排场景。

OBS Harness 定位:把"场景集"变成可编程的 JSON 文档

在传统工作流中,搭建一个直播画面需要人工在 OBS 图形界面中逐一添加场景、来源与滤镜。而 CLI-Anything 中 OBS Studio 模块的做法是:将整个场景集(scenes、sources、filters、audio、transitions、streaming/recording 配置)序列化为一份 JSON 工程文件,用命令行对这份文档做增删改查,遵循与 Blender CLI harness 相同的设计模式,且编辑过程不需要本机安装 OBS StudioREADME 首段)。测试文件也明确注明 "All tests run without OBS Studio installed",全链路可在无 OBS 环境中验证。

从源码结构看,主入口 obs_studio_cli.py 是一个 Click 命令组(cli group),真正的业务逻辑被拆到 core/ 下的 project / scenes / sources / filters / audio / transitions / output / session 八个模块中,命令层只负责参数解析与调用 core 层函数,这种分层让同一套逻辑既可被 CLI 调用,也可被上层技能(skills/SKILL.md)或 Agent 直接复用。

关键概念

  • Scene Collection(场景集):一个包含全部场景、来源与设置的工程文件(.json),即本 CLI 中 project 的操作对象;
  • Scene(场景):若干来源的组合,推流时可在场景间切换;
  • Source(来源):放在场景中的视频/音频/图像元素,如摄像头、显示器捕获、浏览器源;
  • Filter(滤镜):作用在某个来源上的视频或音频处理效果(如色度键抠像、降噪);
  • Transition(转场):场景切换时的视觉效果;
  • Audio Source(全局音频源):独立于场景的全局音频输入/输出,支持音量、静音与监听控制。

安装与运行方式

依赖与安装

仓库为独立打包的 cli-anything-obs-studio 包,配置见 setup.py:Python 要求 >=3.10,运行时依赖 click>=8.0.0prompt-toolkit>=3.0.0,dev 依赖包含 pytest>=7.0.0。README 给出的最小安装命令为:

pip install click prompt_toolkit

按包方式安装(skills/SKILL.md 亦采用该方式):

pip install -e .        # 在 obs-studio/agent-harness 目录下,可编辑安装
# 或安装发布包
pip install cli-anything-obs-studio

入口点差异说明

README 中的示例命令写作 python3 -m cli.obs_cli,这是 CLI-Anything 各 harness 的统一历史调用名。按当前仓库实际结构,模块真实入口位于 obs_studio_cli.py,同时 setup.py 注册了控制台脚本 cli-anything-obs-studio。因此实际运行时可选用:

# 在仓库 obs-studio/agent-harness 目录下,以模块方式运行(等价于 README 的 -m cli.obs_cli)
python3 -m cli_anything.obs_studio.obs_studio_cli --help

# 安装后使用 console script
cli-anything-obs-studio --help

# 不带子命令时直接进入 REPL
cli-anything-obs-studio

下文示例沿用文档中的 python3 -m cli.obs_cli 写法以保持与文档一致,你在本仓库运行时可替换为上面对应命令。全局帮助可用 cli-anything-obs-studio --help,REPL 内输入 help 可查看全部命令组速查表(_repl_help 定义于 obs_studio_cli.py)。

快速开始:十分钟搭好一套"主场景 + 摄像头 + 绿幕"工程

新建工程并添加来源与滤镜

以下是文档给出的完整引导命令,可逐条照抄运行(除首条外均通过 --project 指定工程文件,形成"改完即存"的链式编辑):

# Create a new project
python3 -m cli.obs_cli project new --name "my_stream" -o project.json

# Add sources
python3 -m cli.obs_cli --project project.json source add video_capture --name "Camera"
python3 -m cli.obs_cli --project project.json source add display_capture --name "Game"

# Add filters
python3 -m cli.obs_cli --project project.json filter add chroma_key -S 0 -p similarity=400

# Add scenes
python3 -m cli.obs_cli --project project.json scene add --name "BRB"

# Configure streaming
python3 -m cli.obs_cli --project project.json output streaming --service twitch --key "your_key"

# Save
python3 -m cli.obs_cli --project project.json project save

值得注意的细节:

  • project new 支持 --width/--height/--fps/--encoder,默认分别为 1920×1080 / 30 / x264;底层 project.py 的 create_project 会对分辨率(须为正数)、码率(video ≥100、audio ≥32)与编码器(白名单 x264, x265, nvenc, qsv, amd, svt-av1)做校验;
  • source add-S 实际指 --settingkey=value 形式),而 filter add-S--source(来源下标)、-p--param。两者含义不同,使用时注意区分;
  • filter add-S 0 表示把滤镜挂到场景中下标为 0 的来源上;-p similarity=400 的取值会自动做类型推断(含小数点转 float,否则转 int),随后由 filters.py 的 _validate_filter_params 校验并填充默认参数。

如果工程尚未指定文件,最后一条 project save 会由 Session.save_session() 写回磁盘;若此前每条命令都带了 --project,则命令退出时由 cli 组的 result_callbackauto_save_on_exit自动保存被修改过的状态(详见下文"有状态会话"一节)。

在场景中摆放画面:transform 与 set

source set 可修改来源属性,source transform 可做几何变换,参数为位置/尺寸/裁剪四元组(见 obs_studio_cli.py):

# 设置属性:name / visible / locked / opacity / rotation
python3 -m cli.obs_cli --project project.json source set 0 visible false
python3 -m cli.obs_cli --project project.json source set 0 opacity 0.8

# 几何变换:位置 x,y;尺寸 宽x高;裁剪 top,bottom,left,right;旋转(度)
python3 -m cli.obs_cli --project project.json source transform 0 -p 100,200 --size 1280x720 --crop 0,0,10,10 -r 15

# 也可带来源类型专属参数添加,例如图片来源的 file 设置
python3 -m cli.obs_cli --project project.json source add image --name "Overlay" -S file=/path/to/overlay.png

对应的 core 层 sources.py 中:set_source_property 只接受上述五个白名单属性,其中 opacityvalidate_range 限定在 0.0~1.0transform_sourcevalidate_position / validate_size / validate_crop(定义于 utils/obs_utils.py)联动,对位置的非有限值(NaN/Inf)与尺寸、裁剪的负值直接抛错——仓库为此还单独准备了 test_validate_geometry_nan.pytest_validate_range_nan.py 对非有限数值做回归保护。

JSON 输出模式与三个全局选项

所有命令默认输出人眼友好的缩进文本(嵌套 dict/list 由 _print_dict/_print_list 渲染);加全局 --json 标志后,统一输出结构化 JSON,便于 Agent 解析:

python3 -m cli.obs_cli --json project new -o project.json
python3 -m cli.obs_cli --json --project project.json source list

--json 外,入口还支持另外两个全局选项(obs_studio_cli.py):

全局选项 作用
--project <path> 打开既有 JSON 场景集文件作为当前工程(对应 project open
--json 以 JSON 输出结构化结果
--dry-run 只执行不改写磁盘:auto_save_on_exit 会跳过自动保存

错误处理也遵循同样的双通道约定:handle_error 装饰器捕获 FileNotFoundError / ValueError / IndexError / RuntimeError / FileExistsError,JSON 模式下输出 {"error": ..., "type": ...},普通模式输出到 stderr;一次性命令失败会 sys.exit(1),REPL 内则仅打印错误不退出。skills/SKILL.md 对 Agent 调用给出的最佳实践是:始终携带 --json、检查返回码、从 stderr 读错误、文件操作用绝对路径。

交互式 REPL:带历史记录的"OBS 控制台"

不带子命令运行(或显式 repl 子命令)即进入交互式 REPL,可预加载工程:

python3 -m cli.obs_cli repl
python3 -m cli.obs_cli repl --project project.json

REPL 实现位于 obs_studio_cli.pyrepl 命令:通过 prompt-toolkit 提供输入提示(提示符会实时显示当前工程名,来自 _get_project_name),内部用 shlex.split 切词后把每一行原样交给 Click 命令组执行。支持 help 查看命令速查、quit/exit/q 退出,Ctrl+C/Ctrl+D 安全离开。由于每个 REPL 命令天然共享同一个 Session 单例,你可以在一个会话里连续执行"加来源 → 挂滤镜 → 撤销 → 重做",实时观察状态变化——这正是"有状态 CLI"与逐条跑一次性命令的核心差异。

命令组速查与逐组详解

以下为完整命令矩阵(与文档一致),随后按组展开参数与校验细节。

Project Management(工程管理)

project new   - Create a new scene collection
project open  - Open an existing project file
project save  - Save the current project
project info  - Show project information
project json  - Print raw project JSON
  • project new [-n name] [-w width] [-h height] [--fps N] [--encoder E] [-o path]:底层 create_project 校验参数后返回默认结构;-o 指定保存路径;
  • project open <path>open_project 要求文件存在且含 versionscenes 字段,否则抛错;
  • project infoget_project_info 汇总分辨率、帧率、编码器、场景/来源/转场/音频源计数、当前活动场景与推流/录播配置——这是 Agent 了解工程概貌的首选入口;
  • project json:原样打印整个工程字典(indent=2)。

Scene Management(场景管理)

scene add        - Add a new scene
scene remove     - Remove a scene by index
scene duplicate  - Duplicate a scene
scene set-active - Set the active scene
scene list       - List all scenes

场景模型很简单(scenes.py):{id, name, sources[]}。三个值得记录的约束:

  • 不允许删除最后一个场景remove_scene 会抛 ValueError),且删除后会自动修正 active_scene 下标;
  • 重名场景会被 unique_name 自动追加序号(如 BRB.001)——该去重工具在来源、滤镜、音频源、转场中通用,实现见 utils/obs_utils.py 的 unique_name
  • scene duplicate 深拷贝整场景,并为副本内每个来源重新分配 ID,保证两份场景的来源相互独立。

Source Management(来源管理)

source add       - Add a source (video_capture, display_capture, image, text, browser, etc.)
source remove    - Remove a source by index
source duplicate - Duplicate a source
source set       - Set a source property (name, visible, locked, opacity, rotation)
source transform - Transform a source (position, size, crop, rotation)
source list      - List all sources in a scene

source add 的子命令位置参数是来源类型,由 Click Choice 限定在 sources.py 的 SOURCE_TYPES 注册表内;--scene/-s 指定来源落到哪个场景(默认下标 0)。每个来源默认携带完整骨架:visible/locked/position/size/crop/rotation/opacity(1.0)/filters[]/settings,其中 settings 会被来源类型默认值预填(详见下文"Source Types")。不支持的来源类型、越界下标、非法 opacity 均会得到明确报错。

Filter Management(滤镜管理)

filter add            - Add a filter to a source
filter remove         - Remove a filter
filter set            - Set a filter parameter
filter list           - List filters on a source
filter list-available - List all available filter types

filter add <type> -S <source_index> -s <scene_index> [-n name] -p key=value。滤镜参数由 filters.py 的 FILTER_TYPES 注册表定义 schema(类型 + 默认值 + 范围/枚举),_validate_filter_params 会:拒绝未知参数、把 float/int/bool 型参数换算并做范围校验、把 str 型参数与枚举 values 比对、对未提供的参数自动补默认值。filter set 单参数更新同样走这套校验。filter list-available -c video|audio 可按类别过滤,返回每类滤镜的名称与参数清单。

Audio Management(音频管理)

audio add     - Add a global audio source
audio remove  - Remove an audio source
audio volume  - Set volume (0.0-3.0)
audio mute    - Mute an audio source
audio unmute  - Unmute an audio source
audio monitor - Set audio monitoring type
audio list    - List all audio sources

音频源是全局级的(挂在工程顶层 audio_sources[],不属于某个场景),数据结构在 audio.py 中为 {id, name, type(input|output), device, volume, muted, monitor, balance, sync_offset, filters[]}。文档强调的音量范围 0.0-3.0(1.0 即 100%)由 validate_range 强制;monitor 三态为 none / monitor_only / monitor_and_output。core 层还预留了 balance(-1.0~1.0 立体声平衡)与 sync_offset(毫秒)两个未暴露到 CLI 的能力位,说明该模型可向后扩展。

Transition Management(转场管理)

transition add        - Add a transition
transition remove     - Remove a transition
transition set-active - Set the active transition
transition duration   - Set transition duration
transition list       - List all transitions

转场类型注册表(transitions.py)共 7 种,add 不带 -d 时会采用类型默认时长:

类型 默认时长(ms) 类型 默认时长(ms)
cut 0 stinger 1000
fade 300 fade_to_color 300
swipe 500 luma_wipe 500
slide 500

与场景一致,转场也不允许删除最后一个,且时长必须为非负。活动转场记录在工程的 active_transition 下标中。

Output Configuration(输出配置)

output streaming - Configure streaming settings
output recording - Configure recording settings
output settings  - Configure encoder/resolution/bitrate
output info      - Show current output configuration
output presets   - List available encoding presets

output.py 维护三块配置,均带白名单校验:

  • output streaming --service {twitch,youtube,facebook,custom} [--server] [--key],service 非法即报错;
  • output recording --path --format {mkv,mp4,mov,flv,ts} --quality {low,medium,high,lossless}
  • output settings 直接覆盖分辨率/fps/双码率/编码器,或通过 --preset 一键套用预置。

内置 8 个编码预置(ENCODING_PRESETS,可用 output presets 查看):

preset encoder video bitrate audio bitrate
ultrafast x264 2500 128
fast x264 4500 160
balanced x264 6000 160
quality x264 8000 192
high_quality x264 12000 320
nvenc_fast nvenc 6000 160
nvenc_quality nvenc 10000 192
recording_high x264 20000 320

注意 output settings --preset 会一次性写入 encoder + 双码率;若随后再单独给 --video-bitrate 等,则单值覆盖保留 preset 的其余字段(E2E 测试 "Apply preset then override single setting" 验证了该行为)。

Session(会话状态管理)

session status  - Show session status
session undo    - Undo the last operation
session redo    - Redo the last undone operation
session history - Show undo history

session status 输出 {has_project, project_path, modified, undo_count, redo_count, project_name}session history 列出撤销栈中每条操作的描述与时间戳。详见下文"有状态会话与撤销/重做"一节。

JSON 场景集文件格式:一份完整样例与字段说明

文档给出的 JSON 场景集是 CLI 操作的本质对象。结合 project.py 的 _default_projectsave_session 的写入逻辑(后者以 sort_keys=True、独占文件锁 fcntl.flock 原子写盘),一份典型的 project.json 结构如下:

{
  "version": "1.0",
  "name": "my_stream",
  "settings": {
    "output_width": 1920,
    "output_height": 1080,
    "fps": 30,
    "video_bitrate": 6000,
    "audio_bitrate": 160,
    "encoder": "x264"
  },
  "scenes": [
    {
      "id": 0,
      "name": "Main Scene",
      "sources": [
        {
          "id": 0, "name": "Camera", "type": "video_capture",
          "visible": true, "locked": false,
          "position": {"x": 0, "y": 0},
          "size": {"width": 1920, "height": 1080},
          "crop": {"top": 0, "bottom": 0, "left": 0, "right": 0},
          "rotation": 0, "opacity": 1.0,
          "filters": [], "settings": {}
        }
      ]
    }
  ],
  "transitions": [
    {"name": "Cut", "type": "cut", "duration": 0},
    {"name": "Fade", "type": "fade", "duration": 300}
  ],
  "active_scene": 0,
  "audio_sources": [],
  "streaming": {"service": "twitch", "server": "auto", "key": ""},
  "recording": {"path": "./recordings/", "format": "mkv", "quality": "high"}
}

顶层各键对应关系一目了然:settingsoutput settingsscenes[].sources[] ↔ 场景内来源(含滤镜内嵌);transitions[] + active_transition ↔ 转场;active_scenescene set-activeaudio_sources[] ↔ 全局音频;streaming/recording ↔ 推流与录播配置。保存时 save_project/save_session 还会刷新 metadata.modified 时间戳,project new 写入 metadata.created/software 便于溯源。由于全格式均为合法 JSON,你可以手工编辑这份文件后直接 project open 加载,或先改文件再配合 CLI 增补内容,二者天然互通。

有状态会话与撤销/重做机制:源码视角

"有状态"是本 CLI 的灵魂,全部由 core/session.py 的 Session 类承担:

  • 快照(snapshot):每个变更型命令执行前都会先调用 sess.snapshot(描述),把当前工程的深拷贝连同描述与 ISO 时间戳压入 _undo_stack,同时清空 redo 栈并把 _modified 置位;
  • 撤销/重做undo() 将当前状态存入 redo 栈后弹出 undo 栈顶部恢复工程;redo() 方向相反。两者互为镜像,保证撤销后可完整重做;
  • 上限MAX_UNDO = 50,超限时最老的快照被丢弃(list_history/E2E 测试均覆盖);
  • 自动保存:一次性命令模式下,obs_studio_cli.pyauto_save_on_exitcli.result_callback)在命令返回后检查 has_project() and _modified and project_path,命中即静默落盘;--dry-run 或 REPL 内不触发该自动保存,REPL 中需手动 project save
  • 原子写盘_locked_save_jsonfcntl.flock(LOCK_EX) 加排它锁后 seek/truncate/写入,避免并发进程互相覆盖,非 Linux 平台自动降级为普通写。

配合场景/来源/滤镜/音频各模块"变更前先 snapshot"的约定,一条 session undo 就能回滚最近一次"加来源""改音量""挂滤镜"等操作,这让长流程的 Agent 任务具备了可逆性。

Source Types 与 Filter Types:两张完整注册表

来源类型(sources.py 的 SOURCE_TYPES

文档列出的 12 种来源及各自默认 settings

来源类型 类别 默认设置
video_capture video device="", resolution="1920x1080", fps=30
display_capture video display=0, capture_cursor=True
window_capture video window="", capture_cursor=True
image media file="", unload_when_hidden=True
media media local_file="", looping=False, restart_on_activate=True
browser web url="", width=800, height=600, css=""
text text text="", font="Sans Serif", size=36, color="#FFFFFF"
color utility color="#000000", width=1920, height=1080
audio_input audio device=""
audio_output audio device=""
group utility items=[]
scene utility scene_name=""

添加时若省略 --name,将自动取该类型的 label(如 Video Capture Device)并经 unique_name 去重;重复同名会得到 xxx.001 后缀。

滤镜类型(filters.py 的 FILTER_TYPES

文档列出的 13 种滤镜中,7 个为视频类、5 个为音频类,各参数的范围/默认值如下(这正是 filter set_validate_filter_params 的校验依据):

滤镜 类别 可用参数(默认 / 范围)
color_correction video gamma 0.0 [-3,3];contrast 0.0 [-4,4];brightness 0.0 [-1,1];saturation 0.0 [-1,5];hue_shift 0.0 [-180,180];opacity 1.0 [0,1]
chroma_key video key_color_type ∈ {green,blue,magenta,custom};similarity 400 [1,1000];smoothness 80 [1,1000];spill 100 [1,1000]
color_key video key_color "#00FF00";similarity 400 [1,1000];smoothness 80 [1,1000]
lut video path "";amount 1.0 [0,1]
image_mask video path "";type ∈ {alpha, blend}
crop_pad video top/bottom/left/right 0 [0,8192]
scroll video speed_x 0.0 [-5000,5000];speed_y 0.0 [-5000,5000];loop True
sharpen video sharpness 0.08 [0,1]
noise_suppress audio method ∈ {rnnoise, speex, nvafx};suppress_level -30 [-60,0]
gain audio db 0.0 [-30,30]
compressor audio ratio 10.0 [1,32];threshold -18.0 [-60,0];attack 6ms [1,500];release 60ms [1,1000];output_gain 0.0 [-30,30]
noise_gate audio open_threshold -26.0 [-96,0];close_threshold -32.0 [-96,0];attack 25 [1,500];hold 200 [1,1000];release 150 [1,1000]
limiter audio threshold -6.0 [-60,0];release 60 [1,1000]

典型组合示例(来自 E2E 工作流):直播摄像头通常挂 chroma_key(绿幕)+ color_correction;人声轨则按 noise_suppress → noise_gate → compressor → gain → limiter 的 5 级链式顺序叠加,滤镜顺序即处理顺序,filter list/E2E 测试均验证了"从链中间删除滤镜会保持其余顺序不变"。

架构总览与测试体系

分层目录

文档给出的架构(结合仓库实际包路径):

obs-studio/agent-harness/
├── setup.py                                  # 打包:cli-anything-obs-studio,入口 console script
├── OBS.md                                    # 标准操作流程 (SOP) 文档
└── cli_anything/obs_studio/
    ├── obs_studio_cli.py                     # 主 CLI 入口(Click 命令组 + REPL)
    ├── core/
    │   ├── project.py                        # 工程 create/open/save/info + 默认 JSON 结构
    │   ├── scenes.py                         # 场景管理(含 active_scene 维护)
    │   ├── sources.py                        # 来源管理 + SOURCE_TYPES 注册表
    │   ├── filters.py                        # 滤镜管理 + FILTER_TYPES 注册表 + 参数校验
    │   ├── audio.py                          # 全局音频管理(volume/mute/monitor)
    │   ├── transitions.py                    # 转场管理 + TRANSITION_TYPES 注册表
    │   ├── output.py                         # 推流/录播/编码配置 + ENCODING_PRESETS
    │   └── session.py                        # Session:快照、undo/redo、原子保存
    ├── utils/
    │   ├── obs_utils.py                      # generate_id/unique_name/validate_* 等工具
    │   └── repl_skin.py                      # REPL 外观(banner/提示/帮助渲染)
    ├── skills/SKILL.md                       # 面向 Agent/LLM 的技能描述
    └── tests/
        ├── test_core.py                      # 单测:project/scenes/sources/filters/audio/transitions/output/session
        ├── test_full_e2e.py                  # E2E:完整推流工作流 + 撤销/重做 + 边界用例
        ├── test_validate_geometry_nan.py     # 位置/尺寸/裁剪的非有限数值回归
        └── test_validate_range_nan.py        # 范围校验的非有限数值回归

命令层 → core 层 → utils 层的单向依赖非常清晰:core 模块不依赖 Click,因而可被独立单测;utils 提供 ID 分配、去重、索引越界检查(get_item 会精确报出 "index out of range (0-N)")与各类数值校验。

运行测试

文档给出的运行方式为(在 agent-harness 目录下执行;仓库实际包路径见下):

# 全部测试(含单测 + E2E + NaN 回归)
python3 -m pytest cli_anything/obs_studio/tests/ -v

# 仅核心单测
python3 -m pytest cli_anything/obs_studio/tests/test_core.py -v

# 仅端到端测试
python3 -m pytest cli_anything/obs_studio/tests/test_full_e2e.py -v

测试规模与覆盖要点:

  • test_core.py 覆盖八个模块的单元级约束(如拒绝负分辨率/越界 opacity/非法编码器、禁止删除最后一个场景、opacity 上限、撤销栈上限),tests/TEST.md 的实测记录为 153 passed in 0.19s117 + 36 分别来自两个主测试文件);
  • test_full_e2e.py 按完整工作流组织:4 场景 + 摄像头/显示器捕获/覆盖层 + Twitch 推流 + balanced 预置的"全套直播工程"、摄像头绿幕链路、音频调音台、4 层来源叠加、滤镜链、20 场景大工程、保存/加载往返等;
  • 另两个测试文件专门保障几何与范围校验对 NaN/Infinity 的防御,呼应 utils/obs_utils.py_finite_number/_finite_int 的"拒绝非有限值"设计。

所有测试均运行在纯内存的合成工程数据上,README 与 TEST.md 都强调:完整测试不需要安装 OBS Studio

结语:把 OBS 工程变成 Agent 可编排的文档

回到本文主题:CLI-Anything 中这个 OBS Studio harness 的核心贡献,是把"OBS 图形化布景"压缩成一张结构清晰、可校验、可版本化的 JSON 场景集,再以 8 组命令 + 双输出模式 + 50 步撤销栈把它变成任何脚本或 Agent 都能安全驱动的一等公民。无论你想做推流前的自动化布景、直播工程的 Git 化管理,还是把"建场景 → 加摄像头 → 挂绿幕 → 配推流"固化为可复现流程,都可以直接参照本文的命令序列与参数表,并借助仓库内 core/ 的源码与 tests/ 的测试来验证自己的编排逻辑——而这一切都无需本机安装 OBS。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
docsdocs
暂无描述
Markdown
899
5.83 K
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.76 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
860
1.35 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
925
1.85 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.84 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
533
601
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.37 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
395
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.04 K
525