如何操作 OBS 音频来源,视频来源,媒体源
关注 1421
前提
阅读本节的前提是对 OBS 来源有所掌握,你可以查看如何操作 OBS 来源?来源对象介绍一节来了解相关信息。
OBS 音频来源和视频来源
OBS 的音频来源可用于输出的音频渲染,这包含音频输入采集,音频输出采集,视频采集设备等。OBS 的视频来源可用于输出的视频渲染,比如视频采集设备。Python 脚本可通过obspython
模块提供的函数,来控制音频来源和视频来源。
获取和设置 OBS 音频来源的音量
音频来源的音量决定了该音频在输出中的声音大小,在 Python 脚本中,音量可表示为一个取值在0
至1
之间的小数,数值越大音量越高。
obspython
模块的obs_source_get_volume
,obs_source_set_volume
函数,可用于获取和设置音频来源的音量。
obs_source_get_volume(source)
obs_source_set_volume(source, volume)
- source 参数
source
参数为需要获取或设置音量的音频来源对象。- 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
获取和设置 OBS 音频来源是否静音
当音频来源处于静音状态时,其感官效果与音量为0
类似。
obspython
模块的obs_source_muted
,obs_source_set_muted
函数,可用于获取和设置音频来源的静音状态。
obs_source_muted(source)
obs_source_set_muted(source, muted)
- source 参数
source
参数为需要获取或设置静音状态的音频来源对象。- muted 参数
muted
参数为希望设置的静音状态,True
表示静音。
在下面的代码中,我们取消了音频输入采集的静音状态。
def test(props, prop):
# …
# 如果音频输入采集处于静音状态,则取消该状态
if obs.obs_source_muted(audio):
obs.obs_source_set_muted(audio, False)
# …
获取和设置 OBS 音频来源的音频监听方式
音频来源的音频监听方式,用于控制用户如何监听音频来源,他拥有以下三个选项。
关闭监听,表示用户不会听到音频来源的声音,但该音频来源依然会被渲染至输出,这意味着观众可以听到或录制的视频中包含。仅监听,与关闭监听相反,用户可以听到音频来源的声音,但该音频来源不会渲染至输出。监听并输出,表示音频来源的声音不但可以被用户听到,还将渲染输出。
obspython
模块的obs_source_get_monitoring_type
,obs_source_set_monitoring_type
函数,可用于获取和设置音频来源的音频监听方式。
obs_source_get_monitoring_type(source)
obs_source_set_monitoring_type(source, type)
- source 参数
source
参数为需要获取或设置音频监听方式的音频来源对象。- 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)
# …
获取和设置 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_source_get_audio_mixers(source)
obs_source_set_audio_mixers(source, mixers)
- source 参数
source
参数为需要获取或设置轨道的音频来源对象。- 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))
# …
获取和设置 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_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
参数为需要获取或设置是否启用按住静音或讲话的音频来源对象。- 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_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
参数为需要获取或设置按住静音或讲话延时的音频来源对象。- 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)
# …
获取和设置 OBS 音频来源的声道平衡
如果音频来源支持左右声道的话,那么你可以在 Python 脚本中调整左右声道的平衡,其有效取值在0
至1
之间,数值越大越趋向于右声道,数值越小越趋向于左声道,0.5
表示左右声道处于平衡。
obspython
模块的obs_source_get_balance_value
,obs_source_set_balance_value
函数,可用于获取和设置音频来源的声道平衡。
obs_source_get_balance_value(source)
obs_source_set_balance_value(source, balance)
- source 参数
source
参数为需要获取或设置声道平衡的音频来源对象。- balance 参数
balance
参数为希望设置的平衡状态,有效取值在0
到1
之间。
获取 OBS 音频来源的扬声器布局
obspython
模块的obs_source_get_speaker_layout
函数,可用于获取表示音频来源扬声器布局的整数。
obs_source_get_speaker_layout(source)
- source 参数
source
参数为需要获取扬声器布局的音频来源对象。
获取和设置 OBS 视频来源的相关信息
obspython
模块的obs_source_get_color_space
函数,可用于获取表示视频来源色彩空间的整数。
obs_source_get_color_space(source)
- source 参数
source
参数为需要获取色彩空间的视频来源对象。
obspython
模块的obs_source_get_texcoords_centered
函数,可用于获取视频来源是否混合纹理。
obs_source_get_texcoords_centered(source)
- source 参数
source
参数为需要获取是否混合纹理的视频来源对象。
获取和设置 OBS 视频来源的逐行扫描设置
obspython
模块的obs_source_get_deinterlace_mode
,obs_source_set_deinterlace_mode
函数,可用于获取和设置视频来源的逐行扫描模式。逐行扫描模式可以是如下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
参数为需要获取或设置逐行扫描模式的视频来源对象。- mode 参数
mode
参数为需要设置的逐行扫描模式。
obspython
模块的obs_source_get_deinterlace_field_order
,obs_source_set_deinterlace_field_order
函数,可用于获取视频来源的逐行扫描场顺序。逐行扫描场顺序可以是如下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
参数为需要获取或设置逐行扫描场顺序的视频来源对象。- order 参数
order
参数为需要设置的逐行扫描场顺序。
Python 脚本中的 OBS 媒体源
OBS 媒体源可用于在 OBS 中播放媒体内容,比如音频或视频文件,Python 脚本可以通过obspython
模块提供的函数,来控制媒体源。
如何指定媒体源的本地文件路径?
obspython
模块并未给出一个针对性的函数,用于设置媒体源的本地文件路径,你需要修改媒体源的来源设置对象(设置项名称为local_file
),并使用obs_source_update
函数进行更新,以完成此目标。
来源
关于设置 OBS 来源的设置,你可以查看获取和设置 OBS 来源的设置一段。
控制 OBS 媒体源的播放
obspython
模块的obs_source_media_play_pause
函数,可用于播放或暂停媒体源,obs_source_media_restart
函数,可用于重新播放媒体源,obs_source_media_stop
函数,可用于停止媒体源。
obs_source_media_play_pause(source, pause)
obs_source_media_restart(source)
obs_source_media_stop(source)
- source 参数
source
参数为媒体源对象。- pause 参数
pause
参数为False
时将播放,为True
时将暂停播放。
获取 OBS 媒体源的持续时间
obspython
模块的obs_source_media_get_duration
函数,可用于获取媒体源对应媒体文件的持续时间,也就是音频或视频文件的时长,以毫秒为单位。
obs_source_media_get_duration(source)
- source 参数
source
参数为需要获取持续时间的媒体源对象。
获取和设置 OBS 媒体源的当前时间
obspython
模块的obs_source_media_get_time
和obs_source_media_set_time
函数,可用于获取和设置媒体源的当前时间,也就是音频或视频文件的当前播放位置,以毫秒为单位,如果没有有效的媒体文件,则会返回0
。
obs_source_media_get_time(source)
obs_source_media_set_time(source, ms)
- source 参数
source
参数为需要获取或设置当前时间的媒体源对象。- 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)
获取 OBS 媒体源的状态
obspython
模块的obs_source_media_get_state
函数,可用于获取媒体源的状态,他可能等于以下某个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
参数为需要获取状态的媒体源对象。
在下面的代码中,如果媒体源的状态为正在播放,那么将暂停媒体源,如果媒体源的状态为已暂停,那么将播放媒体源,如果媒体源的状态为已停止或已播放完毕,那么将重新播放媒体源。
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)
# …