如何操作 OBS 音频来源,视频来源,媒体源
关注 1800
前提
阅读本节的前提是对 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)
# …