
OBS Studio 前端 API 深度解析obs-frontend-api.h 的事件回调、场景/配置控制与 Qt 主窗口实现【免费下载链接】obs-studioOBS Studio - Free and open source software for live streaming and screen recording项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studioOBS Studio 的 libobs 核心负责采集、渲染与输出而插件若需要操作界面本身——切换场景、启停推流、注册事件回调、添加 Dock——则必须依赖 Frontend API。本文以官方 API 参考 reference-frontend-api.rst 为主体逐一覆盖其定义的obs_frontend_event事件枚举、obs_frontend_source_list结构与全部 API 函数并结合 frontend/api/ 目录的源码实现分发器模式、OBSStudioAPI对 Qt 主窗口的桥接讲清楚该 API 的调用链路、内存管理与线程安全约定帮助你写出可稳定嵌入 OBS Studio 的 C/C 插件。一、Frontend API 的定位与整体架构Frontend API 是 OBS Studio 自身而非 libobs 核心提供的 API使用方式非常直接#include obs-frontend-api.h从源码结构看它的分层非常清晰一次典型调用会经过四层C 语言导出层obs-frontend-api.h 声明全部EXPORT函数并以extern C暴露供 C/C 插件链接分发层obs-frontend-api.cpp 持有一个static unique_ptrobs_frontend_callbacks c每个导出函数先经callbacks_valid()校验再转发给该指针纯虚接口层obs-frontend-internal.hpp 定义obs_frontend_callbacks抽象类把整个 API 面抽象为一组纯虚函数实现端还包括on_load/on_preload/on_save/on_event四个内部钩子Qt 实现层OBSStudioAPI.hpp 中的OBSStudioAPI结构体实现该接口内部持有OBSBasic *main即 OBSBasic.hpp 定义的主窗口类通过QMetaObject::invokeMethod把跨线程请求安全地投递回 UI 线程。前端启动时由 OBSStudioAPI.cpp 的InitializeAPIInterface完成装配obs_frontend_callbacks *InitializeAPIInterface(OBSBasic *main) { obs_frontend_callbacks *api new OBSStudioAPI(main); obs_frontend_set_callbacks_internal(api); return api; }退出时 OBSBasic.cpp 会调用obs_frontend_set_callbacks_internal(nullptr)注销回调此后任何前端调用都会在分发层被拦截并记录Tried to call %s with no callbacks!错误日志见 obs-frontend-api.cpp。构建方面frontend/api/CMakeLists.txt 将obs-frontend-api编译为 SHARED 库、链接OBS::libobs并以obs-frontend-api.h为PUBLIC_HEADER对外发布头文件。因此插件工程链接OBS::frontend-api即可使用整套 API。需要说明的前提Frontend API 只有在带 Qt 前端的 OBS Studio 中才有实现返回值中的void *实际是 Qt 对象QMainWindow *、QWidget *、QAction *等在 C 侧被当作不透明指针处理。二、核心数据结构与类型2.1 obs_frontend_source_list场景/过渡源列表文档给出的核心结构是一个基于 DARRAY 的源指针数组。在 obs-frontend-api.h 中的实际定义如下obs_frontend_source_list_free本身就是一个头文件内联函数struct obs_frontend_source_list { DARRAY(obs_source_t *) sources; }; static inline void obs_frontend_source_list_free(struct obs_frontend_source_list *source_list) { size_t num source_list-sources.num; for (size_t i 0; i num; i) { obs_source_release(source_list-sources.array[i]); } da_free(source_list-sources); }文档中的标准用法示例务必完整遵循其释放纪律struct obs_frontend_source_list scenes {0}; obs_frontend_get_scenes(scenes); for (size_t i 0; i scenes.sources.num; i) { /* Do NOT call obs_source_release or obs_scene_release * on these sources */ obs_source_t *source scenes.sources.array[i]; /* Convert to obs_scene_t if needed */ obs_scene_t *scene obs_scene_from_source(source); [...] } obs_frontend_source_list_free(scenes);引用计数的规则在文档中写得很明确源码也印证了这一点obs_frontend_get_scenes返回的是已增加引用的场景与 Scenes dock 的显示顺序一致不得在遍历中对列表内元素单独调用obs_source_release/obs_scene_release否则会造成双重释放、甚至导致场景被删除统一用obs_frontend_source_list_free收尾若需要长期持有某个场景应先用obs_source_get_ref/obs_scene_get_ref增引用释放时只调用其中一种两者释放的是同一对象。obs_frontend_get_transitions也使用同一结构接收“引用已增的过渡源列表”释放方式相同。2.2 回调函数类型文档定义了五类回调原型均带void *private_data用户数据翻译回调除外类型原型用途obs_frontend_cbvoid (*)(void *private_data)前端“工具”菜单项点击回调obs_frontend_event_cbvoid (*)(enum obs_frontend_event, void *private_data)前端事件回调obs_frontend_save_cbvoid (*)(obs_data_t *save_data, bool saving, void *private_data)场景集保存/加载回调saving区分方向obs_frontend_translate_ui_cbbool (*)(const char *text, const char **out)UI 翻译拦截回调undo_redo_cbvoid (*)(const char *data)撤销/重做回调携带数据字符串2.3 obs_frontend_event前端事件枚举obs_frontend_event枚举定义见 obs-frontend-api.h是插件与界面同步的核心。文档覆盖的完整事件集合如下按功能分组直播Streaming事件触发时机OBS_FRONTEND_EVENT_STREAMING_STARTING直播启动时OBS_FRONTEND_EVENT_STREAMING_STARTED直播成功启动后OBS_FRONTEND_EVENT_STREAMING_STOPPING直播停止时OBS_FRONTEND_EVENT_STREAMING_STOPPED直播完全停止后录像Recording事件触发时机OBS_FRONTEND_EVENT_RECORDING_STARTING录像启动时OBS_FRONTEND_EVENT_RECORDING_STARTED录像成功启动后OBS_FRONTEND_EVENT_RECORDING_STOPPING录像停止时OBS_FRONTEND_EVENT_RECORDING_STOPPED录像完全停止后OBS_FRONTEND_EVENT_RECORDING_PAUSED录像被暂停时OBS_FRONTEND_EVENT_RECORDING_UNPAUSED录像恢复取消暂停时场景与过渡Scene / Transition事件触发时机OBS_FRONTEND_EVENT_SCENE_CHANGED当前场景改变时OBS_FRONTEND_EVENT_SCENE_LIST_CHANGED用户添加/删除/重排场景时OBS_FRONTEND_EVENT_TRANSITION_CHANGED用户更改当前过渡时OBS_FRONTEND_EVENT_TRANSITION_STOPPED一次过渡执行完成时OBS_FRONTEND_EVENT_TRANSITION_LIST_CHANGED用户添加/删除过渡时OBS_FRONTEND_EVENT_TRANSITION_DURATION_CHANGED用户更改过渡时长时OBS_FRONTEND_EVENT_TBAR_VALUE_CHANGED过渡 T 条被拖动时场景集 / 配置档Scene Collection / Profile事件触发时机OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGING当前场景集即将切换时OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED当前场景集已切换后OBS_FRONTEND_EVENT_SCENE_COLLECTION_LIST_CHANGED场景集被添加或删除时OBS_FRONTEND_EVENT_SCENE_COLLECTION_RENAMED场景集被重命名时OBS_FRONTEND_EVENT_SCENE_COLLECTION_CLEANUP场景集被完全卸载即将加载新场景集或即将退出时OBS_FRONTEND_EVENT_PROFILE_CHANGING当前 profile 即将切换时OBS_FRONTEND_EVENT_PROFILE_CHANGED当前 profile 已切换后OBS_FRONTEND_EVENT_PROFILE_LIST_CHANGEDprofile 被添加或删除时OBS_FRONTEND_EVENT_PROFILE_RENAMEDprofile 被重命名时回放缓冲 / 虚拟摄像头 / Studio Mode事件触发时机OBS_FRONTEND_EVENT_REPLAY_BUFFER_STARTING回放缓冲启动时OBS_FRONTEND_EVENT_REPLAY_BUFFER_STARTED回放缓冲成功启动后OBS_FRONTEND_EVENT_REPLAY_BUFFER_STOPPING回放缓冲停止时OBS_FRONTEND_EVENT_REPLAY_BUFFER_STOPPED回放缓冲完全停止后OBS_FRONTEND_EVENT_REPLAY_BUFFER_SAVING回放缓冲正在保存时OBS_FRONTEND_EVENT_REPLAY_BUFFER_SAVED回放缓冲已保存后OBS_FRONTEND_EVENT_VIRTUALCAM_STARTED虚拟摄像头启动时OBS_FRONTEND_EVENT_VIRTUALCAM_STOPPED虚拟摄像头停止时OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED用户开启 Studio Mode预览/节目OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED用户关闭 Studio ModeOBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGEDStudio Mode 下预览场景改变时程序生命周期与杂项事件触发时机版本OBS_FRONTEND_EVENT_FINISHED_LOADING程序完成加载时基础OBS_FRONTEND_EVENT_SCRIPTING_SHUTDOWN脚本需要在 OBS 退出前得知时。通常OBS_FRONTEND_EVENT_EXIT在脚本被销毁之后才触发基础OBS_FRONTEND_EVENT_EXIT程序即将退出。这是最后调用任何前端 API 做保存/清理的机会回调返回后不得再发起任何前端 API 调用基础OBS_FRONTEND_EVENT_THEME_CHANGED主题切换时29.0.0OBS_FRONTEND_EVENT_SCREENSHOT_TAKEN截图完成时29.0.0补充一个源码层面的细节头文件枚举中还额外定义了OBS_FRONTEND_EVENT_CANVAS_ADDED与OBS_FRONTEND_EVENT_CANVAS_REMOVEDobs-frontend-api.h配合多画布canvas能力使用官方 RST 参考目前未将其列入正文。三、API 函数参考按功能分组以下函数签名与文档一致全部声明于 obs-frontend-api.h。3.1 场景列表与当前场景函数说明void obs_frontend_source_list_free(struct obs_frontend_source_list *source_list)释放列表内所有源并释放列表本身void *obs_frontend_get_main_window(void)返回 OBS Studio 主窗口的QMainWindow *void *obs_frontend_get_main_window_handle(void)返回主窗口的原生窗口句柄char **obs_frontend_get_scene_names(void)返回以 NULL 结尾的场景名列表顺序与 Scenes dock 显示一致。列表存于单一连续内存段用bfree()释放基指针即可释放整个列表void obs_frontend_get_scenes(struct obs_frontend_source_list *sources)填充“引用已增”的场景列表见 2.1 节的释放纪律obs_source_t *obs_frontend_get_current_scene(void)返回当前激活场景的新引用用obs_source_release()释放void obs_frontend_set_current_scene(obs_source_t *scene)设置当前场景源码印证OBSStudioAPI.cpp 中obs_frontend_get_scenes正是遍历 Scenes dock 的列表项main-ui-scenes逐个da_push_back因此“顺序与 Scenes dock 一致”是有源码依据的而obs_frontend_set_current_scene在 Studio Mode 下会走TransitionToScene触发过渡否则直接调用SetCurrentSceneOBSStudioAPI.cpp。3.2 过渡Transition与 T 条函数说明void obs_frontend_get_transitions(struct obs_frontend_source_list *sources)接收“引用已增”的过渡源列表用obs_frontend_source_list_free释放obs_source_t *obs_frontend_get_current_transition(void)返回当前过渡的新引用用obs_source_release()释放void obs_frontend_set_current_transition(obs_source_t *transition)设置当前过渡int obs_frontend_get_transition_duration(void)返回 UI 中当前设置的过渡时长毫秒void obs_frontend_set_transition_duration(int duration)设置过渡时长毫秒void obs_frontend_release_tbar(void)模拟鼠标在 T 条上松开确定过渡状态void obs_frontend_set_tbar_position(int position)设置 T 条数值取值范围0–1023int obs_frontend_get_tbar_position(void)获取 T 条数值范围 0–1023从实现看set_current_transition、set_transition_duration、release_tbar、set_tbar_position均通过QMetaObject::invokeMethod投递到 UI 线程OBSStudioAPI.cpp插件可在非 UI 线程安全调用这些“写”类接口。3.3 场景集Scene Collection函数说明char **obs_frontend_get_scene_collections(void)场景集名称列表NULL 结尾、单段内存bfree()释放char *obs_frontend_get_current_scene_collection(void)当前场景集名的新指针bfree()释放void obs_frontend_set_current_scene_collection(const char *collection)激活指定名称的场景集bool obs_frontend_add_scene_collection(const char *name)新建场景集并切换到它返回是否成功3.4 配置档Profile函数说明char **obs_frontend_get_profiles(void)profile 名称列表NULL 结尾、单段内存bfree()释放char *obs_frontend_get_current_profile(void)当前 profile 名的新指针bfree()释放char *obs_frontend_get_current_profile_path(void)当前 profile 的文件系统路径bfree()释放void obs_frontend_set_current_profile(const char *profile)激活指定 profilebool obs_frontend_create_profile(const char *name)创建新 profile名称必须唯一bool obs_frontend_duplicate_profile(const char *name)复制当前 profile 为指定新名称必须唯一void obs_frontend_delete_profile(const char *profile)删除指定 profile3.5 UI 扩展工具菜单与 Dock函数说明void *obs_frontend_add_tools_menu_qaction(const char *name)向“工具”菜单添加QAction并返回其指针void obs_frontend_add_tools_menu_item(const char *name, obs_frontend_cb callback, void *private_data)添加菜单项并把::clicked信号连接到回调bool obs_frontend_add_dock_by_id(const char *id, const char *title, void *widget)以QWidget添加 Dock并在“停靠窗口”菜单生成开关项。Dock 关闭时会向该控件发送类型为QEvent::User QEvent::Close的自定义事件便于其释放资源显示时默认已有通用QShowEvent。id 已占用时返回false。30.0 加入void obs_frontend_remove_dock(const char *id)从 UI 移除指定 id 的 Dock。30.0 加入bool obs_frontend_add_custom_qdock(const char *id, void *dock)添加不带菜单开关的自定义QDockWidget。30.0 加入3.6 事件回调与保存/预加载回调函数说明void obs_frontend_add_event_callback(obs_frontend_event_cb callback, void *private_data)注册前端事件回调void obs_frontend_remove_event_callback(obs_frontend_event_cb callback, void *private_data)移除事件回调void obs_frontend_add_save_callback(obs_frontend_save_cb callback, void *private_data)注册场景集保存/加载回调void obs_frontend_remove_save_callback(obs_frontend_save_cb callback, void *private_data)移除保存/加载回调void obs_frontend_add_preload_callback(obs_frontend_save_cb callback, void *private_data)注册“场景集加载前”的回调void obs_frontend_remove_preload_callback(obs_frontend_save_cb callback, void *private_data)移除预加载回调保存/预加载/事件三组回调在 OBSStudioAPI.hpp 中分别以saveCallbacks、preloadCallbacks、callbacks三个向量管理回调及其private_data被打包进OBSStudioCallbackT。事件分发的一个值得注意的细节在 OBSStudioAPI.cpp当主窗口处于禁用保存状态main-disableSaving时除SCENE_COLLECTION_CLEANUP与EXIT之外的所有事件都会被过滤保证插件在清理阶段仍能收到收尾事件。3.7 UI 翻译拦截函数说明void obs_frontend_push_ui_translation(obs_frontend_translate_ui_cb translate)压入 UI 翻译回调允许前端插件拦截 Qt 自动生成翻译文本的过程通常传入obs_module_get_stringvoid obs_frontend_pop_ui_translation(void)弹出当前 UI 翻译回调obs-frontend-api.h 中的注释明确提醒OBS UI 绕过了 Qt 的标准本地化机制插件 UI 不应直接使用 Qt 的翻译方法而应在文本即将被翻译时push、翻译完成后pop。3.8 直播、录像与回放缓冲控制函数说明void obs_frontend_streaming_start(void)启动直播void obs_frontend_streaming_stop(void)停止直播bool obs_frontend_streaming_active(void)直播是否激活void obs_frontend_recording_start(void)启动录像void obs_frontend_recording_stop(void)停止录像bool obs_frontend_recording_active(void)录像是否激活void obs_frontend_recording_pause(bool pause)true暂停录像false取消暂停bool obs_frontend_recording_paused(void)录像是否处于暂停bool obs_frontend_recording_split_file(void)请求拆分当前录像文件。true仅代表“请求成功”不保证已完成或确实拆分录像未激活/已暂停或拆分功能被禁用时返回falsebool obs_frontend_recording_add_chapter(const char *name)在当前输出时刻插入章节标记。name可为NULL使用自动名 “Unnamed 章节号” 或本地化等价名。录像未激活、暂停或当前输出不支持章节时返回false。30.2 加入void obs_frontend_replay_buffer_start(void)启动回放缓冲void obs_frontend_replay_buffer_stop(void)停止回放缓冲void obs_frontend_replay_buffer_save(void)回放缓冲激活时保存一次回放bool obs_frontend_replay_buffer_active(void)回放缓冲是否激活从源码看streaming_active/recording_active等状态查询是原子地读取volatile bool标志位如 OBSStudioAPI.cpp 使用os_atomic_load_bool(streaming_active)因此这些“读”类接口可以安全地在任意线程调用而启停操作则通过invokeMethod回到 UI 线程执行。3.9 投影仪窗口Projector函数说明void obs_frontend_open_projector(const char *type, int monitor, const char *geometry, const char *name)打开投影仪。type取值不区分大小写Preview、Source、Scene、StudioProgram、Multiviewmonitor为-1时打开为普通窗口此时geometry生效Base64 编码的 Qt 几何信息type为Source或Scene时name指定要显示的源或场景名3.10 输出对象、配置与推流服务函数说明void obs_frontend_save(void)保存当前场景集obs_output_t *obs_frontend_get_streaming_output(void)当前直播输出的新引用用obs_output_release()释放obs_output_t *obs_frontend_get_recording_output(void)当前录像输出的新引用obs_output_t *obs_frontend_get_replay_buffer_output(void)当前回放缓冲输出的新引用config_t *obs_frontend_get_profile_config(void)当前 profile 对应的config_t *不拥有所有权config_t *obs_frontend_get_global_config(void)31.0 起弃用原返回全局配置global.ini。实现中会打印弃用警告并转发到obs_frontend_get_app_configobs-frontend-api.cppconfig_t *obs_frontend_get_app_config(void)系统级设置global.ini对应的config_t *。31.0 加入config_t *obs_frontend_get_user_config(void)用户设置user.ini对应的config_t *。31.0 加入void obs_frontend_set_streaming_service(obs_service_t *service)设置当前推流服务obs_service_t *obs_frontend_get_streaming_service(void)当前推流服务对象不增加引用void obs_frontend_save_streaming_service(void)保存当前推流服务数据3.11 Studio Mode预览/节目函数说明bool obs_frontend_preview_program_mode_active(void)Studio Mode 是否激活void obs_frontend_set_preview_program_mode(bool enable)开启/关闭 Studio Modevoid obs_frontend_preview_program_trigger_transition(void)Studio Mode 激活时触发“预览到节目”过渡obs_source_t *obs_frontend_get_current_preview_scene(void)Studio Mode 激活时返回当前预览场景的新引用否则NULL用obs_source_release()释放void obs_frontend_set_current_preview_scene(obs_source_t *scene)设置 Studio Mode 下的预览场景非 Studio Mode 时不生效void obs_frontend_set_preview_enabled(bool enable)设置预览画面开关状态仅在 Studio Mode关闭时相关bool obs_frontend_preview_enabled(void)预览画面是否启用源码印证obs_frontend_get_current_scene在 Studio Mode 下返回的是programScene节目场景而非预览场景OBSStudioAPI.cpp这一点在写自动化脚本时需要特别注意。3.12 截图、虚拟摄像头与视频重置函数说明void *obs_frontend_take_screenshot(void)对 OBS 主输出截图返回图像数据QImage *void *obs_frontend_take_source_screenshot(obs_source_t *source)对指定源截图obs_output_t *obs_frontend_get_virtualcam_output(void)当前虚拟摄像头输出的新引用void obs_frontend_start_virtualcam(void)启动虚拟摄像头void obs_frontend_stop_virtualcam(void)停止虚拟摄像头bool obs_frontend_virtualcam_active(void)虚拟摄像头是否激活void obs_frontend_reset_video(void)依据当前 profile 的最新数据重载 UI 画布并重置 libobs 视频3.13 源窗口、输出路径、本地化与主题函数说明void *obs_frontend_open_source_properties(obs_source_t *source)打开指定源的属性窗口void *obs_frontend_open_source_filters(obs_source_t *source)打开指定源的滤镜窗口void *obs_frontend_open_source_interaction(obs_source_t *source)打开指定源的交互窗口仅当源具有OBS_SOURCE_INTERACTION输出标志时才可调用void *obs_frontend_open_sceneitem_edit_transform(obs_sceneitem_t *item)打开指定 scene item 的变换编辑窗口。29.1 加入char *obs_frontend_get_current_record_output_path(void)当前录像输出路径的新指针bfree()释放const char *obs_frontend_get_locale_string(const char *string)获取给定字符串的前端翻译bool obs_frontend_is_theme_dark(void)当前主题是否为深色。29.0.0 加入char *obs_frontend_get_last_recording(void)最后一次录像的文件路径bfree()释放。29.0.0 加入char *obs_frontend_get_last_screenshot(void)最后一次截图的文件路径bfree()释放。29.0.0 加入char *obs_frontend_get_last_replay(void)最后一次回放缓冲保存的文件路径bfree()释放。29.0.0 加入3.14 撤销/重做与场景项复制粘贴函数说明void obs_frontend_add_undo_redo_action(const char *name, const undo_redo_cb undo, const undo_redo_cb redo, const char *undo_data, const char *redo_data, bool repeatable)注册一个撤销/重做动作。repeatable为true时同名的多个动作可合并为一个撤销/重做动作撤销取第一个、重做取最后一个。29.1 加入void obs_frontend_copy_sceneitem(obs_sceneitem_t *item)复制指定场景项。32.2 加入bool obs_frontend_can_paste_sceneitem(bool duplicate)查询已复制的场景项能否粘贴duplicate用于检查所复制源是否允许复制方式粘贴。32.2 加入void obs_frontend_paste_sceneitem(obs_scene_t *scene, bool duplicate)粘贴到指定场景true为粘贴副本false为粘贴引用。32.2 加入四、内存管理约定务必遵守Frontend API 的字符串与对象返回遵循三套明确的释放规则obs-frontend-api.h 中的注释与分发层实现共同确定了这套契约char **字符串列表是“单次分配”。以 obs-frontend-api.cpp 的convert_string_list为例它先用bmalloc分配一段连续内存前部存放char *指针数组末尾置nullptr后部紧跟各字符串数据含终止符。因此只需对基指针调用一次bfree()整个列表含所有字符串即被释放——不要对单个元素再 free。char *单串返回值如obs_frontend_get_current_profile、obs_frontend_get_current_profile_path、obs_frontend_get_current_record_output_path、obs_frontend_get_last_*系列均为新分配指针统一用bfree()释放。实现侧使用bstrdup复制字符串OBSStudioAPI.cpp确认了“返回新指针、调用方负责释放”的语义。libobs 引用计数对象obs_source_t *、obs_output_t *等get_current_scene、get_current_transition、get_*_output均返回新引用用对应obs_*_release释放而obs_frontend_get_streaming_service明确不增加引用这是所有 get 函数中唯一的例外文档已特别注明。事件与退出顺序OBS_FRONTEND_EVENT_SCRIPTING_SHUTDOWN在脚本体系销毁前触发供脚本感知退出OBS_FRONTEND_EVENT_EXIT是程序退出的最后通知回调返回之后不允许再调用任何前端 API——这与分发层“退出时注销回调”的实现OBSBasic.cpp相互印证。五、源码实现要点与线程安全分发器模式。obs-frontend-api.cpp 中所有导出函数都是薄封装先callbacks_valid()校验失败则blog(LOG_ERROR, ...)并返回空/false/0再转发给obs_frontend_callbacks。这使得前端 API 库可以独立于 Qt 实现构建也解释了为什么插件在未装配前端例如纯 libobs 环境中调用这些函数不会崩溃而是得到错误日志加空值。跨线程 UI 操作。写 UI 的操作在 OBSStudioAPI.cpp 中普遍采用QMetaObject::invokeMethod(main, ..., WaitConnection(), ...)形式即阻塞式地把方法调用投递到主窗口的 UI 线程并等待完成。obs_frontend_add_scene_collection甚至通过 lambda 捕获出参success的方式把 UI 线程的结果带回调用方OBSStudioAPI.cpp。可以推断插件从非 UI 线程调用这些接口是受支持的但会短暂阻塞等待 UI 线程。回调注册/注销的匹配规则。回调以“函数指针 private_data”二元组识别OBSStudioAPI.cpp 的GetCallbackIdx移除回调时两组参数都必须与注册时完全一致。弃用演进。obs_frontend_get_global_config在 31.0 被OBS_DEPRECATED标记实现层会输出弃用警告并建议显式使用obs_frontend_get_app_config或obs_frontend_get_user_configobs-frontend-api.cpp新代码应直接采用后两者。SWIG 边界。头文件中obs_frontend_source_list、obs_frontend_canvas_list及其内联释放函数被#ifndef SWIG包裹obs-frontend-api.h说明脚本绑定Python 等走的是另一套适配路径C/C 插件则直接使用这些结构。六、版本演进小结与适用前提综合文档中的versionadded标注该 API 的主要演进节点为版本新增能力29.0.0OBS_FRONTEND_EVENT_THEME_CHANGED、OBS_FRONTEND_EVENT_SCREENSHOT_TAKEN、obs_frontend_is_theme_dark、obs_frontend_get_last_recording/screenshot/replay29.1obs_frontend_open_sceneitem_edit_transform、obs_frontend_add_undo_redo_action30.0Dock 管理三件套obs_frontend_add_dock_by_id、obs_frontend_remove_dock、obs_frontend_add_custom_qdock30.2obs_frontend_recording_add_chapter31.0obs_frontend_get_app_config、obs_frontend_get_user_configobs_frontend_get_global_config弃用32.2场景项复制粘贴obs_frontend_copy_sceneitem、obs_frontend_can_paste_sceneitem、obs_frontend_paste_sceneitem适用前提与限制该 API 面向运行中的 OBS StudioQt 前端返回值中的void *是 Qt 对象指针在纯 C 环境中只能当不透明句柄传递头文件 obs-frontend-api.h 中还包含少量文档未覆盖的函数如obs_frontend_get_system_tray、obs_frontend_defer_save_begin/end及 canvas 管理函数本文以官方 RST 参考文档列出的函数为准额外函数请直接查头文件确认签名插件工程侧只需链接构建产物中的OBS::frontend-api目标见 frontend/api/CMakeLists.txt无需自行编译 OBS 前端代码。参考文件docs/sphinx/reference-frontend-api.rst、frontend/api/obs-frontend-api.h、frontend/api/obs-frontend-api.cpp、frontend/api/obs-frontend-internal.hpp、frontend/OBSStudioAPI.hpp、frontend/OBSStudioAPI.cpp、frontend/widgets/OBSBasic.hpp。【免费下载链接】obs-studioOBS Studio - Free and open source software for live streaming and screen recording项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考