OBS Studio(Open Broadcaster Software)是一款功能强大的开源应用程序,专为视频录制和直播设计。本文档概述了构成OBS代码库的核心架构、主要组件和关键系统。
本页旨在为希望理解或贡献OBS Studio代码库的开发者介绍其整体结构。它涵盖了高级架构、核心组件以及它们如何协同工作以实现OBS的功能。
来源:libobs/obs.h86-97 libobs/obs-internal.h487-516
OBS Studio 围绕着一个以核心库(libobs)为中心的模块化架构构建,该核心库提供了基本功能。该架构设计为可通过插件系统进行扩展,允许添加新的来源、编码器、输出和服务。
来源:libobs/obs-internal.h487-516 libobs/obs.c25-27 libobs/CMakeLists.txt5-82
libobs 核心库是OBS Studio的基础。它包含了所有基本子系统和功能,包括:
核心由obs_core结构定义,该结构包含OBS实例的所有数据,包括视频、音频、来源、输出、编码器和服务。
来源:libobs/obs.c25-27 libobs/obs-internal.h487-516 libobs/obs.h315-379
OBS媒体管道描述了音频和视频数据如何通过系统从输入流向输出。
来源:libobs/obs-source.c18-163 libobs/obs-encoder.c27-194 libobs/obs-output.c130-227
OBS Studio为其核心对象使用了引用计数对象模型。这使得对象能够在应用程序的不同部分之间安全共享。
| 对象类型 | 描述 | 头文件 | 主结构 |
|---|---|---|---|
| 来源 | 表示输入来源、滤镜、转场和场景 | obs-source.h | obs_source_t |
| 场景 | 包含其他来源的特殊来源类型 | obs-scene.h | obs_scene_t |
| 编码器 | 压缩视频和音频数据 | obs-encoder.h | obs_encoder_t |
| 输出 | 管理直播和录制输出 | obs-output.h | obs_output_t |
| 服务 | 表示直播服务 | obs-service.h | obs_service_t |
所有这些对象都派生自obs_context_data,它提供了引用计数、设置和信号等通用功能。
来源:libobs/obs-internal.h41-76 libobs/obs-internal.h551-610 libobs/obs.h56-76
OBS中的所有主要对象都通过引用计数来管理其生命周期。引用计数机制通过obs_ref_addref和obs_ref_release函数实现。每个对象还具有弱引用机制,允许引用对象而不阻止其销毁。
来源:libobs/obs-internal.h551-610 libobs/obs-source.c737-818
来源系统是OBS中最重要的子系统之一。来源代表任何可以产生视频、音频或两者的内容。这包括捕获来源、媒体文件、文本、浏览器,以及滤镜、转场和场景。
来源具有多种功能,通过以下标志表示:
OBS_SOURCE_VIDEO:该来源具有视频输出OBS_SOURCE_AUDIO:该来源具有音频输出OBS_SOURCE_ASYNC:该来源是异步的OBS_SOURCE_CUSTOM_DRAW:该来源使用自定义绘制OBS_SOURCE_INTERACTION:该来源可以进行交互来源:libobs/obs-source.h33-62 libobs/obs-source.h81-149 libobs/obs-source.c128-134
场景是特殊类型的来源,用于包含和合成其他来源。它们是OBS功能的基础,允许用户创建复杂的来源布局。
场景项代表场景中的来源。每个场景项都具有以下属性:
来源:libobs/obs-scene.h30-64 libobs/obs-scene.c140-185
输出系统负责将最终的视频和音频发送到目的地,无论是直播服务还是本地录制文件。
输出可以启动、停止,并配置编码器和服务。它们负责处理视频和音频编码,并将其打包为适当的目标格式。
来源:libobs/obs-output.c162-227 libobs/obs-output.c325-382
编码器系统负责压缩视频和音频数据以进行直播和录制。OBS支持各种编码器实现:
视频编码器:
音频编码器:
编码器根据输出类型和目标质量进行配置。
来源:libobs/obs-encoder.c78-146 libobs/obs-encoder.c159-183
图形子系统提供了一个统一的API,抽象了不同的图形后端(Direct3D、OpenGL、Metal),以在不同平台提供一致的渲染。
图形系统处理:
来源:libobs-opengl/CMakeLists.txt22-44 libobs/obs-video.c114-237
OBS的功能通过其插件系统高度可扩展。插件可以添加新的来源、编码器、输出和服务。
插件在运行时动态加载。每个插件都会导出函数来初始化、查询功能并提供功能。主要插件函数包括:
obs_module_load:模块加载时调用obs_module_unload:模块卸载时调用obs_module_set_pointer:为插件设置模块指针obs_module_ver:返回模块版本来源:libobs/obs-module.c36-60 libobs/obs-module.c97-146
OBS Studio是一款复杂、模块化的应用程序,围绕着提供基本功能的核心库(libobs)构建。可扩展的插件系统允许在不修改核心代码库的情况下添加新功能。
主要组件——来源、场景、编码器、输出和服务——协同工作以捕获、处理和输出视频和音频数据。图形子系统抽象了平台特定的渲染API,以提供跨平台的一致接口。
理解这些核心概念对于希望为OBS Studio贡献代码或构建扩展其功能的插件的开发者至关重要。