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

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

猜你喜欢

转载自blog.csdn.net/netease_im/article/details/128502393
今日推荐