
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開發(fā) OBS Studio 的來源插件時你不需要自己畫設置窗口libobs 的屬性系統(tǒng)obs_properties_t讓你用代碼聲明這個來源有哪些設置項前端OBS 主程序會根據這些屬性自動生成 UI 控件并把用戶改過的值以obs_data_t設置的形式傳回你的來源回調。這篇文章基于倉庫中的 plugins 開發(fā)文檔、屬性 API 參考、libobs/obs-properties.h 以及內置顏色來源插件 plugins/image-source/color-source.c 的真實實現說明如何為自定來源插件定義設置界面。屬性系統(tǒng)與來源結構體的關系在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對象不引用計數創(chuàng)建后由你負責銷毀創(chuàng)建入口為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參數在對象存在時是對象數據屬性在沒有關聯(lián)對象時取回的話可能為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是設置鍵后續(xù)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 一節(jié)。默認值在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??蛇x讓界面隨設置聯(lián)動如果一個設置項要控制另一個控件的可用性或可見性用修改回調。文檔示例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控制單項可見與可用狀態(tài)。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。列表屬性創(chuàng)建后用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類文件設置的讀取路徑?!久赓M下載鏈接】obs-studioOBS Studio - Free and open source software for live streaming and screen recording項目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考