当前位置:   article > 正文

python控制obs实现无缝切换场景!obs-websocket-py_python obs

python obs

前言

最近一直在研究孪生数字人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

  1. # 连接OBS
  2. ws = obsws('192.168.31.73', 4455, 'YqShGFfdYaGxG7DG')
  3. ws.connect()

这里地址来自这里

工具-》obs-websocket 设置 

 点击显示连接信息,可以看到ip和密码。

 当数字人视频生成好后执行下面代码!

  1. # 修改MediaSourceNameB来源的视频路径
  2. ws.call(requests.SetInputSettings(inputName="MediaSourceNameB", inputSettings={
  3. "local_file": os.path.abspath(video_path)
  4. }))
  5. # 激活SceneName1场景播放视频
  6. ws.call(requests.SetCurrentProgramScene(sceneName='SceneName1'))

 可以监听MediaSourceNameB场景的视频是否播放完毕,当播放完毕切换回SceneName场景的循环播放视频。

  1. while True:
  2. time.sleep(0.1)
  3. # 监听MediaSourceNameB视频播放状态
  4. status = ws.call(requests.GetMediaInputStatus(inputName="MediaSourceNameB")).datain
  5. print(status)
  6. # 播放完毕则切换回激活循环播放的SceneName场景视频
  7. if status['mediaState'] == 'OBS_MEDIA_STATE_ENDED':
  8. ws.call(requests.SetCurrentProgramScene(sceneName='SceneName'))
  9. break

 

关闭websocket连接

  1. # 断开连接
  2. 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基础,自行百度下就行了!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/756208
推荐阅读
相关标签
  

闽ICP备14008679号