云信小课堂 | 如何管理音视频的通话状态?

news2024/11/17 0:23:03

fff7014606ea398acdd0e711ba8000f1.png

2022.12

d1af3bfcf8da662e4142bf4be35258a7.png

 业务背景 

用户在实际使用云信音视频通话 2.0 服务中,常常会遇到弱网,掉线等情况,对于这类情况,云信 SDK 提供了自动重连的相关策略,业务层不需要单独处理重连,只需要监听并做好相应的 UI 逻辑。所以如何感知当前通话状态,做好提示以优化用户体验,并联动管理自身的业务逻辑,如计费等,是业务上必须要考虑的问题。

本文以安卓为例,给各位开发者介绍云信音视频 2.0 SDK 状态管理的相关逻辑,希望可以给大家带来便利。

 功能介绍 

1. 本地通话状态介绍

当通话过程中遇到弱网抖动等因素,导致掉线或者无法加入房间,业务层需要通过一些提示信息优化用户体验,所以做好状态监听和获取尤其重要。

以安卓为例,目前云信音视频 2.0 SDK 提供了 5 种通话链接状态,分别为:

930f0c25ad09970567c15446219ae803.png

参考:

https://doc.yunxin.163.com/nertc/api-refer/android/doxygen/Latest/zh/html/interfacecom_1_1netease_1_1lava_1_1nertc_1_1sdk_1_1_n_e_rtc_constants_1_1_connection_state.html#af2e10c186b2706e28192ea5d996557a3

2. 本地通话状态图

为了帮助大家更好的理解 SDK 内部状态的变化逻辑,本文绘制了一份本地通话状态图可供参考。

81c635a6cd850629cb8b60a2bfacb597.png

其中,绿色线条是需要业务层手动调用,黑色线条为 SDK 内部处理,业务层不需要额外关注。

3. 本地通话状态监听/获取方式

那么,客户端 SDK 如何获取上述通话状态呢,主要有两种方式:

  • 通过注册 NERtcCallbackEx 观察者,监听 onConnectionStateChanged() 回调。

  • 初始化 NERtcSDK 后,主动调用 NERtcEx#getConnectionState() 获取。

4. 远端通话状态图

对于音视频通话场景,如果房间内成员遇到弱网抖动等因素,也需要让其他成员感知并做好提示。下图梳理了常规流程和异常流程下的回调逻辑参考。

3c6a5736b3fafb0fb741485b72cf936d.png

5. 服务器状态管理

绝大部分的音视频通话业务,尤其涉及到计费等相关的,都需要由业务服务器维护当前的通话状态。但是实际业务生产过程中,可能会遇到比较多的用户主动杀进程,或者 APP 崩溃等情况,此时是无法依赖客户端上报来实现状态维护。云信音视频通话 2.0 提供了通话状态相关的服务器抄送,可以实现相应的状态管理的补充。

参考文档:

https://doc.yunxin.163.com/jcyOTA0ODM/docs/DUyOTg1NDI?platform=server

 最佳实践:一对一通话计费状态维护 

1. 准备工作

  • 申请开通音视频进出房间抄送。

  • 在云信后台配置准备接收消息抄送的服务器公网地址,用户进出房间的通知会抄送到这台服务器。

b59081d0a1fbc2bec0facc0f79fdea8b.png

dfb7603bd3024b545466275c90f65591.png

2. 通话状态与计费逻辑整合

  • 业务服务器通过用户进入房间抄送中携带的 uid、channelName、timestamp 判断用户的身份以及加入的房间和时间,等待双方均已加入房间后,计费开始。

  • 如果在计费过程中,发现用户余额不足,则可以调用删除房间接口销毁房间,将通话双方踢出房间。

  • 如果用户余额充足,在通话结束后通过用户离开房间抄送中携带的 uid、channelName、timestamp 判断用户的身份以及加入的房间和时间来结束计费。对于一对一场景来说,只需要有一方成员退出,计费即停止。

  • 出于逻辑健壮性考虑,客户端可以增加额外的业务心跳逻辑,每隔 1 分钟上报一次,如果扣钱方异常或者离开房间没有上报,就不再扣费。

参考流程图:

6c451475ef73c3becaabd1a37f01b057.png

3. 高保障抄送补充

为了保障抄送在网络链路异常等情况的稳定性,云信提供了高保障的抄送策略,详情可以咨询商务经理。

标题:关于 IM 服务端消息抄送的重试机制

链接:https://faq.yunxin.163.com/#KB0163

4. 异常 Case 处理

一对一呼叫计费异常 Case 包括但不仅限于:

  • 主叫被叫弱网,请求超时。此时 RTC 的超时时间是 40 秒左右,超时时间过后,服务器会抄送对应的离开房间信息,其中包含 reason 为超时离开。

b57075452ae053a2d8dca2aaa6df95a4.png

  • 主叫被叫主动杀进程,或者客户端崩溃,同超时离开的 case,对于服务器而言无异。

  • 抄送由于网络因素、处理不及时等出现丢失:

    考虑额外补充 3.3 版本的高保障抄送。

    考虑增加客户端计费心跳的逻辑,增强健壮性。

f3325f35d3e762bb54ac4e8b2dd72b97.jpeg

ad2ddc4ae6c93bc8daa49a620a3b928c.png

d2544532468778e571e82216abc81c36.png

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

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

相关文章

【OpenCV】使用 Python 的铅笔素描图像

目录:使用 Python 的铅笔素描图像一、前言二、代码实战2.1 导包2.2 读取照片2.3 使用 OpenCV 显示图像2.4 灰度图像2.5 反转图像2.6 模糊图像2.7 减淡和融合三、结果展示五、源代码一、前言 图片在 Python 中表示为一组数字。所以我们可以进行各种矩阵操作来得到令…

跨域问题(三种解决方法)

跨域就是一个域名的网页去请求另一个域名的资源,比如你刚刚在A网站输入了自己的账号密码,然后访问B网站,B网站无法获取账号密码 两个请求的协议(比如http),域名(比如说localhost或者192.168.0.…

python 时间

目录标题python的时间模块1、时间戳2、时间元组3、获取格式化的时间可以自定义输出格式日期格式化的符号4、显示某月的日历5、sleep模块python的时间模块 1、时间戳 时间戳,以1970为时间基准,但是太过于遥远的时间就不可以了,windows最源支持…

基于springboot实验室管理系统(程序+数据库)

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

C进阶:征服指针之指针笔试题强化(3)

目录 ​​​​​​​ 🐲T1. ​​​​​​​ ​​​​​​​ 🤖 T2. ​​​​​​​ ​​​​​​​ 🐬 T3. ​​​​​​​ ​​​​​​​ 🐳 T4. ​​​​​​​ ​​​…

并发编程——5.共享模型之无锁

目录5.共享模型之无锁5.1.问题提出5.1.1.案例5.1.2.解决思路——锁5.1.3.解决思路——无锁5.2.CAS 与 volatile5.2.1.CAS5.2.2.volatile5.2.3.为什么无锁效率高5.2.4.CAS 的特点5.3.原子整数5.4.原子引用5.4.1.概述5.4.2.案例5.4.3.ABA 问题及解决5.5.原子数组5.6.字段更新器5.…

数位统计DP

目录 算法简介 算法讲解 数字计数 数位统计DP的递推实现 数位统计DP的记忆化搜索实现 算法实践 一 Windy数 二 手机号码 附录: 算法简介 数位统计 DP 用于数字的数位统计,是一种比较简单的 DP 套路题。 一个数字的数位有个位、十位、百位,等等,如果题目和…

Python3入门基础(03)数据结构

Python3 数据结构 Python3 中有四种标准的数据结构: List(列表)Tuple(元组)Set(集合)Dictionary(字典) Python 3 的六个标准数据类型中: 不可变数据&…

MATLAB算法实战应用案例精讲-【人工智能】语义分割

前言 语义分割是一种典型的计算机视觉问题,其涉及将一些原始数据(例如,平面图像)作为输入并将它们转换为具有突出显示的感兴趣区域的掩模。许多人使用术语全像素语义分割(full-pixel semantic segmentation),其中图像中的每个像素根据其所属的感兴趣对象被分配类别ID。…

跟领导提离职了,现在后悔,想留下来,怎么办?

提完离职后悔了,怎么办?是坚持不变,继续离开?还是厚着脸皮留下来?有些网友支持楼主留下,让他舔回去。有人说,等领导挽留,哪怕是做个样子,就同意留下来,如果完…

第9章 前端调用POST-Api注意事项

1 “ has been blocked by CORS policy: Response to preflight request doesnt pass access control check: It does not have HTTP ok status.”。异常 1.1 通过跨域策略解决 1.1.1 在appsettings.json文件中定义跨域策略配置 // 跨域(Cors)配置的域名及其端口集&#xff0…

央视春晚彩排的关键时刻,主持人朱军终于回归了

盼望着、盼望着,春节临近了,春晚的零点钟声即将开始敲响了。一年一度的央视春晚,已经开启了第一次彩排,众多明星都参与其中,看来今年的春晚要热闹了。 虽然只是第一次彩排,但是很多明星艺人都已经亮相&…

Colyseus:轻量级多人游戏免费开源解决方案

点击上方“青年码农”关注回复“源码”可获取各种资料Colyseus 是一个独特的多人游戏框架,被用于许多 H5 小游戏和手机游戏中,使用容易,且选项众多,可满足开发者多样化的需求。如果你在制作多人联网游戏时遇到过各种扩展性需求和细…

数据卷(Data Volumes)

目录 1.Docker宿主机和容器之间文件拷贝 利用MySQL镜像安装MySQL服务 从容器中拷贝文件到宿主机 从宿主机拷贝文件到容器 2.数据卷 3.数据卷容器 1.Docker宿主机和容器之间文件拷贝 利用MySQL镜像安装MySQL服务 docker run -p 3307:3306 --name mysql2 -di -v /home/…

Qt中用thrift验证flume

一.flume简介 flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。 在flume中分为了3个组件,分别为source,channel和sink。 Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种…

在阿里做了7年软件测试原来是........

你了解软件测试岗吗? 很多人做测试3,5年,甚至年限多长。 但并不懂软件测试岗所要求的技术和能力,只是拘于当前的工作环境和培训班的宣传。 在一个微信里中看到如下的对话: 某人说,工作中开始做自动化了。…

8253练习题(8253端口地址怎么求?怎么求初值?怎么看出工作方式)

目录 一:简单(题目把计数初值和工作方式都给你了) 二:给了你输入时间周期和初值,你会不会求输出? 三:简单 四:初值计数方式都不给,初值还是给的时间和频率混合 五&a…

前端_swapCache方法 发布文章

swapCache方法 swapCache方法用来手工执行本地缓存的更新,它只能在applicationCache对象的updateReady事件被触发时调用,updateReady事件只有服务器上的manifest文件被更新,并且把manifest文件中所要求的资源文件下载到本地后触发。顾名思义…

[极客大挑战 2019]Secret File(BUUCTF)

前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 解题工具: fiddler或burpsuite抓包 解题过程: 又是要找秘密, 先检查一下源代码 发现了一个链接与背景颜色融合了 点进去看看 找到了SECRET但肯定没这么简单 点击SECRET页面发生…

15. 我是怎么用一个特殊 Cookie ,限制住别人的爬虫的

爬虫训练场,第15篇博客。 博客详细清单,参考 https://pachong.vip/blog 本次案例,用定值 Cookie 实现反爬 文章目录Cookie 生成Python Flask 框架生成 CookieFlask make_response 加载模板Flask 判断指定 cookie 是否存在补充知识点Cookie 生…