如何使用 Python 脚本操作 OBS 音频来源,视频来源,媒体源
前提
阅读本节的前提是对 OBS 来源有所掌握,你可以查看如何使用 Python 脚本操作 OBS 来源?OBS 来源对象介绍一节来了解相关信息。
Python 脚本中的 OBS 音频来源和视频来源
OBS 的音频来源可用于 OBS 输出的音频渲染,这包含音频输入采集,音频输出采集,视频采集设备等。OBS 的视频来源可用于 OBS 输出的视频渲染,比如视频采集设备。Python 脚本可通过obspython
模块提供的函数,来控制 OBS 音频来源和视频来源。
使用 Python 脚本获取和设置 OBS 音频来源的音量
OBS 音频来源的音量决定了该音频在 OBS 输出中的声音大小,在 Python 脚本中,音量可表示为一个取值在0
至1
之间的小数,数值越大音量越高。
obspython
模块的obs_source_get_volume
,obs_source_set_volume
函数,可用于获取和设置 OBS 音频来源的音量。
obs_source_get_volume(source)
obs_source_set_volume(source, volume)
- source 参数
source
参数为需要获取或设置音量的 OBS 音频来源对象。- volume 参数
volume
参数为希望设置的音量,有效取值在0
到1
之间。
在按钮的回调函数test
中,我们设置了名称为OS
的音频输入采集的音量。
# 导入模块 obspython
import obspython as obs
def test(props, prop):
# 获取名称为 OS 的音频输入采集
audio = obs.obs_get_source_by_name('OS')
# 将音频输入采集的音量设置为 0.5
obs.obs_source_set_volume(audio, 0.5)
# 释放来源对象
obs.obs_source_release(audio)
# 为脚本添加一个用于测试的按钮,回调函数为 test
def script_properties():
props = obs.obs_properties_create()
obs.obs_properties_add_button(props, 'test', '测试', test)
return props
使用 Python 脚本获取和设置 OBS 音频来源是否静音
当 OBS 音频来源处于静音状态时,其感官效果与音量为0
类似。
obspython
模块的obs_source_muted
,obs_source_set_muted
函数,可用于获取和设置 OBS 音频来源的静音状态。
obs_source_muted(source)
obs_source_set_muted(source, muted)
- source 参数
source
参数为需要获取或设置静音状态的 OBS 音频来源对象。- muted 参数
muted
参数为希望设置的静音状态,True
表示静音。
在下面的代码中,我们取消了音频输入采集的静音状态。
def test(props, prop):
# …
# 如果音频输入采集处于静音状态,则取消该状态
if obs.obs_source_muted(audio):
obs.obs_source_set_muted(audio, False)
# …
使用 Python 脚本获取和设置 OBS 音频来源的音频监听方式
OBS 音频来源的音频监听方式,用于控制 OBS 用户如何监听音频来源,他拥有以下三个选项。
关闭监听,表示 OBS 用户不会听到音频来源的声音,但该音频来源依然会被渲染至 OBS 输出,这意味着观众可以听到或录制的视频中包含。仅监听,与关闭监听相反,OBS 用户可以听到音频来源的声音,但该音频来源不会渲染至 OBS 输出。监听并输出,表示音频来源的声音不但可以被 OBS 用户听到,还将渲染输出。
obspython
模块的obs_source_get_monitoring_type
,obs_source_set_monitoring_type
函数,可用于获取和设置 OBS 音频来源的音频监听方式。
obs_source_get_monitoring_type(source)
obs_source_set_monitoring_type(source, type)
- source 参数
source
参数为需要获取或设置音频监听方式的 OBS 音频来源对象。- type 参数
type
参数为希望设置的音频监听方式,可使用如下obspython
模块变量进行设置,OBS_MONITORING_TYPE_NONE
表示关闭监听,OBS_MONITORING_TYPE_MONITOR_ONLY
表示仅监听,OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT
表示监听并输出。
def test(props, prop):
# …
# 关闭对音频输入采集的监听
obs.obs_source_set_monitoring_type(audio, obs.OBS_MONITORING_TYPE_NONE)
# …
使用 Python 脚本获取和设置 OBS 音频来源的轨道
OBS 支持音频来源输出至一个或多个轨道,直播和视频录制可以分别选择其中的某个轨道进行渲染,这使得直播和视频中的声音可能是不同的。
轨道的表示是按照 bit 进行的,在 Python 脚本中,你可以采用类似于1<<n
这样语句,来表示第n+1
条轨道(n
大于等于0
,小于等于5
)。如果希望组合轨道,则可以书写(1<<n)|(1<<m)
,比如(1<<0)|(1<<5)
表示第 1 条轨道与第 6 条轨道的组合。如果要确定是否含有某条轨道,则可以判断x&(1<<n)
是否与n+1
相等,其中,x
为轨道组合对应的整数,比如195&(1<<1)==2
可以判断轨道组合195
是否包含第 2 条轨道。
obspython
模块的obs_source_get_audio_mixers
,obs_source_set_audio_mixers
函数,可用于获取和设置 OBS 音频来源的混合轨道。
obs_source_get_audio_mixers(source)
obs_source_set_audio_mixers(source, mixers)
- source 参数
source
参数为需要获取或设置轨道的 OBS 音频来源对象。- mixers 参数
mixers
参数为希望设置的混合轨道或轨道组合。
在下面的代码中,我们判断音频输入采集是否输出至了第 1 条音轨,如果没有则添加。
def test(props, prop):
# …
# 如果音频输入采集没有输出至第 1 条音轨,则添加
mixers = obs.obs_source_get_audio_mixers(audio)
if mixers & (1 << 0) != 1:
obs.obs_source_set_audio_mixers(audio, mixers | (1 << 0))
# …
使用 Python 脚本获取和设置 OBS 音频来源的按住讲话和按住静音
对于 OBS 的音频来源,按住静音表示在按住某个键时音频来源将处于静音状态,按住讲话表示在按住某个键时音频来源将解除静音状态。
obspython
模块的obs_source_push_to_mute_enabled
,obs_source_enable_push_to_mute
,obs_source_push_to_talk_enabled
,obs_source_enable_push_to_talk
函数,可用于获取和设置 OBS 音频来源是否启用了按住静音,按住讲话。
obs_source_push_to_mute_enabled(source)
obs_source_enable_push_to_mute(source, enabled)
obs_source_push_to_talk_enabled(source)
obs_source_enable_push_to_talk(source, enabled)
- source 参数
source
参数为需要获取或设置是否启用按住静音或讲话的 OBS 音频来源对象。- enabled 参数
enabled
参数为是否启用按住静音或讲话,True
表示启用。
obspython
模块的obs_source_get_push_to_mute_delay
,obs_source_set_push_to_mute_delay
,obs_source_get_push_to_talk_delay
,obs_source_set_push_to_talk_delay
函数,可用于获取和设置 OBS 音频来源的按住静音和按住讲话的延迟时间。
obs_source_get_push_to_mute_delay(source)
obs_source_set_push_to_mute_delay(source, delay)
obs_source_get_push_to_talk_delay(source)
obs_source_set_push_to_talk_delay(source, delay)
- source 参数
source
参数为需要获取或设置按住静音或讲话延时的 OBS 音频来源对象。- delay 参数
delay
参数为按住静音或讲话的延时,以毫秒为单位。
def test(props, prop):
# …
# 启用音频输入采集的按住静音,并设置延迟时间
obs.obs_source_enable_push_to_mute(audio, True)
obs.obs_source_set_push_to_mute_delay(audio, 2000)
# …
使用 Python 脚本获取和设置 OBS 音频来源的声道平衡
如果 OBS 音频来源支持左右声道的话,那么你可以在 Python 脚本中调整左右声道的平衡,其有效取值在0
至1
之间,数值越大越趋向于右声道,数值越小越趋向于左声道,0.5
表示左右声道处于平衡。
obspython
模块的obs_source_get_balance_value
,obs_source_set_balance_value
函数,可用于获取和设置 OBS 音频来源的声道平衡。
obs_source_get_balance_value(source)
obs_source_set_balance_value(source, balance)
- source 参数
source
参数为需要获取或设置声道平衡的 OBS 音频来源对象。- balance 参数
balance
参数为希望设置的平衡状态,有效取值在0
到1
之间。
使用 Python 脚本获取 OBS 音频来源的扬声器布局
obspython
模块的obs_source_get_speaker_layout
函数,可用于获取表示 OBS 音频来源扬声器布局的整数。
obs_source_get_speaker_layout(source)
- source 参数
source
参数为需要获取扬声器布局的 OBS 音频来源对象。
使用 Python 脚本获取和设置 OBS 视频来源的相关信息
obspython
模块的obs_source_get_color_space
函数,可用于获取表示 OBS 视频来源色彩空间的整数。
obs_source_get_color_space(source)
- source 参数
source
参数为需要获取色彩空间的 OBS 视频来源对象。
obspython
模块的obs_source_get_texcoords_centered
函数,可用于获取 OBS 视频来源是否混合纹理。
obs_source_get_texcoords_centered(source)
- source 参数
source
参数为需要获取是否混合纹理的 OBS 视频来源对象。
使用 Python 脚本获取和设置 OBS 视频来源的逐行扫描设置
obspython
模块的obs_source_get_deinterlace_mode
,obs_source_set_deinterlace_mode
函数,可用于获取和设置 OBS 视频来源的逐行扫描模式。逐行扫描模式可以是如下obspython
模块变量之一,OBS_DEINTERLACE_MODE_DISABLE
,OBS_DEINTERLACE_MODE_DISCARD
,OBS_DEINTERLACE_MODE_RETRO
,OBS_DEINTERLACE_MODE_BLEND
,OBS_DEINTERLACE_MODE_BLEND_2X
,OBS_DEINTERLACE_MODE_LINEAR
,OBS_DEINTERLACE_MODE_LINEAR_2X
,OBS_DEINTERLACE_MODE_YADIF
,OBS_DEINTERLACE_MODE_YADIF_2X
。
obs_source_get_deinterlace_mode(source)
obs_source_set_deinterlace_mode(source, mode)
- source 参数
source
参数为需要获取或设置逐行扫描模式的 OBS 视频来源对象。- mode 参数
mode
参数为需要设置的逐行扫描模式。
obspython
模块的obs_source_get_deinterlace_field_order
,obs_source_set_deinterlace_field_order
函数,可用于获取 OBS 视频来源的逐行扫描场顺序。逐行扫描场顺序可以是如下obspython
模块变量之一,OBS_DEINTERLACE_FIELD_ORDER_TOP
(从顶部开始),OBS_DEINTERLACE_FIELD_ORDER_BOTTOM
(从底部开始)。
obs_source_get_deinterlace_field_order(source)
obs_source_set_deinterlace_field_order(source, order)
- source 参数
source
参数为需要获取或设置逐行扫描场顺序的 OBS 视频来源对象。- order 参数
order
参数为需要设置的逐行扫描场顺序。
Python 脚本中的 OBS 媒体源
OBS 媒体源可用于在 OBS 中播放媒体内容,比如音频或视频文件,Python 脚本可以通过obspython
模块提供的函数,来控制 OBS 媒体源。
如何使用 Python 脚本指定 OBS 媒体源的本地文件路径?
OBS 的obspython
模块并未给出一个针对性的函数,用于设置 OBS 媒体源的本地文件路径,你需要修改媒体源的来源设置对象(设置项名称为local_file
),并使用obs_source_update
函数进行更新,以完成此目标。
来源
关于设置 OBS 来源的设置,你可以查看使用 Python 脚本获取和设置 OBS 来源的设置一段。
使用 Python 脚本控制 OBS 媒体源的播放
obspython
模块的obs_source_media_play_pause
函数,可用于播放或暂停 OBS 媒体源,obs_source_media_restart
函数,可用于重新播放 OBS 媒体源,obs_source_media_stop
函数,可用于停止 OBS 媒体源。
obs_source_media_play_pause(source, pause)
obs_source_media_restart(source)
obs_source_media_stop(source)
- source 参数
source
参数为 OBS 媒体源对象。- pause 参数
pause
参数为False
时将播放,为True
时将暂停播放。
使用 Python 脚本获取 OBS 媒体源的持续时间
obspython
模块的obs_source_media_get_duration
函数,可用于获取 OBS 媒体源对应媒体文件的持续时间,也就是音频或视频文件的时长,以毫秒为单位。
obs_source_media_get_duration(source)
- source 参数
source
参数为需要获取持续时间的 OBS 媒体源对象。
使用 Python 脚本获取和设置 OBS 媒体源的当前时间
obspython
模块的obs_source_media_get_time
和obs_source_media_set_time
函数,可用于获取和设置 OBS 媒体源的当前时间,也就是音频或视频文件的当前播放位置,以毫秒为单位,如果没有有效的媒体文件,则会返回0
。
obs_source_media_get_time(source)
obs_source_media_set_time(source, ms)
- source 参数
source
参数为需要获取或设置当前时间的 OBS 媒体源对象。- ms 参数
ms
参数为希望设置的当前时间,以毫秒为单位。
下面的代码,将获取媒体源Media
的持续时间和当前时间,从而计算播放进度。
def test(props, prop):
# …
# 获取名称为 Media 的媒体源
media = obs.obs_get_source_by_name('Media')
# 获取持续时间和当前时间,并计算播放进度
duration = obs.obs_source_media_get_duration(media)
time = obs.obs_source_media_get_time(media)
obs.script_log(obs.LOG_INFO, f'Media 播放进度 {int(time * 100 / duration)}%')
# 释放来源对象
obs.obs_source_release(media)
使用 Python 脚本获取 OBS 媒体源的状态
obspython
模块的obs_source_media_get_state
函数,可用于获取 OBS 媒体源的状态,他可能等于以下某个obspython
模块变量,OBS_MEDIA_STATE_NONE
,OBS_MEDIA_STATE_PLAYING
(正在播放),OBS_MEDIA_STATE_OPENING
(正在打开),OBS_MEDIA_STATE_BUFFERING
(正在缓冲),OBS_MEDIA_STATE_PAUSED
(已暂停),OBS_MEDIA_STATE_STOPPED
(已停止),OBS_MEDIA_STATE_ENDED
(已播放完毕),OBS_MEDIA_STATE_ERROR
(错误)。
obs_source_media_get_state(source)
- source 参数
source
参数为需要获取状态的 OBS 媒体源对象。
在下面的代码中,如果媒体源的状态为正在播放,那么将暂停媒体源,如果媒体源的状态为已暂停,那么将播放媒体源,如果媒体源的状态为已停止或已播放完毕,那么将重新播放媒体源。
def test(props, prop):
# …
# 切换媒体源的各种状态
state = obs.obs_source_media_get_state(media)
if state == obs.OBS_MEDIA_STATE_PLAYING:
obs.obs_source_media_play_pause(media, True)
elif state == obs.OBS_MEDIA_STATE_PAUSED:
obs.obs_source_media_play_pause(media, False)
elif state == obs.OBS_MEDIA_STATE_STOPPED or state == obs.OBS_MEDIA_STATE_ENDED:
obs.obs_source_media_restart(media)
# …