前言
最近一直在研究孪生数字人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")).datain
print(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基础,自行百度下就行了!!!