如何使用 Python 腳本操作 OBS 場景項,群組
先決條件
閱讀本節的先決條件是對 OBS 場景有所掌握,你可以檢視如何使用 Python 腳本操作 OBS 場景?OBS 場景物件介紹一節來了解相關資訊。
Python 腳本中的 OBS 場景項,群組
OBS 場景包含了一組 OBS 場景項,每一個場景項都參考了一個 OBS 來源,當多個場景項參考同一個 OBS 來源時,他們將在某些行為上表現一致,比如顯示的文字。OBS 群組與場景中的場景類似,也可以包含場景項,但群組中的場景項可被 OBS 使用者編輯。
使用 Python 腳本尋找和取得場景中的 OBS 場景項
obspython
模組的obs_scene_find_source
和obs_scene_find_source_recursive
函式,均可用於尋找場景中指定名稱的場景項,兩者的區別在於,obs_scene_find_source_recursive
將尋找群組中的項。如果指定名稱的場景項不存在,那麽函式會傳回空值None
。
obs_scene_find_source(scene, name)
obs_scene_find_source_recursive(scene, name)
- scene 參數
scene
參數為需要尋找場景項的 OBS 場景物件。- name 參數
name
參數為被尋找場景項的名稱,也是該場景項對應 OBS 來源的名稱。
obspython
模組的obs_scene_find_sceneitem_by_id
函式,可用於尋找場景中指定 ID 的場景項,場景項的 ID 是一個整數,不同場景項的 ID 不相同。如果指定 ID 的場景項不存在,那麽函式會傳回空值None
。
obs_scene_find_sceneitem_by_id(scene, id)
- scene 參數
scene
參數為需要尋找場景項的 OBS 場景物件。- id 參數
id
參數為被尋找場景項的 ID。
obspython
模組的obs_scene_sceneitem_from_source
函式,可用於取得場景中指定 OBS 來源對應的場景項。
obs_scene_sceneitem_from_source(scene, source)
- scene 參數
scene
參數為需要取得場景項的 OBS 場景物件。- source 參數
source
參數為場景項所參考的 OBS 來源。
使用 obs_sceneitem_release 函式釋放在 Python 腳本中取得的 OBS 場景項物件
對於使用obs_scene_sceneitem_from_source
函式取得的 OBS 場景項物件,需要通過obs_sceneitem_release
釋放參考,否則 OBS 可能會出現錯誤。
在下面的程式碼中,我們對場景項Welcome
進行了兩次查詢,一次包括群組,一次不包括,假設Welcome
是群組Group
中的場景項。
# 匯入模組 obspython 和 vec2
import obspython as obs
from obspython import vec2
def test(props, prop):
# 取得場景 Scene 對應的場景物件
source_scene = obs.obs_get_source_by_name('Scene')
scene = obs.obs_scene_from_source(source_scene)
# 兩次尋找場景項 Welcome,第二次包括群組
welcome = obs.obs_scene_find_source(scene, 'Welcome')
obs.script_log(obs.LOG_INFO, f'找到了 Welcome?{welcome != None}')
welcome = obs.obs_scene_find_source_recursive(scene, 'Welcome')
obs.script_log(obs.LOG_INFO, f'找到了 Welcome(包括群組中的)?{welcome != None}')
# 釋放來源物件
obs.obs_source_release(source_scene)
# 為腳本新增一個用於測試的按鈕,回呼函式為 test
def script_properties():
props = obs.obs_properties_create()
obs.obs_properties_add_button(props, 'test', '測試', test)
return props
[items_and_groups.py] 找到了 Welcome?False
[items_and_groups.py] 找到了 Welcome(包括群組中的)?True
使用 Python 腳本取得 OBS 場景項所在的場景
obspython
模組的obs_sceneitem_get_scene
函式,可用於取得 OBS 場景項所在的 OBS 場景。
obs_sceneitem_get_scene(item)
- item 參數
item
參數為需要取得所在場景的 OBS 場景項物件。
使用 Python 腳本取得 OBS 場景項參考的來源
obspython
模組的obs_sceneitem_get_source
函式,可用於取得 OBS 場景項參考的 OBS 來源物件。
obs_sceneitem_get_source(item)
- item 參數
item
參數為需要取得來源的 OBS 場景項物件。
下面的程式碼,將顯示場景項Hi
的來源類型識別碼。
def test(props, prop):
# …
# 顯示場景項 Welcome 的來源類型識別碼
source_welcome = obs.obs_sceneitem_get_source(welcome)
obs.script_log(obs.LOG_INFO, f'{obs.obs_source_get_unversioned_id(source_welcome)}')
# …
[items_and_groups.py] ffmpeg_source
使用 Python 腳本移除場景中的 OBS 場景項
obspython
模組的obs_sceneitem_remove
函式,可用於移除 OBS 場景中指定的場景項,無論該場景項是否處於群組內。
obs_sceneitem_remove(item)
- item 參數
item
參數為需要移除的 OBS 場景項物件。
在下面的程式碼中,我們移除了Group
群組的Welcome
場景項。
def test(props, prop):
# …
# 將場景項 Welcome 移除
obs.obs_sceneitem_remove(welcome)
# …
使用 Python 腳本排序場景中的 OBS 場景項
obspython
模組的obs_sceneitem_set_order
函式,可將場景項的位置向上,向下移動,以及將場景項移動至開頭或末尾。需要註意,該函式對群組中的場景項無效。
obspython
模組的obs_sceneitem_get_order_position
和obs_sceneitem_set_order_position
函式,可將場景項移動到指定索引位置。
obs_sceneitem_set_order(item, movement)
obs_sceneitem_get_order_position(item)
obs_sceneitem_set_order_position(item, position)
- item 參數
item
參數為需要移動位置的 OBS 場景項物件。- movement 參數
movement
參數為移動方式,可使用如下obspython
模組變數進行設定,OBS_ORDER_MOVE_UP
表示向上移動,OBS_ORDER_MOVE_DOWN
表示向下移動,OBS_ORDER_MOVE_TOP
表示移動至開頭,OBS_ORDER_MOVE_BOTTOM
表示移動至末尾。- position 參數
position
參數為目標位置的索引,0
表示末尾(倒數第一),倒數第二為1
。
def test(props, prop):
# …
# 將場景項 Hi 移動至末尾
hi = obs.obs_scene_find_source(scene, 'Hi')
obs.obs_sceneitem_set_order_position(hi, 0)
# …
使用 Python 腳本取得 OBS 場景項的私用資料設定物件
obspython
模組的obs_sceneitem_get_private_settings
函式,可用於取得場景項對應的私用資料設定物件,這可以讓開發人員針對場景項新增自訂的設定項。
obs_sceneitem_get_private_settings(item)
- item 參數
item
參數為需要取得私用資料設定物件的 OBS 場景項物件。
使用 obs_data_release 函式釋放在 Python 腳本中取得的 OBS 場景項的私用資料設定物件
對於使用obs_sceneitem_get_private_settings
函式取得的 OBS 場景項對應的私用資料設定物件,需要通過obs_data_release
釋放參考,否則 OBS 可能會出現錯誤。
使用 Python 腳本取得和設定 OBS 場景項的變型
obspython
模組的obs_sceneitem_get_pos
,obs_sceneitem_set_pos
函式,可用於取得和設定 OBS 場景項在場景或群組中的位置。
obs_sceneitem_get_pos(item, pos)
obs_sceneitem_set_pos(item, pos)
- item 參數
item
參數為需要取得或設定位置的 OBS 場景項物件。- pos 參數
pos
參數為包含了位置資訊的 OBSvec2
物件。
obspython
模組的obs_sceneitem_get_rot
,obs_sceneitem_set_rot
函式,可用於取得和設定 OBS 場景項在場景或群組中的旋轉角度。
obs_sceneitem_get_rot(item)
obs_sceneitem_set_rot(item, rot_deg)
- item 參數
item
參數為需要取得或設定旋轉角度的 OBS 場景項物件。- rot_deg 參數
rot_deg
參數為需要設定的旋轉角度。
obspython
模組的obs_sceneitem_get_scale
,obs_sceneitem_set_scale
函式,可用於取得和設定 OBS 場景項在場景或群組中的縮放。
obs_sceneitem_get_scale(item, scale)
obs_sceneitem_set_scale(item, scale)
- item 參數
item
參數為需要取得或設定縮放的 OBS 場景項物件。- scale 參數
scale
參數為包含了縮放資訊的 OBSvec2
物件。
obspython
模組的obs_sceneitem_get_bounds_type
,obs_sceneitem_set_bounds_type
函式,可用於取得和設定 OBS 場景項的邊框類型。一旦設定了有效的邊框,場景項中的內容可能會被縮放。
obs_sceneitem_get_bounds_type(item)
obs_sceneitem_set_bounds_type(item, type)
- item 參數
item
參數為需要取得或設定邊框類型的 OBS 場景項物件。- type 參數
type
參數為邊框類型,可使用如下obspython
模組變數進行設定,OBS_BOUNDS_NONE
表示無邊框,OBS_BOUNDS_STRETCH
表示依外框變換,內容將填滿並全部顯示在邊框中,OBS_BOUNDS_SCALE_INNER
表示等比例縮放至框內,內容將全部顯示在邊框中,並以保持原比例的方式盡量填入整個邊框,OBS_BOUNDS_SCALE_OUTER
表示等比例縮放至框外,內容將以保持原比例的方式填入整個邊框,並盡量確保內容全部顯示在邊框中,OBS_BOUNDS_SCALE_TO_WIDTH
表示等比例縮放至符合寬度,內容將以保持原比例的方式縮放,使其寬度與邊框寬度一致,OBS_BOUNDS_SCALE_TO_HEIGHT
表示等比例縮放至符合高度,內容將以保持原比例的方式縮放,使其高度與邊框高度一致,OBS_BOUNDS_MAX_ONLY
與OBS_BOUNDS_SCALE_INNER
類似,表示等比例縮放至框內,但內容不會超過其原始大小。
在下面的程式碼中,我們設定了場景項Hi
的位置,旋轉角度和縮放。
def test(props, prop):
# …
# 設定場景項 Hi 的位置
pos = vec2()
pos.x = 100
pos.y = 100
obs.obs_sceneitem_set_pos(hi, pos)
# 設定場景項 Hi 的旋轉角度
obs.obs_sceneitem_set_rot(hi, 30)
# 設定場景項 Hi 的縮放
scale = vec2()
scale.x = 1.5
scale.y = 1.5
obs.obs_sceneitem_set_scale(hi, scale)
# …
使用 Python 腳本儲存和載入 OBS 場景項的變型
obspython
模組的obs_scene_save_transform_states
函式,可用於將場景中所有場景項的變型,儲存至一個 OBS 資料設定物件。
obs_scene_save_transform_states(scene, all_items)
- scene 參數
scene
參數為需要儲存變型的場景項所在的 OBS 場景物件。- all_items 參數
all_items
參數為True
時,儲存場景中所有場景項的變型,為False
時,僅儲存選取場景項的變型。
obspython
模組的obs_scene_load_transform_states
函式,可用於從一個 OBS 資料設定物件載入場景項變型。
obs_scene_load_transform_states(states)
- states 參數
states
參數為包含了場景項變型資訊的 OBS 資料設定物件。
使用 obs_data_release 函式釋放在 Python 腳本中建立的包含 OBS 場景項變型資訊的資料設定物件
對於使用obs_scene_save_transform_states
函式建立的包含 OBS 場景項變型資訊的資料設定物件,需要通過obs_data_release
釋放參考,否則 OBS 可能會出現錯誤。
在下面的程式碼中,我們通過儲存和載入所有場景項的變型資訊,使得對場景項Hi
角度的修改無效。
def test(props, prop):
# …
# 儲存並載入場景項的變型資訊,使中途的修改無效
states = obs.obs_scene_save_transform_states(scene, True)
# 設定場景項 Hi 的旋轉角度
obs.obs_sceneitem_set_rot(hi, 90)
obs.obs_scene_load_transform_states(obs.obs_data_get_json(states))
# 釋放資料設定物件
obs.obs_data_release(states)
# …
使用 Python 腳本取得和設定 OBS 場景項的選取狀態
obspython
模組的obs_sceneitem_selected
,obs_sceneitem_select
函式,可用於取得和設定 OBS 場景項的選取狀態。需要說明的是,設定某個場景項的選取狀態,並不會取消其他場景項的選取。
obs_sceneitem_selected(item)
obs_sceneitem_select(item, select)
- item 參數
item
參數為需要取得或設定選取狀態的 OBS 場景項物件。- select 參數
select
參數為True
時,表示選取場景項。
使用 Python 腳本取得和設定 OBS 場景項是否可見
obspython
模組的obs_sceneitem_visible
,obs_sceneitem_set_visible
函式,可用於取得和設定 OBS 場景項是否可見。
obs_sceneitem_visible(item)
obs_sceneitem_set_visible(item, visible)
- item 參數
item
參數為需要取得或設定是否可見的 OBS 場景項物件。- visible 參數
visible
參數為True
時,表示場景項可見。
使用 Python 腳本取得和設定 OBS 場景項的鎖定狀態
obspython
模組的obs_sceneitem_locked
,obs_sceneitem_set_locked
函式,可用於取得和設定 OBS 場景項的鎖定狀態。
obs_sceneitem_locked(item)
obs_sceneitem_set_locked(item, locked)
- item 參數
item
參數為需要取得或設定鎖定狀態的 OBS 場景項物件。- locked 參數
locked
參數為True
時,表示鎖定場景項。
使用 Python 腳本取得和設定 OBS 場景項的轉場特效
obspython
模組的obs_sceneitem_get_transition
,obs_sceneitem_set_transition
函式,可用於取得和設定 OBS 場景項的轉場特效。
obs_sceneitem_get_transition(item, show)
obs_sceneitem_set_transition(item, show, transition)
- item 參數
item
參數為需要取得或設定轉場特效的 OBS 場景項物件。- show 參數
show
參數為True
時,將取得或設定顯示轉場特效,為False
時,將取得或設定隱藏轉場特效。- transition 參數
transition
參數為 OBS 轉場特效物件。
obspython
模組的obs_sceneitem_get_transition_duration
,obs_sceneitem_set_transition_duration
函式,可用於取得和設定 OBS 場景項的轉場特效持續時間。
obs_sceneitem_get_transition_duration(item, show)
obs_sceneitem_set_transition_duration(item, show, duration_ms)
- item 參數
item
參數為需要取得或設定轉場特效持續時間的 OBS 場景項物件。- show 參數
show
參數為True
時,將取得或設定顯示轉場特效的持續時間,為False
時,將取得或設定隱藏轉場特效的持續時間。- duration_ms 參數
duration_ms
參數為轉場特效的持續時間,以毫秒為單位。
使用 Python 腳本觸發 OBS 場景項轉場特效
obspython
模組的obs_sceneitem_do_transition
函式,可用於觸發 OBS 場景項的轉場特效。
obs_sceneitem_do_transition(item, visible)
- item 參數
item
參數為需要觸發轉場特效的 OBS 場景項物件。- visible 參數
visible
參數為True
時,觸發顯示轉場特效,為False
時,觸發隱藏轉場特效。
在為場景項Hi
設定隱藏轉場特效之後,我們觸發了該特效,這需要首先讓Hi
處於不可見(隱藏)狀態。
def test(props, prop):
# …
# 為場景項 Hi 增加滑出的隱藏轉場效果
transition = obs.obs_source_create('swipe_transition', 'hi_hide_transition', None, None)
obs.obs_sceneitem_set_transition(hi, False, transition)
obs.obs_sceneitem_do_transition(hi, False)
# 釋放來源物件
obs.obs_source_release(transition)
# …
使用 Python 腳本取得和設定 OBS 場景項的縮放濾鏡
obspython
模組的obs_sceneitem_get_scale_filter
,obs_sceneitem_set_scale_filter
函式,可用於取得和設定 OBS 場景項的縮放濾鏡。
obs_sceneitem_get_scale_filter(item)
obs_sceneitem_set_scale_filter(item, filter)
- item 參數
item
參數為需要取得或設定縮放濾鏡的 OBS 場景項物件。- filter 參數
filter
參數為縮放濾鏡,可使用如下obspython
模組變數來進行設定,OBS_SCALE_DISABLE
,OBS_SCALE_POINT
,OBS_SCALE_BICUBIC
,OBS_SCALE_BILINEAR
,OBS_SCALE_LANCZOS
。
使用 Python 腳本取得和設定 OBS 場景項的混合模式
obspython
模組的obs_sceneitem_get_blending_mode
,obs_sceneitem_set_blending_mode
函式,可用於取得和設定 OBS 場景項的混合模式。
obs_sceneitem_get_blending_mode(item)
obs_sceneitem_set_blending_mode(item, type)
- item 參數
item
參數為需要取得或設定混合模式的 OBS 場景項物件。- type 參數
type
參數為混合模式,可使用如下obspython
模組變數來進行設定,OBS_BLEND_NORMAL
,OBS_BLEND_ADDITIVE
,OBS_BLEND_SUBTRACT
,OBS_BLEND_SCREEN
,OBS_BLEND_MULTIPLY
,OBS_BLEND_LIGHTEN
,OBS_BLEND_DARKEN
。
使用 Python 腳本取得和設定 OBS 場景項的混合方式
obspython
模組的obs_sceneitem_get_blending_method
,obs_sceneitem_set_blending_method
函式,可用於取得和設定 OBS 場景項的混合方式。
obs_sceneitem_get_blending_method(item)
obs_sceneitem_set_blending_method(item, method)
- item 參數
item
參數為需要取得或設定混合方式的 OBS 場景項物件。- method 參數
method
參數為混合方式,可使用如下obspython
模組變數來進行設定,OBS_BLEND_METHOD_DEFAULT
,OBS_BLEND_METHOD_SRGB_OFF
。
使用 Python 腳本取得和設定 OBS 場景項的 ID
OBS 場景項的 ID 是一個整數,不同場景項的 ID 不應相同,obspython
模組提供了以下與場景項 ID 有關的函式。
obs_sceneitem_get_id
函式,可用於取得 OBS 場景項的 ID。
obs_sceneitem_set_id
函式,可用於為 OBS 場景項指定一個唯一的 ID,該函式不應被經常使用,他可能會產生一些錯誤。
obs_sceneitem_get_id(item)
obs_sceneitem_set_id(item)
- item 參數
item
參數為需要取得或設定 ID 的場景項物件。
使用 Python 腳本新增和釋放對 OBS 場景項的參考
obspython
模組的obs_sceneitem_addref
函式,可用於為 OBS 場景項物件新增參考。每當你額外呼叫一次obs_sceneitem_addref
函式,就需要對等增加一次obs_sceneitem_release
函式的呼叫。
obspython
模組的obs_sceneitem_release
函式,可用於為 OBS 場景項物件釋放參考,他適用於obs_scene_sceneitem_from_source
函式所傳回的 OBS 場景項物件。
obs_sceneitem_addref(item)
obs_sceneitem_release(item)
- item 參數
item
參數為需要新增或釋放參考的 OBS 場景項物件。
使用 Python 腳本為場景建立並新增 OBS 群組
obspython
模組的obs_scene_add_group
,obs_scene_add_group2
函式,可用於為場景建立並新增 OBS 群組,OBS 群組物件會作為函式的傳回值。
obs_scene_add_group(scene, name)
obs_scene_add_group2(scene, name, signal)
- scene 參數
scene
參數為需要新增群組的 OBS 場景物件。- name 參數
name
參數為群組名稱。- signal 參數
signal
參數為True
時,訊號將重新整理。
使用 Python 腳本取得 OBS 群組
obspython
模組的obs_scene_get_group
函式,可用於取得場景中指定名稱的群組。
obs_scene_get_group(scene, name)
- scene 參數
scene
參數為需要取得的群組所在的 OBS 場景物件。- name 參數
name
參數為群組名稱。
使用 Python 腳本取消 OBS 群組
obspython
模組的obs_sceneitem_group_ungroup
,obs_sceneitem_group_ungroup2
函式,可用於取消一個 OBS 群組。
obs_sceneitem_group_ungroup(group)
obs_sceneitem_group_ungroup2(group, signal)
- group 參數
group
參數為需要取消的 OBS 群組物件。- signal 參數
signal
參數為True
時,訊號將重新整理。
使用 Python 腳本為 OBS 群組新增場景項
obspython
模組的obs_sceneitem_group_add_item
函式,可用於為 OBS 群組新增場景項。
obs_sceneitem_group_add_item(group, item)
- group 參數
group
參數為需要新增場景項的 OBS 群組物件。- item 參數
item
參數為需要新增的 OBS 場景項物件。
下面的程式碼,將建立新的群組Message
,並新增場景項Hi
。
def test(props, prop):
# …
# 建立一個新的群組,並將 Hi 加入其中
message = obs.obs_scene_add_group(scene, 'Message')
obs.obs_sceneitem_group_add_item(message, hi)
# …
使用 Python 腳本為 OBS 群組移除場景項
obspython
模組的obs_sceneitem_group_remove_item
函式,可用於移除 OBS 群組中的場景項。
obs_sceneitem_group_remove_item(group, item)
- group 參數
group
參數為需要移除場景項的 OBS 群組物件。- item 參數
item
參數為需要從群組中移除的 OBS 場景項物件。
使用 Python 腳本取得場景項所在的 OBS 群組
obspython
模組的obs_sceneitem_get_group
函式,可用於取得場景項所在的 OBS 群組。
obs_sceneitem_get_group(scene, item)
- scene 參數
scene
參數為需要取得的群組所在的 OBS 場景物件。- item 參數
item
參數為群組中包含的 OBS 場景項物件。
使用 Python 腳本取得 OBS 群組所在的場景
obspython
模組的obs_sceneitem_group_get_scene
函式,可用於取得群組所在的 OBS 場景。
obs_sceneitem_group_get_scene(group)
- group 參數
group
參數為需要取得場景的 OBS 群組物件。
使用 Python 腳本判斷場景項是否為 OBS 群組
obspython
模組的obs_sceneitem_is_group
函式,可用於判斷一個場景項是否為 OBS 群組。
obs_sceneitem_is_group(item)
- item 參數
item
參數為需要判斷是否為群組的 OBS 場景項物件。
在下面的程式碼中,我們首先取得了場景項Bye
所在的群組,然後判斷其是否為群組,理所當然,結果顯示為True
。
def test(props, prop):
# …
# 取得場景項 Bye 所在的群組
bye = obs.obs_scene_find_source_recursive(scene, 'Bye')
group = obs.obs_sceneitem_get_group(scene, bye)
obs.script_log(obs.LOG_INFO, f'是群組?{obs.obs_sceneitem_is_group(group)}')
# …
[items_and_groups.py] 是群組?True