如何使用 Python 腳本操作 OBS 音訊來源,視訊來源,媒體來源

閱讀 17:29·字數 5247·發佈 
Youtube 頻道
訂閱 133

先決條件

閱讀本節的先決條件是對 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