如何使用 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