ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

OBS Studio 如何用 obs_properties_t 定义来源插件的自定设置界面?

OBS Studio 如何用 obs_properties_t 定义来源插件的自定设置界面? OBS Studio 如何用 obs_properties_t 定义来源插件的自定设置界面【免费下载链接】obs-studioOBS Studio - Free and open source software for live streaming and screen recording项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio开发 OBS Studio 的来源插件时你不需要自己画设置窗口libobs 的属性系统obs_properties_t让你用代码声明这个来源有哪些设置项前端OBS 主程序会根据这些属性自动生成 UI 控件并把用户改过的值以obs_data_t设置的形式传回你的来源回调。这篇文章基于仓库中的 plugins 开发文档、属性 API 参考、libobs/obs-properties.h 以及内置颜色来源插件 plugins/image-source/color-source.c 的真实实现说明如何为自定来源插件定义设置界面。属性系统与来源结构体的关系在struct obs_source_info中get_properties是一个可选回调其原型为/** * Gets the property information of this source * * return The properties data */ obs_properties_t *(*get_properties)(void *data);见 libobs/obs-source.h。前端生成设置界面时会调用这个回调拿到属性列表属性列表中的每一项通过name设置标识字符串与来源的obs_data_t设置键一一对应description参数则是显示给用户的本地化名称。obs_properties_t对象不引用计数创建后由你负责销毁创建入口为EXPORT obs_properties_t *obs_properties_create(void); EXPORT void obs_properties_destroy(obs_properties_t *props);第一步编写 get_properties 回调plugins 文档 给出的最小示例文档示例变量名沿用原文static obs_properties_t *my_source_properties(void *data) { obs_properties_t *ppts obs_properties_create(); obs_properties_add_bool(ppts, my_bool, obs_module_text(MyBool)); UNUSED_PARAMETER(data); return ppts; }data参数在对象存在时是对象数据属性在没有关联对象时取回的话可能为NULL文档提示通常应尽量避免使用它。可用的属性类型全部列在 reference-properties.rst 中常用的有添加函数生成的控件说明obs_properties_add_bool复选框布尔设置obs_properties_add_int/add_float数字输入带 min/max/step 范围obs_properties_add_int_slider/add_float_slider滑条同上obs_properties_add_text文本框类型可选OBS_TEXT_DEFAULT/OBS_TEXT_PASSWORD/OBS_TEXT_MULTILINE/OBS_TEXT_INFOobs_properties_add_path路径选择OBS_PATH_FILE/OBS_PATH_FILE_SAVE/OBS_PATH_DIRECTORYobs_properties_add_list组合框/单选项格式可选 INT / FLOAT / STRING / BOOLobs_properties_add_color/add_color_alpha颜色选择后者带 alpha 通道obs_properties_add_button2按钮不存储设置仅用于 UI 动作obs_properties_add_button已自 32.1 起标记废弃obs_properties_add_group分组OBS_GROUP_NORMAL或OBS_GROUP_CHECKABLE内置颜色来源的get_properties实现是一个可直接对照的真实例子来自 color-source.cstatic obs_properties_t *color_source_properties(void *unused) { UNUSED_PARAMETER(unused); obs_properties_t *props obs_properties_create(); obs_properties_add_color_alpha(props, color, obs_module_text(ColorSource.Color)); obs_properties_add_int(props, width, obs_module_text(ColorSource.Width), 1, 4096, 1); obs_properties_add_int(props, height, obs_module_text(ColorSource.Height), 1, 4096, 1); return props; }注意两点每个属性的第二个参数name是设置键后续update回调要按同一个键取值显示文本通过obs_module_text()从 ini 本地化文件查找这是插件文档推荐的 ini 本地化方式需要配合OBS_MODULE_USE_DEFAULT_LOCALE宏。第二步把属性函数挂到 obs_source_infostruct obs_source_info my_source { .id my_source, .type OBS_SOURCE_TYPE_INPUT, .output_flags OBS_SOURCE_VIDEO, .get_name my_source_name, .create my_source_create, .destroy my_source_destroy, .update my_source_update, .video_render my_source_render, .get_width my_source_width, .get_height my_source_height, .get_properties my_source_properties, .get_defaults my_source_defaults };在插件入口文件中用obs_register_source(my_source)注册入口文件包含obs-module.h并用OBS_DECLARE_MODULE()宏声明模块bool obs_module_load(void) { obs_register_source(my_source); return true; }第三步用 get_defaults 和 update 衔接设置值属性只负责界面值的默认值和读取由obs_data_t完成见 plugins 文档 Settings 一节。默认值在get_defaults回调中设置对照 color-source.cstatic void color_source_defaults_v1(obs_data_t *settings) { obs_data_set_default_int(settings, color, 0xFFFFFFFF); obs_data_set_default_int(settings, width, 400); obs_data_set_default_int(settings, height, 400); }用户确认后update回调收到合并了默认值的设置按键读取对照 color-source.c 与 image-source.cstatic void color_source_update(void *data, obs_data_t *settings) { struct color_source *context data; uint32_t color (uint32_t)obs_data_get_int(settings, color); uint32_t width (uint32_t)obs_data_get_int(settings, width); uint32_t height (uint32_t)obs_data_get_int(settings, height); vec4_from_rgba(context-color, color); context-width width 0 ? width : 1; context-height height 0 ? height : 1; }读取函数与属性类型对应obs_data_get_int/obs_data_get_double/obs_data_get_bool/obs_data_get_string/obs_data_get_obj/obs_data_get_array。颜色属性的值用obs_data_get_int读取见属性参考文档可编辑列表用obs_data_get_array字体属性用obs_data_get_obj。可选让界面随设置联动如果一个设置项要控制另一个控件的可用性或可见性用修改回调。文档示例plugins.rst 原文示例布尔项setting_a决定文本项setting_b是否启用。static bool setting_a_modified(obs_properties_t *ppts, obs_property_t *p, obs_data_t *settings) { bool enabled obs_data_get_bool(settings, setting_a); p obs_properties_get(ppts, setting_b); obs_property_set_enabled(p, enabled); /* return true to update property widgets, false otherwise */ return true; } static obs_properties_t *my_source_properties(void *data) { obs_properties_t *ppts obs_properties_create(); obs_property_t *p; p obs_properties_add_bool(ppts, setting_a, obs_module_text(SettingA)); obs_property_set_modified_callback(p, setting_a_modified); obs_properties_add_text(ppts, setting_b, obs_module_text(SettingB), OBS_TEXT_DEFAULT); return ppts; }回调返回true表示属性布局有变化、需要前端刷新控件false表示无需刷新。若需要在回调中删除属性obs_properties_remove_by_name回调必须返回true否则行为未定义——这一点在 libobs/obs-properties.h 中同样有说明。其他可选调整obs_property_set_visible/obs_property_set_enabled控制单项可见与可用状态。obs_property_set_long_description设置详细文本通常用于 tooltip。obs_property_int_set_limits/obs_property_float_set_limits运行时调整数字范围。obs_properties_set_flags支持OBS_PROPERTIES_DEFER_UPDATE标志表示提示前端等用户编辑完所有属性后再更新设置而不是逐项立即更新定义在 libobs/obs-properties.h。列表属性创建后用obs_property_list_add_string/add_int/add_float逐项添加条目obs_property_list_item_disable可禁用某一项。注意OBS_COMBO_TYPE_RADIO与OBS_COMBO_FORMAT_BOOL是 30.0 起新增的见 API 参考中的 versionadded 标记。如何验证设置界面生效按 plugins 文档 的插件结构组织代码my-plugin.c 一个每个来源一个文件如my-source.cCMakeLists.txt 中add_library(my-plugin MODULE ...)并target_link_libraries(my-plugin libobs)、install_obs_plugin_with_data(my-plugin data)。构建加载插件后前端调用get_properties生成控件你可以用属性枚举 API 自查列表是否符合预期obs_properties_first取第一个属性obs_property_next遍历obs_property_name/obs_property_description/obs_property_get_type分别返回设置键、显示名和类型取值范围即OBS_PROPERTY_BOOL、OBS_PROPERTY_INT、OBS_PROPERTY_TEXT等枚举。若obs_properties_get(props, 设置键)返回NULL说明该属性没有添加或键名拼写不一致。限制与注意事项get_properties是可选回调不填就没有设置界面来源只能用默认设置运行。需要type_data的场合应改用get_properties2get_defaults的注释中标记为 deprecated见 libobs/obs-source.h。obs_properties_add_button自 32.1 废弃新代码用obs_properties_add_button2后者多一个priv参数会原样传回按钮回调的data。按钮属性不存储任何设置只用于 UI 动作回调返回true表示属性布局需要刷新。属性中的name设置键必须与update/get_defaults中的键一致界面值才会落到你的来源数据上description只是显示名与键无关。完整实现可对照仓库中两个来源插件颜色来源 plugins/image-source/color-source.c含多版本obs_source_info与默认值演进和图片来源 plugins/image-source/image-source.c含obs_properties_add_path类文件设置的读取路径。【免费下载链接】obs-studioOBS Studio - Free and open source software for live streaming and screen recording项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表