如何使用 Python 脚本操作 OBS 音频来源,视频来源,媒体源

我被代码海扁署名-非商业-禁演绎
阅读 17:21·字数 5207·发布 
Bilibili 空间
关注 960

前提

阅读本节的前提是对 OBS 来源有所掌握,你可以查看如何使用 Python 脚本操作 OBS 来源?OBS 来源对象介绍一节来了解相关信息。

Python 脚本中的 OBS 音频来源和视频来源

OBS 的音频来源可用于 OBS 输出的音频渲染,这包含音频输入采集,音频输出采集,视频采集设备等。OBS 的视频来源可用于 OBS 输出的视频渲染,比如视频采集设备。Python 脚本可通过obspython模块提供的函数,来控制 OBS 音频来源和视频来源。

使用 Python 脚本获取和设置 OBS 音频来源的音量

OBS 音频来源的音量决定了该音频在 OBS 输出中的声音大小,在 Python 脚本中,音量可表示为一个取值在01之间的小数,数值越大音量越高。

obspython模块的obs_source_get_volumeobs_source_set_volume函数,可用于获取和设置 OBS 音频来源的音量。

obs_source_get_volume(source)
obs_source_set_volume(source, volume)

source 参数

source参数为需要获取或设置音量的 OBS 音频来源对象。

volume 参数

volume参数为希望设置的音量,有效取值在01之间。

在按钮的回调函数test中,我们设置了名称为OS的音频输入采集的音量。

audio_and_video.py
# 导入模块 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_mutedobs_source_set_muted函数,可用于获取和设置 OBS 音频来源的静音状态。

obs_source_muted(source)
obs_source_set_muted(source, muted)

source 参数

source参数为需要获取或设置静音状态的 OBS 音频来源对象。

muted 参数

muted参数为希望设置的静音状态,True表示静音。

在下面的代码中,我们取消了音频输入采集的静音状态。

audio_and_video.py
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_typeobs_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表示监听并输出。

audio_and_video.py
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_mixersobs_source_set_audio_mixers函数,可用于获取和设置 OBS 音频来源的混合轨道。

obs_source_get_audio_mixers(source)
obs_source_set_audio_mixers(source, mixers)

source 参数

source参数为需要获取或设置轨道的 OBS 音频来源对象。

mixers 参数

mixers参数为希望设置的混合轨道或轨道组合。

在下面的代码中,我们判断音频输入采集是否输出至了第 1 条音轨,如果没有则添加。

audio_and_video.py
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_enabledobs_source_enable_push_to_muteobs_source_push_to_talk_enabledobs_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_delayobs_source_set_push_to_mute_delayobs_source_get_push_to_talk_delayobs_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参数为按住静音或讲话的延时,以毫秒为单位。

audio_and_video.py
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 脚本中调整左右声道的平衡,其有效取值在01之间,数值越大越趋向于右声道,数值越小越趋向于左声道,0.5表示左右声道处于平衡。

obspython模块的obs_source_get_balance_valueobs_source_set_balance_value函数,可用于获取和设置 OBS 音频来源的声道平衡。

obs_source_get_balance_value(source)
obs_source_set_balance_value(source, balance)

source 参数

source参数为需要获取或设置声道平衡的 OBS 音频来源对象。

balance 参数

balance参数为希望设置的平衡状态,有效取值在01之间。

使用 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_modeobs_source_set_deinterlace_mode函数,可用于获取和设置 OBS 视频来源的逐行扫描模式。逐行扫描模式可以是如下obspython模块变量之一,OBS_DEINTERLACE_MODE_DISABLEOBS_DEINTERLACE_MODE_DISCARDOBS_DEINTERLACE_MODE_RETROOBS_DEINTERLACE_MODE_BLENDOBS_DEINTERLACE_MODE_BLEND_2XOBS_DEINTERLACE_MODE_LINEAROBS_DEINTERLACE_MODE_LINEAR_2XOBS_DEINTERLACE_MODE_YADIFOBS_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_orderobs_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_timeobs_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的持续时间和当前时间,从而计算播放进度。

audio_and_video.py
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_NONEOBS_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 媒体源对象。

在下面的代码中,如果媒体源的状态为正在播放,那么将暂停媒体源,如果媒体源的状态为已暂停,那么将播放媒体源,如果媒体源的状态为已停止或已播放完毕,那么将重新播放媒体源。

audio_and_video.py
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)
	# …

源码

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