! 新版开发者中心已正式上线,旧文档将于6月30日下架,不再维护 立即体验

房间问题

下载pdf
更新时间:2020-03-04 10:05

1 LoginRoom的参数Role

loginRoom有两个Role:

第一个是Anchor,选择ZEGO_ANCHOR = 1, Anchor这里的作用是: 针对要连麦的用户,如果要调用zego API来申请连麦(requestJoinLive),那么这个申请只会发送给Anchor身份的人,其他人收不到。

另外:一个房间内只会有一个Anchor身份的用户,如果下一个用户也以Anchor的身份loginRoom,那么上一个以Anchor登录的就失效了。

第二个是Audience,选择ZEGO_AUDIENCE = 2,除房主,其他人都可以以Audience身份登录。 注:无论选择什么Role,都是可正常推流和拉流的,不受角色控制。

2 在每个房间,直播中是否有管理员

SDK是没有管理员身份的,房间内只有Anchor(主播)和Audience(观众)两种角色, 建议loginroom的时候都以audience的身份登录,两种角色的区别第1个问题。

3 调用loginroom的接口直接返回FALSE,是什么原因?

调用loginroom的接口没有返回onloginCompletion,而是接口直接返回FALSE的原因:没有在loginroom之前调用setUser的接口设置用户信息,且setUser里面的userID和userName不能为空。

4 在直播的过程中如何保证房间的唯一性

这个RoomID的生成和维护 需要业务方实现,业务方在自己的业务后台可通过时间戳及随机数等保证房间名的唯一性,并用数据库存储,App端需要用到的时候下发给App端唯一的RoomID.

5 如何处理同样的userID再次登录房间

每个用户的userID必须保证唯一。 如果有不同用户使用同一个userID登录:
若是同一个RoomID,前面用该userID登录推流的用户会被踢下线,收到onKickOut的回调,推流和拉流都会被停止。

若是不同的RoomID,前面用该userID登录推流的用户也会被下线,收到onDisconnect的回调,推流和拉流都会停止。

注:因此,业务侧一定要确认userID全局性唯一。

6 如何获取房间内的在线人数

6.1 通过后台接口查询房间内的在线人数

通过后台接口查询房间内的在线人数。 具体实现可以参考:后台文档-获取房间在线人数

6.2 通过SDK接口获取房间内的在线人数

通过接口 onUpdateOnlineCount 回调房间内的在线人数,30s/次。

7 如何判断当前状态是否处于一个登录房间状态

推荐业务侧去做维护这个状态,可以根据loginRoom的回调,记录登录房间成功或者失败的状态,logoutRoom来记录退出房间记录。

8 房间内接口onKickOut和onDisconnect的说明

onKickOut有两种情况:

  1. 有不同用户使用同样的userID登录了同一个Room,前一个登录的用户收到onKickOut.
  2. 调用后台接口踢出用户后台文档-房间用户踢出接口

onDisconnect有两种情况:

  1. 频繁的断网恢复、断网恢复,这个时候SDK里面内部重连loginRoom的时候,发现网络已经断开,回调onDisconnect。
  2. 就是真的断网了,准确获取到这个状态,sdk内部不会重连,90秒都没有恢复网络,然后就会回调onDisconnect.

9 为什么提示被踢出了房间?

原因:有相同userId的 不同用户登陆,需保证userId的唯一性

10 房间内如果发生断线的情况,有没有重连机制?重连机制是怎样的?

房间内会有一个 90秒 的超时机制:
30秒一个心跳,连续三次都没有响应,也就是90秒后还未恢复,SDK会回调onDiconnect, 此时SDK会停止推流、停止拉流及登出房间。

当网络断开,SDK回调接口 onTempBroken ,此时room会等待网络恢复重连逻辑, 一旦网络恢复,SDK会重连,重连成功,回调接口 onReconnect。

11 踢人的功能如何实现?

11.1 通过调用后台服务器接口踢人

通过调用后台服务器踢人接口将某个用户踢出房间后台文档-房间用户踢出接口,该用户会收到onKickOut被踢出的回调,停止推拉流,登出房间。

11.2 通过SDK接口的信令接口来实现

该房间的房主(或某个用户)调用sendCustomCommand的接口,指定给房间内的某个用户发送信令,可以自定义信令内容(比如踢出房间),该用户收到这个信息后,就调用stopPublishing,stopPlayingStream,logoutRoom的接口,停止推拉流,退出房间。

12 语聊房的场景里房间内推多条流的时候如何监听房间内谁在说话?做音浪展示

获取哪个用户在说话的接口

1、onCaptureSoundLevelUpdate:采集音量回调(一般用于开播前的设备检测)

2、onSoundLevelUpdate:播放音量回调(展示谁在说话)

3、soundLevel 的取值范围(0~100)

注意:设置回调后(setSoundLevelDelegate) 采集音量的回调和播放音量的回调都可以收到,目前SDK没有区分。

iOS流程示例:

在头文件 zego-api-sound-level-oc.h 里面:

1、初始化 SDK 后调用;
2、实现获取 ZegoSoundLevel 的单例对象,接口 +(instancetype)sharedInstance;
3、设置代理对象 setSoundLevelDelegate;
4、可设置 soundLevel 的监控周期,接口 setSoundLevelMonitorCycle,单位为ms,取值范围 [100, 3000],不设默认 200ms;
5、启动 soundLevel 监听,接口 startSoundLevelMonitor 启动;
6、启动监听,就可以获取到音量回调 (onSoundLevelUpdate(拉流对端的音量) / onCaptureSoundLevelUpdate(本地采集的音量)),音量范围0~100.
7、结束 soundLevel 监听,接口 stopSoundLevelMonitor 停止.

Android流程示例:

在类 ZegoSoundLevelMonitor 里面:

1、初始化 SDK 后调用;
2、实现获取 ZegoSoundLevelMonitor监听实例,接口 getInstance();
3、设置回调 setCallback(IZegoSoundLevelCallback callback);
4、可设置 soundLevel 的监控周期,接口 setCycle(int timeInMS),单位为ms,取值范围 [100, 3000],不设默认 200ms;
5、启动 soundLevel 监听,接口 start();
6、启动监听,就可以获取到音量回调 (onSoundLevelUpdate(拉流对端的音量) / onCaptureSoundLevelUpdate(本地采集的音量)),音量范围0~100.
7、结束 soundLevel 监听,接口 stop().

12.1 当使用音频外部采集的时候为什么没有采集音量的回调抛出来?

采集音量的获取是sdk采集数据的的时候统计的,不是sdk采集无法统计到音量,所以无法提供音量。

12.2 只有拉流没有推流为什么会收到onCaptureSoundLevelUpdate,并且流名为空,音量为0?

设置回调后(setSoundLevelDelegate) 采集音量的回调和播放音量的回调都可以收到,目前SDK没有区分,开发者可以不用处理onCaptureSoundLevelUpdate

13 禁麦/禁言等功能如何实现?

SDK没有直接的禁麦/禁言的接口调用,可以通过发送自定义消息sendCustomCommand的接口,给指定的用户一条自定义消息。

这个用户会通过onReceiveCustomCommand收到消息之后,就调用enableMic设置为fals无法使用麦克风 来实现禁麦功能。

其他的禁言/禁摄像头也是类似的方式实现。具体请参考:IM消息

14 无法加入房间什么原因

当onLoginCompletion回调stateCode不等于0,此时一般是客户网络异常引起: 具体错误码可参考:常见错误码

1、可以提示用户稍后再试 2、也可以考虑重试,比如失败了,隔3秒之后重新登录,重试5--10次后如果还是失败了,可以UI展示用户稍后再试。

注:避免陷入无限登录的死循环中,消耗手机内存。