OBS 連接器 go-obs-websocket

推薦理由

互聯網的興起帶動了直播行業的火熱,除了少數直播網站有自己的推流工具之外,OBS 是主流的推流工具,廣泛應用在直轉播技術之上。

簡介

go-obs-websocket 是一個與 OBS 進行 websocket 通信的連接庫,具備調用大部分 OBS 功能的接口,在互動直播和智能轉播技術上廣泛應用。

快速開始

安裝

go get github.com/christopher-dG/go-obs-websocket

obs 簡介

界面

![[obs.png]] 點擊 <工具> 可以設置 websocket 的參數,默認是監聽本地的 4444 端口

建立連接

 import obsws "github.com/christopher-dG/go-obs-websocket"

 c := obsws.Client{Host: "localhost", Port: 4444}
 if err := c.Connect(); err != nil {
  log.Fatal(err)
 }
 defer c.Disconnect()

發送請求

 // Send and receive a request asynchronously.
 req := obsws.NewGetStreamingStatusRequest()
 if err := req.Send(c); err != nil {
  log.Fatal(err)
 }

 // This will block until the response comes (potentially forever).
 resp, err := req.Receive()
 if err != nil {
  log.Fatal(err)
 }
 log.Println("streaming:", resp.Streaming)

go-obs-websocket  提供了衆多請求接口,可以使用如下命令獲取

#linux
go doc github.com/christopher-dG/go-obs-websocket |grep "Request " |grep type

#windows
go doc github.com/christopher-dG/go-obs-websocket |findstr "Request " | findstr type

接下來我們挑幾個常見的來看看使用案例

開始 / 停止推流

 req := obsws.NewStartStopStreamingRequest()
 if err := req.Send(c); err != nil {
  log.Fatal(err)
 }

 resp, err := req.Receive()
 if err != nil {
  log.Fatal(err)
 }
 log.Println("streaming:", resp.Status())

開始錄製

 req := obsws.NewStartRecordingRequest()
 if err := req.Send(c); err != nil {
  log.Fatal(err)
 }

 resp, err := req.Receive()
 if err != nil {
  log.Fatal(err)
 }
 log.Println("streaming:", resp.Status())

停止錄製

 req := obsws.NewStopRecordingRequest()
 if err := req.Send(c); err != nil {
  log.Fatal(err)
 }

 resp, err := req.Receive()
 if err != nil {
  log.Fatal(err)
 }
 log.Println("streaming:", resp.Status())

轉換場景

 req := obsws.NewSetCurrentSceneRequest("scene1")
 if err := req.Send(c); err != nil {
  log.Fatal(err)
 }

 resp, err := req.Receive()
 if err != nil {
  log.Fatal(err)
 }
 log.Println("streaming:", resp.Status())

處理響應

    c.AddEventHandler("SwitchScenes", func(e obsws.Event) {
        // Make sure to assert the actual event type.
        log.Println("new scene:", e.(obsws.SwitchScenesEvent).SceneName)
    })

註冊鉤子函數,響應 OBS 的信號。一共可註冊的鉤子函數 key 如下:

"SwitchScenes"                  場景切換
"ScenesChanged"                 場景變化
"SceneCollectionChanged"        場景來源變化
"SceneCollectionListChanged"    場景來源列表變化
"SwitchTransition"              轉場
"TransitionListChanged"         轉場列表變化
"TransitionDurationChanged"     轉場時長變化
"TransitionBegin"               開始轉場
"ProfileChanged"                配置變化
"ProfileListChanged"            配置文件列表變化
"StreamStarting"                推流開始啓動
"StreamStarted"                 推流啓動完成
"StreamStopping"                推流正在停止
"StreamStopped"                 推流已暫停
"StreamStatus"                  推流狀態
"RecordingStarting"             
"RecordingStarted"              
"RecordingStopping"             
"RecordingStopped"              
"RecordingPaused"               
"RecordingResumed"              
"ReplayStarting"                回放
"ReplayStarted"                 
"ReplayStopping"                
"ReplayStopped"                 
"Exiting"                      退出 
"Heartbeat"                    心跳 
"BroadcastCustomMessage"       廣播消息 
"SourceCreated"                來源創建
"SourceDestroyed"              來源銷燬
"SourceVolumeChanged"          來源音頻改變
"SourceMuteStateChanged"       音量改變
"SourceAudioSyncOffsetChanged" 
"SourceAudioMixersChanged"      
"SourceRenamed"                 
"SourceFilterAdded"            濾波添加 
"SourceFilterRemoved"          濾波移除
"SourceFilterVisibilityChanged" 濾波可見性改變
"SourceFiltersReordered"        
"SourceOrderChanged"           來源順序變換 
"SceneItemAdded"               場景元素添加
"SceneItemRemoved"             場景元素移除 
"SceneItemVisibilityChanged"    
"SceneItemTransformChanged"     
"SceneItemSelected"             
"SceneItemDeselected"           
"PreviewSceneChanged"           
"StudioModeSwitched"

總結

OBS 是使用最廣的推流工具,利用 go-obs-websocket 可以很方便的操作大部分功能,目前在日常操作中只有創建場景的接口沒有找到。比如我們可以做一系列的轉場,在直播推流過程中監聽事件自動觸發,或者做一些特效能隨着轉場漸入漸出。祝大家玩的開心!!

參考資料

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/2mp-diSmpr2LJHEnJ93Svw