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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章