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 调用进行初始化
obs_startup() - 使用区域设置和模块配置初始化核心上下文obs_reset_video() - 使用指定的分辨率、FPS 等设置视频子系统obs_reset_audio() - 使用采样率、声道等配置音频子系统obs_load_all_modules() - 从模块搜索路径加载插件obs_post_load_modules() - 完成模块加载关闭时,obs_shutdown() 释放所有资源并终止 OBS 上下文。
源:libobs/obs.c339-352 libobs/obs.h349-352 libobs/obs.h421-429
源系统是 OBS 的骨干,管理 OBS 中可以显示或处理的所有类型的内容。源是引用计数对象,可以提供视频、音频或两者。
源分为四种主要类型
每个源都有一组定义其行为的功能标志
| 标志 | 描述 |
|---|---|
| OBS_SOURCE_VIDEO | 源提供视频 |
| OBS_SOURCE_AUDIO | 源提供音频 |
| OBS_SOURCE_ASYNC | 源是异步的 |
| OBS_SOURCE_ASYNC_VIDEO | 源异步提供视频 |
| OBS_SOURCE_CUSTOM_DRAW | 源使用自定义绘制 |
| OBS_SOURCE_INTERACTION | 源支持用户交互 |
| OBS_SOURCE_COMPOSITE | 源合成多个子源 |
源通过 obs_source_info 结构体实现,该结构体包含用于各种操作的回调,例如创建、销毁、渲染和处理音频。插件开发者实现这些回调以创建自定义源。
核心通过引用计数管理源的生命周期,允许源在多个场景或滤镜之间共享而无需重复。
主要的源操作包括
obs_source_create、obs_source_destroy)obs_source_output_video、obs_source_output_audio)obs_source_properties、obs_source_update)obs_source_video_render)obs_source_process_filter)场景是特殊的源,可以合成多个子源。场景系统管理场景中源的排列、变换和渲染。
场景项是引用场景中源的对象,并定义其变换(位置、缩放、旋转)以及可见性和裁剪等其他属性。
场景项操作包括
obs_scene_add、obs_sceneitem_remove)obs_sceneitem_set_pos、obs_sceneitem_set_scale 等)obs_sceneitem_set_visible)obs_sceneitem_set_crop)obs_sceneitem_set_bounds_type、obs_sceneitem_set_bounds)编码器系统将原始音频和视频转换为用于流媒体和录制的压缩格式。编码器通过 obs_encoder_info 结构体实现,并由核心管理。
编码器操作包括
obs_video_encoder_create、obs_audio_encoder_create)obs_encoder_update、obs_encoder_set_video、obs_encoder_set_audio)obs_encoder_start、obs_encoder_stop)obs_encoder_get_extra_data、obs_encoder_packet_ref)输出系统负责将编码后的媒体传输到目的地,例如流媒体服务或本地文件。输出从编码器接收编码包并管理输出过程。
输出操作包括
obs_output_create)obs_output_set_service、obs_output_set_video_encoder、obs_output_set_audio_encoder)obs_output_start、obs_output_stop)obs_output_set_delay)obs_output_set_reconnect_settings)服务系统为流媒体服务提供信息和认证。服务通过 obs_service_info 结构体实现,并由核心管理。
服务操作包括
obs_service_create)obs_service_update、obs_service_apply_encoder_settings)obs_service_get_url、obs_service_get_key)模块系统使 OBS 能够加载扩展其功能的插件。插件是动态加载的库,它们向核心注册源、编码器、输出和服务。
模块操作包括
obs_open_module、obs_init_module、obs_load_all_modules)obs_find_modules、obs_find_module_file)obs_get_module_name、obs_get_module_author、obs_get_module_description)以下图表说明了数据如何通过 libobs 核心从源捕获流向最终输出。
下表显示了 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 | 模块对象 |
libobs 核心公开了一个 C API,用于创建、管理和控制 OBS 系统的所有组件。主要 API 类别包括
obs_startup、obs_shutdown)obs_source_create、obs_source_release 等)obs_scene_create、obs_scene_add 等)obs_encoder_create、obs_encoder_release 等)obs_output_create、obs_output_start 等)obs_service_create、obs_service_update 等)obs_properties_create、obs_data_create 等)libobs 使用语义版本控制来跟踪 API 兼容性。当前的 API 版本在 obs-config.h 中定义,包括主版本、次版本和修订版本组件。插件检查与此版本的兼容性以确保正常运行。