菜单

libobs 核心

相关源文件

libobs 核心是 OBS Studio 的基础库,它提供视频/音频捕获、处理、编码和输出的核心功能。它作为中央框架,管理源、场景、渲染、编码器、输出和服务。本文档解释了 libobs 核心的架构、组件和关键系统。

有关图形等特定子系统的信息,请参阅图形子系统。有关平台特定实现的详细信息,请参阅平台抽象层

核心架构概述

libobs 核心围绕着几个相互关联的系统构建,这些系统协同工作以实现流媒体和录制功能。主要组件如下图所示

源:libobs/obs.h84-97 libobs/obs-internal.h487-520

核心上下文

libobs 中的核心结构是 obs_core 结构体,它是一个全局单例,维护整个 OBS 应用程序的状态。它包含对所有主要子系统的引用,并作为大多数操作的入口点。

源:libobs/obs-internal.h488-520 libobs/obs.c26

初始化和关闭

libobs 核心通过一系列 API 调用进行初始化

  1. obs_startup() - 使用区域设置和模块配置初始化核心上下文
  2. obs_reset_video() - 使用指定的分辨率、FPS 等设置视频子系统
  3. obs_reset_audio() - 使用采样率、声道等配置音频子系统
  4. obs_load_all_modules() - 从模块搜索路径加载插件
  5. obs_post_load_modules() - 完成模块加载

关闭时,obs_shutdown() 释放所有资源并终止 OBS 上下文。

源:libobs/obs.c339-352 libobs/obs.h349-352 libobs/obs.h421-429

源系统

源系统是 OBS 的骨干,管理 OBS 中可以显示或处理的所有类型的内容。源是引用计数对象,可以提供视频、音频或两者。

源类型

源分为四种主要类型

  1. 输入源 - 生成媒体(视频捕获、音频输入等)
  2. 滤镜 - 处理和修改来自其他源的媒体
  3. 转场 - 在多个源之间进行转场
  4. 场景 - 包含并合成多个源

每个源都有一组定义其行为的功能标志

标志描述
OBS_SOURCE_VIDEO源提供视频
OBS_SOURCE_AUDIO源提供音频
OBS_SOURCE_ASYNC源是异步的
OBS_SOURCE_ASYNC_VIDEO源异步提供视频
OBS_SOURCE_CUSTOM_DRAW源使用自定义绘制
OBS_SOURCE_INTERACTION源支持用户交互
OBS_SOURCE_COMPOSITE源合成多个子源

源:libobs/obs-source.h33-38 81-166 53-73

源实现

源通过 obs_source_info 结构体实现,该结构体包含用于各种操作的回调,例如创建、销毁、渲染和处理音频。插件开发者实现这些回调以创建自定义源。

核心通过引用计数管理源的生命周期,允许源在多个场景或滤镜之间共享而无需重复。

主要的源操作包括

  • 创建/销毁(obs_source_createobs_source_destroy
  • 媒体输出(obs_source_output_videoobs_source_output_audio
  • 属性管理(obs_source_propertiesobs_source_update
  • 渲染(obs_source_video_render
  • 滤镜(obs_source_process_filter

源:libobs/obs-source.c118-125 331-410 601-735

场景系统

场景是特殊的源,可以合成多个子源。场景系统管理场景中源的排列、变换和渲染。

场景项

场景项是引用场景中源的对象,并定义其变换(位置、缩放、旋转)以及可见性和裁剪等其他属性。

场景项操作包括

  • 添加/移除项(obs_scene_addobs_sceneitem_remove
  • 设置变换属性(obs_sceneitem_set_posobs_sceneitem_set_scale 等)
  • 设置可见性(obs_sceneitem_set_visible
  • 设置裁剪值(obs_sceneitem_set_crop
  • 设置边界(obs_sceneitem_set_bounds_typeobs_sceneitem_set_bounds

源:25-68 152-185 449-559

编码器系统

编码器系统将原始音频和视频转换为用于流媒体和录制的压缩格式。编码器通过 obs_encoder_info 结构体实现,并由核心管理。

编码器操作包括

  • 创建和初始化(obs_video_encoder_createobs_audio_encoder_create
  • 设置属性(obs_encoder_updateobs_encoder_set_videoobs_encoder_set_audio
  • 启动/停止编码(obs_encoder_startobs_encoder_stop
  • 获取编码包(obs_encoder_get_extra_dataobs_encoder_packet_ref

源:79-124 126-139 20-72

输出系统

输出系统负责将编码后的媒体传输到目的地,例如流媒体服务或本地文件。输出从编码器接收编码包并管理输出过程。

输出操作包括

  • 创建和配置(obs_output_create
  • 设置服务和编码器(obs_output_set_serviceobs_output_set_video_encoderobs_output_set_audio_encoder
  • 启动/停止输出(obs_output_startobs_output_stop
  • 管理延迟(obs_output_set_delay
  • 处理重新连接(obs_output_set_reconnect_settings

源:162-227 325-387 35-137

服务系统

服务系统为流媒体服务提供信息和认证。服务通过 obs_service_info 结构体实现,并由核心管理。

服务操作包括

  • 创建和配置(obs_service_create
  • 设置属性(obs_service_updateobs_service_apply_encoder_settings
  • 获取服务信息(obs_service_get_urlobs_service_get_key

源:38-78 21-47

模块系统

模块系统使 OBS 能够加载扩展其功能的插件。插件是动态加载的库,它们向核心注册源、编码器、输出和服务。

模块操作包括

  • 加载模块(obs_open_moduleobs_init_moduleobs_load_all_modules
  • 查找模块(obs_find_modulesobs_find_module_file
  • 获取模块信息(obs_get_module_nameobs_get_module_authorobs_get_module_description

源:97-146 148-165 473-604

libobs 中的数据流

以下图表说明了数据如何通过 libobs 核心从源捕获流向最终输出。

源:1154-1168 32-87 584-656

核心数据结构

下表显示了 libobs 核心中的关键数据结构

结构描述
obs_core主要的 OBS 上下文结构
obs_core_video视频子系统数据
obs_core_audio音频子系统数据
obs_core_data用户源、输出、显示器
obs_source_t源对象
obs_scene_t场景对象
obs_sceneitem_t场景项对象
obs_output_t输出对象
obs_encoder_t编码器对象
obs_service_t服务对象
obs_module_t模块对象

源:385-519 56-77

API 参考

libobs 核心公开了一个 C API,用于创建、管理和控制 OBS 系统的所有组件。主要 API 类别包括

  • 核心初始化/关闭(obs_startupobs_shutdown
  • 源管理(obs_source_createobs_source_release 等)
  • 场景管理(obs_scene_createobs_scene_add 等)
  • 编码器管理(obs_encoder_createobs_encoder_release 等)
  • 输出管理(obs_output_createobs_output_start 等)
  • 服务管理(obs_service_createobs_service_update 等)
  • 属性和设置(obs_properties_createobs_data_create 等)

源:313-890 419-1219

版本控制

libobs 使用语义版本控制来跟踪 API 兼容性。当前的 API 版本在 obs-config.h 中定义,包括主版本、次版本和修订版本组件。插件检查与此版本的兼容性以确保正常运行。

源:libobs/obs-config.h26-44 libobs/CMakeLists.txt1-418