URLhttps://learnscript.net/zh-hant/obs-python-scripting/scenes/
    複製連結移至說明  範例

    如何操作 OBS 場景?場景物件介紹

    閱讀 9:27·字數 2837·更新 
    Youtube 頻道
    訂閱 375

    OBS 場景物件

    場景物件(Scene Objects)與obspython模組提供的場景函式,可用於操作場景。比如,將來源作為場景項新增至場景,或將場景項從場景移除。

    什麽是 OBS 場景?

    場景(Scenes)是一種特殊的 OBS 來源,他可以管理由來源產生的場景項,這些場景項可能參考不同或相同的來源,場景項顯示的名稱即為其對應來源的名稱。當多個場景項參考同一個來源時,他們的某些表現將是一致的,比如,顯示在來源列的名稱。

    什麽是 OBS 私用場景?

    私用場景與私用來源類似,無法被使用者直接建立。通過 Python 腳本建立的私用場景不會出現在場景欄,在被新增至非私用場景後可顯示在來源列中。私用場景會在重新啟動後消失,場景群組匯出操作將忽略他。

    需要特別指出,如果私用場景擁有非私用來源,那麽這些非私用來源可能不會被清除。

    私用場景和非私用場景的命名沖突問題

    由於場景本身就是 OBS 來源,因此,私用場景與非私用場景在命名的問題上,遵守與來源一樣的規則。

    來源

    關於 OBS 來源的命名沖突問題,你可以檢視OBS 來源物件一段。

    建立 OBS 場景

    與建立 OBS 來源有所不同,建立場景只需要指定場景的名稱即可。

    obspython模組的obs_scene_createobs_scene_create_private函式,均可用於建立場景,兩者的區別在於,obs_source_create_private函式建立的來源是私用的。

    obs_scene_create(name)
    obs_scene_create_private(name)

    name 參數

    name參數為建立場景的期望名稱,當發生命名沖突時,OBS 會修改期望名稱,直到沖突消失。

    使用 obs_scene_release 函式釋放建立的場景物件

    對於使用obs_scene_createobs_scene_create_private函式建立的場景物件,需要通過obs_scene_release釋放參考,否則 OBS 可能會出現錯誤。

    我們嘗試在按鈕的回呼函式test中,建立一個私用場景sub_scene,並將其作為場景項新增至場景Scene,假設Scene存在。

    scenes.py
    # 匯入模組 obspython
    import obspython as obs
    
    def test(props, prop): # 建立一個名稱為 sub_scene 的私用場景 scene_sub = obs.obs_scene_create_private('scene_sub') # 取得場景 Scene 對應的場景物件 source_scene = obs.obs_get_source_by_name('Scene') scene = obs.obs_scene_from_source(source_scene) # 將私用場景 sub_scene 新增至場景 Scene obs.obs_scene_add(scene, obs.obs_scene_get_source(scene_sub))
    # 釋放場景物件和來源物件 obs.obs_source_release(source_scene) obs.obs_scene_release(scene_sub)
    # 為腳本新增一個用於測試的按鈕,回呼函式為 test def script_properties(): props = obs.obs_properties_create() obs.obs_properties_add_button(props, 'test', '測試', test) return props

    複製 OBS 場景

    obspython模組的obs_scene_duplicate函式,可用於複製場景,新場景的場景項對應的來源,可能是原場景中場景項對應來源的完全複製或陰影複製。對於陰影複製,新的場景項將與原有場景項共用同一個 OBS 來源,這意味著他們在某些方面的表現會相同。對於原場景中的私用來源,在其被複製到新場景後,依然為私用來源。對於原場景中的非私用來源,在其被複製到新場景後,依然為非私用來源。

    obs_scene_duplicate(scene, name, type)

    scene 參數

    scene參數為被複製的場景物件。

    name 參數

    name參數為新場景的期望名稱,當發生命名沖突時,OBS 會修改期望名稱,直到沖突消失。

    type 參數

    type參數為場景的複製方式,可使用如下obspython模組變數進行設定,OBS_SCENE_DUP_REFS表示場景中的來源將采用陰影複製,OBS_SCENE_DUP_COPY表示場景中的來源將嘗試采用完全複製(對於不支援完全複製的來源,依然采用陰影複製),OBS_SCENE_DUP_PRIVATE_REFSOBS_SCENE_DUP_REFS類似,只不過新的場景將是私用的,OBS_SCENE_DUP_PRIVATE_COPYOBS_SCENE_DUP_COPY類似,只不過新的場景將是私用的。

    使用 obs_scene_release 函式釋放複製的場景物件

    對於使用obs_scene_duplicate函式複製的場景物件,需要通過obs_scene_release釋放參考,否則 OBS 可能會出現錯誤。

    在下面的程式碼中,如果場景(來源)Game不存在,那麽會將場景Scene複製為Game,複製的方式為OBS_SCENE_DUP_REFS

    scenes.py
    def test(props, prop):
    	# …
    	# 將場景 Scene 複製為場景 Game,如果場景 Game 不存在
    	source_game = obs.obs_get_source_by_name('Game')
    	if not source_game:
    		scene_game = obs.obs_scene_duplicate(scene, 'Game', obs.OBS_SCENE_DUP_REFS)
    		# 釋放場景物件
    		obs.obs_scene_release(scene_game)
    	else:
    		# 釋放來源物件
    		obs.obs_source_release(source_game)

    轉換 OBS 場景物件與來源物件

    在 OBS Python 腳本中,場景物件一般不與來源物件互換使用,想要取得場景物件對應的來源物件,或來源物件對應的場景物件,需要進行轉換。

    obspython模組的obs_scene_get_source函式,可用於取得場景物件對應的來源物件。obspython模組的obs_scene_from_source函式,可用於取得來源物件對應的場景物件,先決條件是該來源是一個場景。

    obs_scene_get_source(scene)
    obs_scene_from_source(source)

    scene 參數

    scene參數為需要取得來源物件的場景物件。

    source 參數

    source參數為需要取得場景物件的來源物件。

    為 OBS 場景新增來源

    obspython模組的obs_scene_add函式,可用於將 OBS 來源作為場景項新增至場景,並傳回一個場景項物件。

    obs_scene_add(scene, source)

    scene 參數

    scene參數為需要新增場景項的場景物件。

    source 參數

    source參數為新增場景項對應的來源物件。

    在下面的程式碼中,我們建立了一個名稱為message的私用文字(GDI+)來源,並通過函式obs_scene_add將其新增到了場景scene_sub中。

    scenes.py
    def test(props, prop):
    	# …
    	# 建立一個文字(GDI+)來源
    	settings = obs.obs_data_create_from_json('{"text":"新訊息"}')
    	source_text = obs.obs_source_create_private('text_gdiplus_v2', 'message', settings)
    	# 將文字(GDI+)新增至場景 scene_sub
    	obs.obs_scene_add(scene_sub, source_text)
    	# …

    清除已移除 OBS 場景中的來源

    當一個場景被移除時,其場景項對應的非私用來源依然可能存在,此時可以呼叫obspython模組的obs_scene_prune_sources函式,來移除這些非私用來源,如果他們沒有任何參考的話。

    obs_scene_prune_sources(scene)

    scene 參數

    scene參數為已經被移除的場景物件。

    在下面的程式碼中,我們對場景項Welcome進行了兩次查詢,一次包括群組,一次不包括,假設Welcome是群組Group中的場景項。

    scenes.py
    def test(props, prop):
    	# …
    	# 在移除場景 World 之後,嘗試移除不再使用的其他來源
    	source_world = obs.obs_get_source_by_name('World')
    	scene_world = obs.obs_scene_from_source(source_world)
    	obs.obs_source_remove(source_world)
    	obs.obs_scene_prune_sources(scene_world)
    	obs.obs_source_release(source_world)
    	# …

    新增和釋放對 OBS 場景的參考

    作為一種來源,當場景不存在任何參考時,他將被終結,如果你沒有或過多的進行了場景的釋放,那麽 OBS 可能會出現錯誤。obspython模組提供了以下與場景參考相關的函式。

    obs_scene_get_ref函式,可用於為場景物件新增參考。每當你額外呼叫一次obs_scene_get_ref函式,就需要對等增加一次obs_scene_release函式的呼叫。

    OBS 27.2.0 之前,應使用函式obs_scene_addref,而非obs_scene_get_ref

    obs_scene_release函式,可用於為場景物件釋放參考,他適用於obs_scene_createobs_scene_create_privateobs_scene_duplicate函式所傳回的場景物件。

    obs_scene_get_ref(scene)
    obs_scene_release(scene)

    scene 參數

    scene參數為需要新增或釋放參考的場景物件。

    內容分類

    原始碼

    scenes.py·codebeatme/obs-python-scripting·GitHub