はじめに

前回公式のプラグインテンプレートをビルドしたので、これを使って最小修正で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を起動するとプラグインが読み込まれます。

sam

sam

流山おおたかの森Techブログの管理人です。 お仕事のご依頼などはmail or Twitter[https://twitter.com/sam_sumario]で連絡頂けると反応出来ます。
Previous post OBS Studio コードリーティング日記 #5 ; .dllファイルについて
Next post OBS Studio コードリーティング日記 #6 ; main関数

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です