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

前言

最近一直在研究孪生数字人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基础,自行百度下就行了!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/39948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尚硅谷MySQL笔记 3-9

我不会记录的特别详细 大体框架 基本的Select语句运算符排序与分页多表查询单行函数聚合函数子查询 第三章 基本的SELECT语句 SQL分类 这个分类有很多种,大致了解下即可 DDL(Data Definition Languages、数据定义语言),定义了…

项目难点:解决IOS调用起软键盘之后页面样式布局错乱问题

需求背景 : 开发了一个问卷系统重构项目,刚开始开发的为 PC 端,其中最头疼的一点无非就是 IE 浏览器的兼容适配性问题; 再之后项目经理要求开发移动端,简单的说就是写 H5 页面,到时候会内嵌在 App 应用、办…

multiple definition of......first defined here

一、背景 环境: 银河麒麟–ARM–GCC7.4.0 写了一个动态库,依赖opencv和freeImage等第三方库,用cmake进行编译。原本在centos6-x86-gcc7.5.0上面进行编译非常的顺利,但是拿到麒麟arm上面编译就提示了这个错误:这个报错…

Ruby软件外包开发语言特点

Ruby 是一种动态、开放源代码的编程语言,它注重简洁性和开发人员的幸福感。在许多方面都具有优点,但由于其动态类型和解释执行的特性,它可能不适合某些对性能和类型安全性要求较高的场景。下面和大家分享 Ruby 语言的一些主要特点以及适用的场…

【C语言】动态通讯录 -- 详解

⚪前言 前面详细介绍了静态版通讯录【C语言】静态通讯录 -- 详解_炫酷的伊莉娜的博客-CSDN博客,但是静态版通讯录的空间是无法被改变的,而且空间利用率也不高。为了解决静态通讯录这一缺点,这时就要有一个能够随着存入联系人数量的增加而增大…

Ansys Zemax | 手机镜头设计 - 第 1 部分:光学设计

本文是 3 篇系列文章的一部分,该系列文章将讨论智能手机镜头模组设计的挑战,从概念、设计到制造和结构变形的分析。本文是三部分系列的第一部分,将专注于OpticStudio中镜头模组的设计、分析和可制造性评估。(联系我们获取文章附件…

安防监控视频云存储平台EasyNVR通道频繁离线的原因排查与解决

安防视频监控汇聚EasyNVR视频集中存储平台,是基于RTSP/Onvif协议的安防视频平台,可支持将接入的视频流进行全平台、全终端分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。为了满足用户的集成与二次开发需求&#xf…

企业计算机服务器遭到了locked勒索病毒攻击如何解决,勒索病毒解密

网络技术的不断发展,也为网络安全埋下了隐患,近期,我们收到很多企业的求助,企业的计算机服务器遭到了locked勒索病毒的攻击,导致企业的财务系统内的所有数据被加密无法读取,严重影响了企业的正常运行。最近…

如何通过观测云的RUM找到前端加载的瓶颈--可观测性入门篇

声明与保证 本文写作于2023年6月,性能优化的评价标准和优化方式仅适用于当前观测云控制台,当然随着产品迭代及技术更新,本文也会应要求适当更新。 创建、修订时间创建修改人版本2023/6/24观测云***v1.0.0 1.网站性能评价的发展史&#xff…

打开vim的语法高亮

在一个Ubuntu中自带的vim版本是8.2.4919,默认就是开始了语法高亮的,打开一个Java文件效果如下: 它不仅仅对Java文件有语法高亮,对很多的文件都有,比如vim的配置文件也有语法高亮,有语法高亮时读起来会容易…

DNNGP模型解读-early stopping 和 batch normalization的使用

一、考虑的因素(仅代表个人观点) 1.首先我们看到他的这篇文章所考虑的不同方面从而做出的不同改进,首先考虑到了对于基因组预测的深度学习方法的设计 ,我们设计出来这个方法就是为了基因组预测而使用,这也是主要目的&…

排序算法-冒泡排序(C语言实现)

简介😀 冒泡排序是一种简单但效率较低的排序算法。它重复地扫描待排序元素列表,比较相邻的两个元素,并将顺序错误的元素交换位置,直到整个列表排序完成。 实现🧐 以下内容为本人原创,经过自己整理得出&am…

WAVE SUMMIT2023六大分会场同步开启,飞桨+文心大模型加速区域产业智能化!

由深度学习技术及应用国家工程研究中心主办、百度飞桨和文心大模型承办的WAVE SUMMIT深度学习开发者大会2023将于8月16日重磅来袭!届时上海、广州、深圳、成都、南昌和宁波六大分会场将同步开启! 分会汇聚区域产业大咖、科研机构专家、知名学者和技术大…

【C++ 学习 ⑬】- 详解 list 容器

目录 一、list 容器的基本介绍 二、list 容器的成员函数 2.1 - 迭代器 2.2 - 修改操作 三、list 的模拟实现 3.1 - list.h 3.2 - 详解 list 容器的迭代器 3.2 - test.cpp 一、list 容器的基本介绍 list 容器以类模板 list<T>&#xff08;T 为存储元素的类型&…

【第二阶段】kotlin函数引用

针对上篇传入函数参数我们也可以重新定义一个函数&#xff0c;然后在main中调用时传入函数对象 lambda属于函数类型的对象&#xff0c;需要把普通函数变成函数类型的对象&#xff08;函数引用&#xff09;&#xff0c;使用“&#xff1a;&#xff1a;” /*** You can edit, ru…

DRF 缓存

应用环境 django4.2.3 &#xff0c;python3.10 由于对于服务而言&#xff0c;有些数据查询起来比较费时&#xff0c;所以&#xff0c;对于有些数据&#xff0c;我们需要将其缓存。 最近做了一个服务&#xff0c;用的时 DRF 的架构&#xff0c;刚好涉及缓存&#xff0c;特此记…

webSocket 笔记

1 认识webSocket WebSocket_ohana&#xff01;的博客-CSDN博客 一&#xff0c;什么是websocket WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽…

centos 7.9 部署django项目

1、部署框架 主要组件&#xff1a;nginx、uwsgi、django项目 访问页面流程&#xff1a;nginx---》uwsgi---》django---》uwsgi---》nginx 2、部署过程 操作系统&#xff1a;centos 7.9 配置信息&#xff1a;4核4G 50G 内网 eip &#xff1a;10.241.103.216 部署过程&…

深入学习SpringCloud Alibaba微服务架构,揭秘Nacos、Sentinel、Seata等核心技术,助力构建高效系统!

课程链接&#xff1a; 链接: https://pan.baidu.com/s/1hRN0R8VFcwjyCTWCEsz-8Q?pwdj6ej 提取码: j6ej 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v4的分享 课程介绍&#xff1a; &#x1f4da;【第01阶段】课程简介&#xff1a;全…

Android FrameWork 层 Handler源码解析

Handler生产者-消费者模型 在android开发中&#xff0c;经常会在子线程中进行一些耗时操作&#xff0c;当操作完毕后会通过handler发送一些数据给主线程&#xff0c;通知主线程做相应的操作。 其中&#xff1a;子线程、handler、主线程&#xff0c;其实构成了线程模型中经典的…