菜单

概述

相关源文件

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 核心库

libobs 核心库是OBS Studio的基础。它包含了所有基本子系统和功能,包括:

  1. 初始化与关闭:启动和关闭OBS上下文的功能
  2. 引用计数:OBS对象的内存管理
  3. 任务调度:在不同线程间调度任务的机制
  4. 平台抽象:抽象平台特定操作的功能

核心由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.hobs_source_t
场景包含其他来源的特殊来源类型obs-scene.hobs_scene_t
编码器压缩视频和音频数据obs-encoder.hobs_encoder_t
输出管理直播和录制输出obs-output.hobs_output_t
服务表示直播服务obs-service.hobs_service_t

所有这些对象都派生自obs_context_data,它提供了引用计数、设置和信号等通用功能。

来源:libobs/obs-internal.h41-76 libobs/obs-internal.h551-610 libobs/obs.h56-76

引用计数

OBS中的所有主要对象都通过引用计数来管理其生命周期。引用计数机制通过obs_ref_addrefobs_ref_release函数实现。每个对象还具有弱引用机制,允许引用对象而不阻止其销毁。

来源:libobs/obs-internal.h551-610 libobs/obs-source.c737-818

源系统

来源系统是OBS中最重要的子系统之一。来源代表任何可以产生视频、音频或两者的内容。这包括捕获来源、媒体文件、文本、浏览器,以及滤镜、转场和场景。

源类型

  1. 输入来源:摄像头、游戏捕获、窗口捕获、媒体文件等。
  2. 滤镜:修改来源的视频或音频
  3. 转场:用于场景之间的过渡
  4. 场景:包含并合成其他来源的特殊来源

来源功能

来源具有多种功能,通过以下标志表示:

  • 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

输出系统

输出系统负责将最终的视频和音频发送到目的地,无论是直播服务还是本地录制文件。

输出类型

  1. 直播输出:将数据发送到直播服务
  2. 录制输出:将数据保存到文件
  3. 虚拟摄像头/麦克风输出:使OBS在其他应用程序中显示为摄像头或麦克风

输出功能

输出可以启动、停止,并配置编码器和服务。它们负责处理视频和音频编码,并将其打包为适当的目标格式。

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

编码器系统

编码器系统负责压缩视频和音频数据以进行直播和录制。OBS支持各种编码器实现:

编码器类型

  1. 视频编码器:

    • x264(软件 H.264)
    • NVENC(NVIDIA 硬件 H.264/HEVC)
    • QuickSync(Intel 硬件 H.264/HEVC)
    • AMD AMF(AMD 硬件 H.264/HEVC)
  2. 音频编码器:

    • AAC(高级音频编码)
    • Opus
    • MP3

编码器根据输出类型和目标质量进行配置。

来源:libobs/obs-encoder.c78-146 libobs/obs-encoder.c159-183

图形子系统

图形子系统提供了一个统一的API,抽象了不同的图形后端(Direct3D、OpenGL、Metal),以在不同平台提供一致的渲染。

图形系统处理:

  1. 纹理管理
  2. 着色器编译和管理
  3. 用于标准渲染操作的效果文件(*.effect)
  4. 绘制操作
  5. 设备丢失和恢复

来源:libobs-opengl/CMakeLists.txt22-44 libobs/obs-video.c114-237

插件系统

OBS的功能通过其插件系统高度可扩展。插件可以添加新的来源、编码器、输出和服务。

插件类型

  1. 来源插件:添加新的视频/音频来源类型
  2. 滤镜插件:添加新的视频/音频滤镜
  3. 编码器插件:添加新的编码方法
  4. 输出插件:添加新的输出目的地
  5. 服务插件:添加新的直播服务集成

插件加载

插件在运行时动态加载。每个插件都会导出函数来初始化、查询功能并提供功能。主要插件函数包括:

  • 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贡献代码或构建扩展其功能的插件的开发者至关重要。