前回[OBS Studioのプラグインの作り方 #2 GUIの追加方法]の続きです。
OBSの自作プラグインをフィルタ一覧に表示させる所までは前回やったので、今回はそこからプロパティを追加する方法について紹介していきます。
開発環境
OBS Studioバージョン:30.0.0
OS : Windows
Soft : Visual Studio 2022, CMake(3.28.0)
テンプレートのダウンロード
前回(2023/12/22)から色々修正が入ったので、先ずはgitから最新のプロジェクトをcloneします。
git clone https://github.com/obsproject/obs-plugintemplate.git
buildspec.jsonの修正
4行目のobs-studioのバージョンが前回の29.1.2から30.1.2に修正されています。
{
"dependencies": {
"obs-studio": {
"version": "30.1.2",
気になる場合はお使いのOBSのバージョンと揃えてください。
CMakeを実行後に.depsフォルダ内にdependencies内のソフトが保存されるので、DLするURLやバージョンが見つからない場合は直接置き換えてください。
39行目~42行目を好きに設定します。
"name": "obs-my-plugin",
"displayName": "OBS My Plugin Sample",
"version": "1.0.0",
"author": "Sam_s",
ソースコード名の修正
今回は不要ですが、一応ソースのファイル名を修正して分かりやすくしておきます。
plugin-main.c -> my-plugin-main.c
合わせてCMakeLists.txtの37行目のファイル名を修正したファイル名に合わせます。
target_sources(${CMAKE_PROJECT_NAME} PRIVATE src/plugin-main.c)
↓ Change filename
target_sources(${CMAKE_PROJECT_NAME} PRIVATE src/my-plugin-main.c)
CMakeの実行
OSによりコマンドが変わりますがwindwos64bitの場合は下記。
cmake --preset windows-x64
presetが存在するかは cmake –list-presetsで確認出来ます。
ソリューションの確認
cmakeの処理が終わるとbuild_x64フォルダ下にソリューションファイルが生成されるので開きます。
(今回例ではobs-my-plugin.slnというファイル名)
ソリューションエクスプローラーでobs-my-pluginを選択し、ビルド出来るかどうか一度確認します。
ソースファイルの修正(my-plugin-main.c)
obs_source_infoの作成
OBS本体に作成しているプラグインの情報を渡す構造体を作成します。
登録方法はプラグインが読み込まれるタイミング(obs_module_load関数内)でobs_register_source関数にsource_infoを渡します。
今回はフィルタプロパティを表示してもらうので、get_propertiesメンバを忘れずに追加します。
create,destroyはそれぞれフィルタ適用時、削除時に呼ばれる関数ですがこれが設定されていないとget_propertiesが呼び出されないので今回はダミー関数を作成します。
struct obs_source_info my_ef_info = {
.id = "my plugin sample",
.type = OBS_SOURCE_TYPE_FILTER,
.output_flags = OBS_SOURCE_VIDEO,
.get_name = get_my_plugin_name,
.create = my_filter_create,
.destroy = my_filter_destroy,
.get_properties = get_my_filter_properties,
};
bool obs_module_load(void)
{
obs_log(LOG_INFO, "plugin loaded successfully (version %s)",
PLUGIN_VERSION);
obs_register_source(&my_ef_info);
return true;
}
フィルタ名の表示
OBSのフィルタ一覧でフィルタ名を表示させるためにobs_source_infoのtype_dataに表示関数をセットします。
今回はget_my_plugin_nameという名称で、実装内容は下記です。
static const char *get_my_plugin_name(void *unused)
{
return "my plugin properties sample";
}
プロパティの表示
今回の本題の関数です。
static obs_properties_t *get_my_filter_properties(void *data)
{
obs_log(LOG_INFO, "my plugin properties loaded");
obs_properties_t *props = obs_properties_create();
obs_properties_add_text(props, "my_label",
obs_module_text("MyLabel"),
OBS_TEXT_DEFAULT);
obs_property_t *p = obs_properties_add_list(
props, "my_select_list", obs_module_text("SelectList"),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
obs_property_list_add_string(p, obs_module_text("A"),
"default");
obs_property_list_add_string(p, obs_module_text("B"),
"default");
obs_properties_add_int(props, "my_int",
obs_module_text("MyInt"), 0, 100, 1);
UNUSED_PARAMETER(data);
return props;
}
何となくコードの雰囲気で分かると思いますが、下記のようなプロパティを作成しています。
ダミー関数の作成
createとdestroyを作成します。
static void *my_filter_create(obs_data_t *settings,
obs_source_t *source)
{
UNUSED_PARAMETER(settings);
obs_log(LOG_INFO, "my plugin create");
return source;
}
static void my_filter_destroy(void *data)
{
UNUSED_PARAMETER(data);
obs_log(LOG_INFO, "my plugin desutroy");
}
文字設定
obs_module_textで呼び出される文字を設定します。
プラグインの設定で最初にen-US.iniが呼ばれますが、その後OBS本体の設定が日本語になっている場合はja-JP.iniが呼ばれるので2つ作成しておきます。
今回は中身は同じでファイル名のみ変更して作成しました。
en-US.ini & ja-JP.ini
----
MyLabel="my sample label"
SelectList="my select list"
A="sample A"
B="sample B"
MyInt="my sample int"
インストール
ビルドしたobs-my-plugin.dllファイルをobsインストールフォルダ内のobs-plugins/64bit以下にコピーします。
文字のiniファイルをdata/obs-plugins内にプラグイン名を付けたフォルダを作成しコピーします。
今回の例では下記。
data/obs-plugins/obs-my-plugin/locate/en-US.ini(ja-JP.ini)
OBSを起動し、フィルタを適用してプロパティが出ていれば成功です。
select list項目は下記のように選択出来ます。
以上で完成!