はじめに
前回公式のプラグインテンプレートをビルドしたので、これを使って最小修正でGUIに自作プラグインを追加する方法を考えてみました。[OBS Ver30, Win版]
[フィルタのプロパティGUIは#3で紹介しています。(https://elosove.com/?p=943)]
[プラグイン開発用の公式apiドキュメント:リンク]
テンプレのcloneは下記コマンドで持ってきています。
git clone https://github.com/obsproject/obs-plugintemplate.git
公式テンプレのプロジェクト修正
buildspec.jsonの確認
2023/12/20時点ではbuildspec.json内に記載されている依存ソフトのバージョンは
- obs-studio : 29.1.2
- Qt : Qt6
必須ではないですが公式ガイドに従ってbuildspec.jsonのその他項目も記載をします。
name: プラグイン名
version: プラグインバージョン
author: 作者名
website: プラグインの説明URL
email: email
uuids: 今回は無視
CMakeList.txtの修正
obs-frontend-apiとQtの使用をONにします。(デフォルトOFF)
option(ENABLE_FRONTEND_API "Use obs-frontend-api for UI functionality" ON)
option(ENABLE_QT "Use Qt functionality" ON)
Qtライブラリを使う為、target_sourcesのソース拡張子をCからC++に変更。
target_sources(${CMAKE_PROJECT_NAME} PRIVATE src/plugin-main.cpp)
CMakePresets.jsonの修正
CMakeLists.txtのobs-frontend-apiとQtライブラリの設定に合わせてtrueにします。(デフォルトfault)
"ENABLE_FRONTEND_API": true,
"ENABLE_QT": true
今回はwindows-x64をターゲットに作っているのでwindows-x64の項目のみtrueに修正。
ツールメニューへ項目追加する場合
テンプレート内のplugin-main.cを.cppに変更した後、処理を追加していきます。
- includeの修正 : obs-frontend-api.h,QActionの2つを追加
- obs_module_load関数の修正 : obs-frontend-apiを使ってQActionを追加
#include <obs-module.h>
#include <obs-frontend-api.h>
#include <QAction>
#include <plugin-support.h>
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE(PLUGIN_NAME, "en-US")
bool obs_module_load(void)
{
obs_log(LOG_INFO, "my obs-plugin-tool loaded successfully (version %s)",
PLUGIN_VERSION);
auto *action = (QAction *)obs_frontend_add_tools_menu_qaction(
obs_module_text("my-tool-menu-sample"));
auto cb = [] {/*クリック時の処理内容*/};
QAction::connect(action, &QAction::triggered, cb);
return true;
}
更に詳しいツールメニューの実装はTransition Table for OBS Studioが参考になります。
エフェクトフィルタへ項目追加する場合
ツールメニューと同様にテンプレート内のplugin-main.cを.cppに変更した後、処理を追加していきます。
- obs_source_infoの用意
- obs_module_load関数の修正 : obs_register_sourceでobs_source_infoを登録
#include <obs-module.h>
#include <plugin-support.h>
static const char *my_filter_get_name(void *unused)
{
return "my effect filter sample";
}
struct obs_source_info my_ef_info = {
my_ef_info.id = "my_effect_filter",
my_ef_info.type = OBS_SOURCE_TYPE_FILTER,
my_ef_info.output_flags = OBS_SOURCE_VIDEO,
my_ef_info.get_name = my_filter_get_name,
};
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE(PLUGIN_NAME, "en-US")
bool obs_module_load(void)
{
obs_log(LOG_INFO, "my effect filter plugin loaded successfully (version %s)",
PLUGIN_VERSION);
obs_register_source(&my_ef_info);
return true;
}
更に詳しいエフェクトフィルタの実装はSource Record filter for OBS Studioが参考になります。
doc(window)で表示する場合
ツールメニューと同様にテンプレート内のplugin-main.cを.cppに変更した後、処理を追加していきます。
- includeの修正 : obs-frontend-api.h,QMainWindow,QDockWidgetの追加
- obs_module_post_load関数の追加 : QDockWidgetを作りOBSのMainWindowへ追加する
#include <obs-module.h>
#include <plugin-support.h>
#include <obs-frontend-api.h>
#include <QMainWindow>
#include <QDockWidget>
OBS_DECLARE_MODULE()
OBS_MODULE_USE_DEFAULT_LOCALE(PLUGIN_NAME, "en-US")
bool obs_module_load(void)
{
obs_log(LOG_INFO, "my doc plugin loaded successfully (version %s)",
PLUGIN_VERSION);
return true;
}
void obs_module_post_load(void) {
QMainWindow *window = (QMainWindow *)obs_frontend_get_main_window();
QDockWidget *dock = new QDockWidget(window);
QDockWidget *myDock = new QDockWidget();
dock->setWidget(myDock);
dock->setWindowTitle(QString::fromUtf8(obs_module_text("My Doc Sample"), -1));
dock->resize(100, 100);
dock->setFloating(true);
dock->hide();
obs_frontend_add_dock(dock);
}
更に詳しいDocの実装はOBS Soundboardが参考になります。
ビルド後のインストール方法
それぞれプラグインをビルドして生成された.dllファイルをobs-plugins(/64bit)フォルダの中へコピーしてobsを起動するとプラグインが読み込まれます。