前言
最近一直在研究孿生數字人wav2lip。目前成果可直接輸入高清嘴型,2070顯卡1分鐘音頻2.6分鐘輸出。在直播邏輯上可以做到1比1.3這樣,所以現在開始研究直播。在邏輯上涉及到了無縫切換,看到csdn上有一篇文章還要vip解鎖。。。那自己研究吧!在這里我們以我現在的邏輯來實現一下無縫切換!
舉一個例子
來梳理一下我的邏輯,通過obs推場景1中的一個視頻,循環播放一個不說話閉嘴的視頻。當生成好說話的視頻后控制obs修改場景2的來源視頻路徑然后自動切換場景2進行播放,然后監聽場景2視頻播放完畢自動切回場景1不說話的視頻~!
來吧!說干就干!
obs-api文檔:https://github.com/obsproject/obs-websocket/blob/master/docs/generated/protocol.md#getmediainputstatus
?不要問我為什么,因為百度出來的相關現成輪子太少了!最好看文檔來選擇和實現自己的業務,很簡單的!
一、創建obs-ws服務端
?二、創建兩個場景和每個場景各添加一個視頻來源
?SceneName場景添加一個MediaSourceNameA來源,添加視頻A
?SceneName1場景添加一個MediaSourceNameB來源,添加視頻A【當數字人視頻生成好通過py替換掉這個路徑的】
SceneName場景的MediaSourceNameA的視頻A設置循環播放。
?
?目的是默認播放推流SceneName場景MediaSourceNameA的視頻A,也就是不說話時的視頻。
三、python控制obs無縫切換場景
安裝依賴
pip install obs-websocket-py
?連接obs
# 連接OBS
ws = obsws('192.168.31.73', 4455, 'YqShGFfdYaGxG7DG')
ws.connect()
這里地址來自這里
工具-》obs-websocket?設置?
?點擊顯示連接信息,可以看到ip和密碼。
?當數字人視頻生成好后執行下面代碼!
# 修改MediaSourceNameB來源的視頻路徑ws.call(requests.SetInputSettings(inputName="MediaSourceNameB", inputSettings={"local_file": os.path.abspath(video_path)}))# 激活SceneName1場景播放視頻ws.call(requests.SetCurrentProgramScene(sceneName='SceneName1'))
?可以監聽MediaSourceNameB場景的視頻是否播放完畢,當播放完畢切換回SceneName場景的循環播放視頻。
while True:time.sleep(0.1)# 監聽MediaSourceNameB視頻播放狀態status = ws.call(requests.GetMediaInputStatus(inputName="MediaSourceNameB")).datainprint(status)# 播放完畢則切換回激活循環播放的SceneName場景視頻if status['mediaState'] == 'OBS_MEDIA_STATE_ENDED':ws.call(requests.SetCurrentProgramScene(sceneName='SceneName'))break
?
關閉websocket連接
# 斷開連接
ws.disconnect()
四、實現自定義邏輯
什么?一頭霧水???不難,我教你ya!
打開文檔
https://github.com/obsproject/obs-websocket/blob/master/docs/generated/protocol.md#getmediainputstatus
比如查詢視頻播放狀態
ws.call(requests.GetMediaInputStatus(inputName="MediaSourceNameB")).datain
?搜索GetMediaInputStatus,你可以在文檔里看到名稱一樣的,同時他有使用介紹。不會英文就翻譯一下!
會告訴你它是干什么的,傳什么參數,會得到什么響應!
也就是說這個文檔里你想用哪個方法那就如下:
requests.XXX
對于傳參名,文檔里有!在方法里對應寫就行!
requests.XXX(XXX=???,XXX=???)
必須由ws.call()包裹
默認返回對象,.datain就是返回數據了!
?
?
?注意!
對于修改的方法會讓傳對象,文檔里沒有詳細說對象里的參數名和格式,這個比較坑!不過它對應有個查詢的方法,根據查詢得出結果的內容格式去寫就行啦!?
好了!整體就是這些啦,根據我的方法自己去摸索一下就行了!對于怎么推流這個是obs基礎,自行百度下就行了!!!