OBS使用了插件的设计,极大的增强了扩展性,本文做简要介绍。
每个插件就是一个动态链接库(dll),OBS应用程序启动后,会在指定路径下遍历和动态加载所有dll,并尝试从dll中获取插件相关的导出接口。一些插件的公共函数都定义在该头文件中,尤其是导出接口:
#include <obs-module.h>
每个插件都有一个locale文件夹,里面有很多ini文件(多国语言),每个ini就是一个字符串文件。
ini存储的是很多key-value对,代码中可以通过obs_module_text(key)获取多国语言字符串
插件类型:sources, outputs, encoders, services
https://obsproject.com/docs/reference-modules.html
其中source插件又细分为四种类型:
enum obs_source_type
{
OBS_SOURCE_TYPE_INPUT, // 采集模块
OBS_SOURCE_TYPE_FILTER, // 音视频滤镜
OBS_SOURCE_TYPE_TRANSITION, // 场景过度效果
OBS_SOURCE_TYPE_SCENE, // 场景对象
};
常用的插件导出接口有(均由libobs调用):
bool obs_module_load(void)
oid obs_module_unload(void)
void obs_module_set_locale(const char *locale)
const char *obs_module_name(void)
const char *obs_module_description(void)
插件会和libobs通信。在obs_module_load中,每个插件会注册自己的接口到libobs对应的接口数组中,当UI要获取某种插件类型的列表时,libobs会直接返回对应插件类型的接口数组。各个类型的插件的注册函数:
obs_register_source(obs_source_info)
obs_register_output(obs_output_info)
obs_register_encoder(obs_encoder_info)
obs_register_service(obs_service_info)
struct obs_core中用来保存已注册插件的接口数组:
// kinds of source plugin
DARRAY(struct obs_source_info) source_types;
DARRAY(struct obs_source_info) input_types;
DARRAY(struct obs_source_info) filter_types;
DARRAY(struct obs_source_info) transition_types;
DARRAY(struct obs_output_info) output_types;
DARRAY(struct obs_encoder_info) encoder_types;
DARRAY(struct obs_service_info) service_types;
=====================================
obs_source_info
每个source都要注册一个结构体obs_source_info:
obs_source_info::id 插件类型的唯一标识符
obs_source_info::type 有四种source type
obs_source_info::output_flags 具有属性 比如是否有音视频 是否支持monitor 等等
obs_source_info::get_name 展示到UI的source type name
obs_source_info::create 创建一个插件实例
obs_source_info::destroy 销毁插件实例
obs_source_info::update 更新params
obs_source_info::get_defaults 获取每个param默认的值,详见obs-data.h
obs_source_info::get_properties 获取有哪些param, 展示在UI的描述信息, UI的控件类型。每创建一个param对象,可以填充item,也可以注册回调函数(比如按钮点击的cb,对象释放的cb)详见obs-properties.h
obs_source_info::video_tick 更新source的纹理数据
obs_source_info::video_render 渲染数据
1. 所有source的audio 都是推送到libobs,保存到circle buffer中的;
2. 有audio的source,video也是在推送到libobs,保存后做av同步;
3. 不会有audio的source,video是在video-tick和video-render中 直接采集后保存到texture中;
相关推送函数如下:
EXPORT void obs_source_output_audio(obs_source_t *source, const struct obs_source_audio *audio);
EXPORT void obs_source_output_video(obs_source_t *source, const struct obs_source_frame *frame);
EXPORT void obs_source_output_video2(obs_source_t *source, const struct obs_source_frame2 *frame);