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