OBSで特定のソースを自動非表示にする方法（外部ツール不要）

# はじめに

先日、友人と『Among Us』をプレイしながら
ゲーム画面を録画していた際
盤面管理ツールをOBSのブラウザソースとして表示後
非表示にするのを忘れてしまい
肝心のゲーム画面が映っていなかったという事態が発生した。

しかも、毎回同じミスをしていた。
会議終了時にブラウザウインドウを自動で閉じてくれる機能があれば。。。
とか夢見るが、それは難しそう。。。
だが、せめて数秒後に自動非表示になれば。。。

と思って調べていたら
それをOBSのLuaスクリプトで実現できたので
備忘録としてここに記す。

# 目的

OBSで特定のソースを表示した後
一定時間経過後に自動で非表示にするスクリプトを作成。

# 特徴

・外部ツール不要（OBS内で完結）

・Luaスクリプトを使用

・設定画面からソース名と非表示までの時間をカスタマイズ可能

# 手順

### 1. スクリプトファイルの作成

まず、適当なフォルダに obs_auto_hide.lua というファイルを作成。

例: C:\Documents\obsScript\obs_auto_hide.lua

次に、以下のLuaスクリプトを作成したファイルに記述。

```lua:obs_auto_hide.lua
obs = obslua  -- OBSのAPIを利用するために必要

-- 設定値（スクリプトのUIで変更可能にする）
source_name = ""  -- ソース名（スクリプトの設定から入力）
hide_delay = 60  -- 非表示までの秒数（スクリプトの設定から入力）
is_timer_running = false  -- タイマーが動作中かどうか

-- 指定のソースを非表示にする
function hide_source()
    local current_scene = obs.obs_frontend_get_current_scene()  -- 現在のシーンを取得
    if not current_scene then
        obs.script_log(obs.LOG_INFO, "現在のシーンが取得できません")
        return
    end

    local scene = obs.obs_scene_from_source(current_scene)
    local sceneitem = obs.obs_scene_find_source(scene, source_name)  -- シーンアイテムを取得

    if sceneitem then
        obs.obs_sceneitem_set_visible(sceneitem, false)  -- ソースを非表示にする
        obs.script_log(obs.LOG_INFO, "ソースを非表示にしました: " .. source_name)
    else
        obs.script_log(obs.LOG_INFO, "ソースが見つかりません（非表示処理）: " .. source_name)
    end

    obs.obs_source_release(current_scene)
    is_timer_running = false
    obs.timer_remove(hide_source)
end

-- ソースが表示されたときに非表示カウントダウンを開始
function on_source_show(calldata)
    local source = obs.calldata_source(calldata, "source")
    if source then
        local name = obs.obs_source_get_name(source)
        if name == source_name and not is_timer_running then
            is_timer_running = true
            obs.timer_add(hide_source, hide_delay * 1000)  -- 指定秒数後に `hide_source()` を実行
            obs.script_log(obs.LOG_INFO, string.format("%d秒後にソースを非表示にします: %s", hide_delay, source_name))
        end
    end
end

-- スクリプトのプロパティ（UIで設定可能にする）
function script_properties()
    local props = obs.obs_properties_create()

    -- ソース名を入力するテキストボックス
    obs.obs_properties_add_text(props, "source_name", "ソース名（ブラウザキャプチャ名）", obs.OBS_TEXT_DEFAULT)

    -- 非表示までの秒数を入力する数値ボックス
    local delay_prop = obs.obs_properties_add_int(props, "hide_delay", "非表示までの秒数", 1, 300, 1)  -- 1秒～300秒まで指定可能

    return props
end

-- 設定が変更されたときに値を更新
function script_update(settings)
    source_name = obs.obs_data_get_string(settings, "source_name")
    hide_delay = obs.obs_data_get_int(settings, "hide_delay")
    obs.script_log(obs.LOG_INFO, string.format("設定を更新: ソース名 = %s, 非表示までの秒数 = %d", source_name, hide_delay))
end

-- スクリプトがロードされたときに、ソース表示のイベントを監視する
function script_load(settings)
    obs.script_log(obs.LOG_INFO, "スクリプトが読み込まれました")

    -- 設定値を取得
    script_update(settings)

    -- ソースが表示されたときのイベントを登録
    local sh = obs.obs_get_signal_handler()
    obs.signal_handler_connect(sh, "source_show", on_source_show)
end
```

### 2. OBSにスクリプトを登録

OBSを開く

「ツール」タブから 「スクリプト」 を選択

「＋」ボタン をクリックし、作成した obs_auto_hide.lua を選択

スクリプトの右側に以下の設定項目が表示される

・ソース名（ブラウザキャプチャ名）

・非表示までの秒数

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2436967/137caf41-e2d9-4f92-8eca-16387f478b04.png)


自動で非表示にしたいソース名と秒数を入力

これで設定完了！

# まとめ

このスクリプトを使えば、指定したソースを一定時間後に自動で非表示にできます。

特に、配信中に一時的に表示したいソース（ゲームの盤面管理ツール、テキスト情報、画像など）の非表示忘れを防ぐのに便利。

「特定のソースを一定時間後に自動非表示にする」 という機能をOBS内で完結できるので、同じようなミスをしてしまう方はぜひ活用されたし！