菜单

核心架构

相关源文件

本文档概述了 OBS Studio 的核心架构,解释了主要子系统及其关系。本页面重点介绍 OBS 代码库的基本内部结构,并强调各个组件的交互方式。有关插件系统的更多信息,请参阅 插件系统,有关前端详细信息,请参阅 用户界面

概述

OBS Studio 构建于一个名为 libobs 的核心库之上,该库提供了视频/音频处理、源管理、编码和输出的基本功能。该架构遵循模块化设计,允许通过插件进行扩展,同时保持稳定的核心。

来源: libobs/obs-internal.h488-518 libobs/obs.h482-516 libobs/obs.c26-27

核心结构

OBS Studio 的核心是 obs_core 结构体,这是一个全局单例,包含并管理所有子系统。它在 obs-internal.h 中声明,并在 obs.c 中实例化为全局变量。

来源: libobs/obs-internal.h488-518 libobs/obs-internal.h380-409 libobs/obs-internal.h331-382 libobs/obs-internal.h410-448 libobs/obs.c26-27

初始化过程

OBS 的初始化由 obs_startup() 函数处理,该函数初始化核心子系统。此函数分配并设置全局 obs 结构体及其所有组件。

OBS 初始化过程的主要步骤是:

  1. 使用 obs_startup() 初始化核心结构体
  2. 使用 obs_reset_video() 设置视频系统
  3. 使用 obs_reset_audio() 设置音频系统
  4. 使用 obs_load_all_modules() 加载模块
  5. 使用 obs_post_load_modules() 通知模块

来源: libobs/obs.h341-353 libobs/obs.h421-423 libobs/obs.h535-548

视频子系统

视频子系统负责渲染和管理视频帧。它包括图形上下文、帧渲染、转换和同步的处理。

视频子系统具有以下特点:

  1. 图形抽象:一个平台无关的图形 API,抽象了 OpenGL、Direct3D 和 Metal。
  2. 视频混合器:多个视频上下文,可以渲染不同的场景。
  3. 帧转换:不同视频格式之间的转换。
  4. 帧同步:用于同步渲染的时序机制。

来源: libobs/obs-internal.h331-382 libobs/obs-video.c32-87 libobs/obs-video.c115-139 libobs/obs.c33-464

音频子系统

音频子系统负责音频处理、混合和与视频的同步。

音频子系统具有以下特点:

  1. 音频混合:混合多个音频源。
  2. 音频缓冲:缓冲以实现平滑的音频播放。
  3. 音频监控:监控音频输出。
  4. 音频/视频同步:保持音频和视频同步的机制。

来源: libobs/obs-internal.h387-408 libobs/obs.h208-220 libobs/obs-audio.c

源系统

源系统是 OBS 最重要的部分之一。源是能够产生音频、视频或两者兼有的对象。它们还可以通过滤镜处理音频/视频。

源被分为几种类型:

  1. 输入源:生成音频/视频内容(例如,捕获源、媒体)。
  2. 滤镜源:处理来自其他源的音频/视频。
  3. 过渡源:处理场景之间的过渡。
  4. 场景源:包含并合成其他源。

每种源类型都通过描述其功能和回调的结构进行注册。

来源:libobs/obs-source.h33-72 libobs/obs-source.h75-247 libobs/obs-source.c75-116 libobs/obs-source.c174-224

场景系统

场景系统是源系统的扩展,它管理源的集合及其复合。

场景是一种特殊的源,它

  1. 包含其他源作为场景项
  2. 管理它们的空间布局
  3. 控制它们的可见性
  4. 处理用户与源的交互
  5. 管理源的图层/顺序

场景项具有包括位置、缩放、旋转和对齐在内的变换。

来源:libobs/obs-scene.h libobs/obs-scene.c140-185 libobs/obs-scene.c326-359

编码器系统

编码器系统负责压缩音频和视频数据以进行流传输或录制。

编码器压缩音频和视频数据用于

  1. 流传输:用于流媒体平台的实时编码
  2. 录制:本地文件录制
  3. 虚拟摄像头/麦克风:系统级虚拟设备

编码器可以是基于软件的(如x264)或硬件加速的(如NVENC、QuickSync)。

来源:libobs/obs-encoder.h libobs/obs-encoder.c79-124

输出系统

输出系统负责将编码后的数据传递到流媒体服务、文件或虚拟设备等目标。

输出将编码器连接到目标

  1. 流输出:将数据发送到流媒体服务
  2. 录制输出:将数据写入文件
  3. 虚拟摄像头/麦克风输出:将 OBS 输出公开为系统设备

输出可以是简单的,也可以是复杂的,具有以下功能:

  • 延迟输出用于流缓冲
  • 自动重连
  • 统计数据跟踪

来源:libobs/obs-output.h libobs/obs-output.c162-227 libobs/obs-output.c325-382

服务系统

服务系统定义了流媒体目标的配置。

服务提供

  1. 服务器 URL 和流密钥
  2. 身份验证信息
  3. 特定于服务的设置
  4. 服务功能信息

来源:libobs/obs-service.h libobs/obs-service.c

模块/插件系统

模块系统允许 OBS 通过动态加载的插件进行扩展。

模块系统

  1. 在启动时加载插件库
  2. 解析并调用插件入口点
  3. 将插件功能注册到 OBS
  4. 管理插件的生命周期和资源

来源:libobs/obs-module.c36-60 libobs/obs-module.c97-146 libobs/obs-module.c148-165

媒体管道与数据流

完整的媒体管道展示了数据如何在 OBS 中从源流向输出。

OBS 中的数据流

  1. 生成原始音频/视频或处理现有数据
  2. 场景 将多个源组合在一起
  3. 滤镜 处理音频/视频以实现效果或调整
  4. 编码器 压缩数据以实现高效传输
  5. 输出 将编码后的数据发送到目标

这种管道架构在保持效率的同时实现了最大的灵活性。

来源:libobs/obs-source.c1155-1168 libobs/obs-output.c325-382 libobs/obs-encoder.c184-185

内存和线程管理

OBS 使用引用计数和线程管理的组合来高效处理资源。

内存和线程管理的关键方面

  1. 对所有主要对象(源、编码器等)进行引用计数
  2. 用于视频、音频和 UI 操作的线程特定任务
  3. 用于安全跨线程操作的任务队列
  4. 弱引用以防止循环引用
  5. 互斥量系统以防止竞态条件

来源:libobs/obs-internal.h553-645 libobs/obs.h865-890

配置与设置

OBS 使用分层配置系统来管理不同级别的设置。

配置系统提供:

  1. 适用于整个应用程序的全局设置
  2. 用于不同输出配置的配置文件特定设置
  3. 用于不同场景和源的场景集合设置
  4. 用于单个源、滤镜等的对象特定设置

所有设置都使用 obs_data_t 系统进行序列化。

来源:libobs/obs-data.h libobs/obs.h861-864

图形抽象层

图形系统提供了不同图形 API 的抽象层。

图形系统提供

  1. 可在 Windows、macOS 和 Linux 上运行的平台无关 API
  2. 一致的资源管理,用于纹理、着色器等
  3. 用于复杂渲染操作的效果框架
  4. 用于变换和投影的矩阵运算

来源:libobs/graphics/graphics.h libobs-opengl/CMakeLists.txt libobs/obs.c476-475

跨平台实现

OBS Studio 被设计为跨多个平台工作,并针对每个平台有特定的实现。

平台实现处理

  1. 模块加载(DLL、共享对象、dylib)
  2. 文件操作(文件系统访问)
  3. 进程管理(子进程创建/监控)
  4. 线程原语(互斥锁、信号量)
  5. 特定平台 API(DirectShow、AVFoundation 等)

来源:libobs/util/platform-windows.c65-136 libobs/util/platform-cocoa.m libobs/util/platform-nix.c68-111 libobs/obs-windows.c32-62 libobs/obs-cocoa.m libobs/obs-nix.c

核心 API 设计

libobs 公开的 API 在对象创建、管理和销毁方面遵循一致的模式。

API 设计包括

  1. 引用计数用于内存管理
  2. 属性访问用于配置
  3. 控制函数用于状态管理
  4. 查询函数用于对象发现
  5. 信号/回调系统用于事件处理

来源:libobs/obs.h libobs/obs-source.h libobs/obs-encoder.h libobs/obs-output.h libobs/obs-service.h