本文档概述了 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 初始化过程的主要步骤是:
obs_startup() 初始化核心结构体obs_reset_video() 设置视频系统obs_reset_audio() 设置音频系统obs_load_all_modules() 加载模块obs_post_load_modules() 通知模块来源: libobs/obs.h341-353 libobs/obs.h421-423 libobs/obs.h535-548
视频子系统负责渲染和管理视频帧。它包括图形上下文、帧渲染、转换和同步的处理。
视频子系统具有以下特点:
来源: libobs/obs-internal.h331-382 libobs/obs-video.c32-87 libobs/obs-video.c115-139 libobs/obs.c33-464
音频子系统负责音频处理、混合和与视频的同步。
音频子系统具有以下特点:
来源: libobs/obs-internal.h387-408 libobs/obs.h208-220 libobs/obs-audio.c
源系统是 OBS 最重要的部分之一。源是能够产生音频、视频或两者兼有的对象。它们还可以通过滤镜处理音频/视频。
源被分为几种类型:
每种源类型都通过描述其功能和回调的结构进行注册。
来源:libobs/obs-source.h33-72 libobs/obs-source.h75-247 libobs/obs-source.c75-116 libobs/obs-source.c174-224
场景系统是源系统的扩展,它管理源的集合及其复合。
场景是一种特殊的源,它
场景项具有包括位置、缩放、旋转和对齐在内的变换。
来源:libobs/obs-scene.h libobs/obs-scene.c140-185 libobs/obs-scene.c326-359
编码器系统负责压缩音频和视频数据以进行流传输或录制。
编码器压缩音频和视频数据用于
编码器可以是基于软件的(如x264)或硬件加速的(如NVENC、QuickSync)。
来源:libobs/obs-encoder.h libobs/obs-encoder.c79-124
输出系统负责将编码后的数据传递到流媒体服务、文件或虚拟设备等目标。
输出将编码器连接到目标
输出可以是简单的,也可以是复杂的,具有以下功能:
来源:libobs/obs-output.h libobs/obs-output.c162-227 libobs/obs-output.c325-382
服务系统定义了流媒体目标的配置。
服务提供
来源:libobs/obs-service.h libobs/obs-service.c
模块系统允许 OBS 通过动态加载的插件进行扩展。
模块系统
来源:libobs/obs-module.c36-60 libobs/obs-module.c97-146 libobs/obs-module.c148-165
完整的媒体管道展示了数据如何在 OBS 中从源流向输出。
OBS 中的数据流
这种管道架构在保持效率的同时实现了最大的灵活性。
来源:libobs/obs-source.c1155-1168 libobs/obs-output.c325-382 libobs/obs-encoder.c184-185
OBS 使用引用计数和线程管理的组合来高效处理资源。
内存和线程管理的关键方面
来源:libobs/obs-internal.h553-645 libobs/obs.h865-890
OBS 使用分层配置系统来管理不同级别的设置。
配置系统提供:
所有设置都使用 obs_data_t 系统进行序列化。
来源:libobs/obs-data.h libobs/obs.h861-864
图形系统提供了不同图形 API 的抽象层。
图形系统提供
来源:libobs/graphics/graphics.h libobs-opengl/CMakeLists.txt libobs/obs.c476-475
OBS Studio 被设计为跨多个平台工作,并针对每个平台有特定的实现。
平台实现处理
来源: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
libobs 公开的 API 在对象创建、管理和销毁方面遵循一致的模式。
API 设计包括
来源:libobs/obs.h libobs/obs-source.h libobs/obs-encoder.h libobs/obs-output.h libobs/obs-service.h