[OBS] 插件的设计和开发

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);

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值