如何使用 Python 腳本操作 OBS 音訊來源,視訊來源,媒體來源
先決條件
閱讀本節的先決條件是對 OBS 來源有所掌握,你可以檢視如何使用 Python 腳本操作 OBS 來源?OBS 來源物件介紹一節來了解相關資訊。
Python 腳本中的 OBS 音訊來源和視訊來源
OBS 的音訊來源可用於 OBS 輸出的音訊算繪,這包含擷取音訊輸入,擷取音訊輸出,視訊擷取裝置等。OBS 的視訊來源可用於 OBS 輸出的視訊算繪,比如視訊擷取裝置。Python 腳本可通過obspython
模組提供的函式,來控製 OBS 音訊來源和視訊來源。
使用 Python 腳本取得和設定 OBS 音訊來源的音量
OBS 音訊來源的音量決定了該音訊在 OBS 輸出中的聲音大小,在 Python 腳本中,音量可表示為一個取值在0
至1
之間的小數,數值越大音量越高。
obspython
模組的obs_source_get_volume
,obs_source_set_volume
函式,可用於取得和設定 OBS 音訊來源的音量。
obs_source_get_volume(source)
obs_source_set_volume(source, volume)
- source 參數
source
參數為需要取得或設定音量的 OBS 音訊來源物件。- 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
使用 Python 腳本取得和設定 OBS 音訊來源是否靜音
當 OBS 音訊來源處於靜音狀態時,其感官效果與音量為0
類似。
obspython
模組的obs_source_muted
,obs_source_set_muted
函式,可用於取得和設定 OBS 音訊來源的靜音狀態。
obs_source_muted(source)
obs_source_set_muted(source, muted)
- source 參數
source
參數為需要取得或設定靜音狀態的 OBS 音訊來源物件。- muted 參數
muted
參數為希望設定的靜音狀態,True
表示靜音。
在下面的程式碼中,我們取消了擷取音訊輸入的靜音狀態。
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_type
,obs_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
表示監測並輸出。
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_mixers
,obs_source_set_audio_mixers
函式,可用於取得和設定 OBS 音訊來源的混合音軌。
obs_source_get_audio_mixers(source)
obs_source_set_audio_mixers(source, mixers)
- source 參數
source
參數為需要取得或設定音軌的 OBS 音訊來源物件。- 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))
# …
使用 Python 腳本取得和設定 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 音訊來源是否啟用了按住靜音,按住講話。
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_delay
,obs_source_set_push_to_mute_delay
,obs_source_get_push_to_talk_delay
,obs_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
參數為按住靜音或講話的延時,以毫秒為單位。
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 腳本中調整左右聲道的平衡,其有效取值在0
至1
之間,數值越大越趨向於右聲道,數值越小越趨向於左聲道,0.5
表示左右聲道處於平衡。
obspython
模組的obs_source_get_balance_value
,obs_source_set_balance_value
函式,可用於取得和設定 OBS 音訊來源的聲道平衡。
obs_source_get_balance_value(source)
obs_source_set_balance_value(source, balance)
- source 參數
source
參數為需要取得或設定聲道平衡的 OBS 音訊來源物件。- balance 參數
balance
參數為希望設定的平衡狀態,有效取值在0
到1
之間。
使用 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_mode
,obs_source_set_deinterlace_mode
函式,可用於取得和設定 OBS 視訊來源的循序掃描模式。循序掃描模式可以是如下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
參數為需要取得或設定循序掃描模式的 OBS 視訊來源物件。- mode 參數
mode
參數為需要設定的循序掃描模式。
obspython
模組的obs_source_get_deinterlace_field_order
,obs_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_time
和obs_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
的持續時間和目前時間,從而計算播放進度。
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_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
參數為需要取得狀態的 OBS 媒體來源物件。
在下面的程式碼中,如果媒體來源的狀態為正在播放,那麽將暫停媒體來源,如果媒體來源的狀態為已暫停,那麽將播放媒體來源,如果媒體來源的狀態為已停止或已播放完畢,那麽將重新播放媒體來源。
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)
# …