URLhttps://learnscript.net/zh/obs-python-scripting/sources/audio-and-video/
    复制链接转到说明  示例

    如何操作 OBS 音频来源,视频来源,媒体源

    我被代码海扁署名-非商业-禁演绎
    阅读 16:52·字数 5064·发布 

    前提

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

    OBS 音频来源和视频来源

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

    获取和设置 OBS 音频来源的音量

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

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

    obs_source_get_volume(source)
    obs_source_set_volume(source, volume)

    source 参数

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

    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

    获取和设置 OBS 音频来源是否静音

    当音频来源处于静音状态时,其感官效果与音量为0类似。

    obspython模块的obs_source_mutedobs_source_set_muted函数,可用于获取和设置音频来源的静音状态。

    obs_source_muted(source)
    obs_source_set_muted(source, muted)

    source 参数

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

    muted 参数

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

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

    audio_and_video.py
    def test(props, prop):
    	# …
    	# 如果音频输入采集处于静音状态,则取消该状态
    	if obs.obs_source_muted(audio):
    		obs.obs_source_set_muted(audio, False)
    	# …

    获取和设置 OBS 音频来源的音频监听方式

    音频来源的音频监听方式,用于控制用户如何监听音频来源,他拥有以下三个选项。

    关闭监听,表示用户不会听到音频来源的声音,但该音频来源依然会被渲染至输出,这意味着观众可以听到或录制的视频中包含。仅监听,与关闭监听相反,用户可以听到音频来源的声音,但该音频来源不会渲染至输出。监听并输出,表示音频来源的声音不但可以被用户听到,还将渲染输出。

    obspython模块的obs_source_get_monitoring_typeobs_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表示监听并输出。

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

    obs_source_get_audio_mixers(source)
    obs_source_set_audio_mixers(source, mixers)

    source 参数

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

    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))
    	# …

    获取和设置 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_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_delayobs_source_set_push_to_mute_delayobs_source_get_push_to_talk_delayobs_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参数为按住静音或讲话的延时,以毫秒为单位。

    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)
    	# …

    获取和设置 OBS 音频来源的声道平衡

    如果音频来源支持左右声道的话,那么你可以在 Python 脚本中调整左右声道的平衡,其有效取值在01之间,数值越大越趋向于右声道,数值越小越趋向于左声道,0.5表示左右声道处于平衡。

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

    obs_source_get_balance_value(source)
    obs_source_set_balance_value(source, balance)

    source 参数

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

    balance 参数

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

    获取 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_modeobs_source_set_deinterlace_mode函数,可用于获取和设置视频来源的逐行扫描模式。逐行扫描模式可以是如下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参数为需要获取或设置逐行扫描模式的视频来源对象。

    mode 参数

    mode参数为需要设置的逐行扫描模式。

    obspython模块的obs_source_get_deinterlace_field_orderobs_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_timeobs_source_media_set_time函数,可用于获取和设置媒体源的当前时间,也就是音频或视频文件的当前播放位置,以毫秒为单位,如果没有有效的媒体文件,则会返回0

    obs_source_media_get_time(source)
    obs_source_media_set_time(source, ms)

    source 参数

    source参数为需要获取或设置当前时间的媒体源对象。

    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)

    获取 OBS 媒体源的状态

    obspython模块的obs_source_media_get_state函数,可用于获取媒体源的状态,他可能等于以下某个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参数为需要获取状态的媒体源对象。

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

    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