多人视频通话,即多个人连麦互相推拉流。 例如:
主要应用场景,为语聊房、面对面K歌房、多人实时视频聊天、线上座谈会等。
相关功能的 Demo 源码,请联系 ZEGO 技术支持获取。
参考文档:快速开始-初始化
在视频通话过程中,可能会有其他人中途加入当次视频通话(登录对应房间并推流)或退出当次视频通话(停止推流并退出房间),所以需要监听流变化的回调。例如:
/**
* 通过设置sdk房间代理,可以收到房间内的一些信息回调。
* 开发者可以按自己的需求在回调里实现自己的业务, 这里演示监听onStreamUpdated方法来感知房间内的流变化来进行拉流或停止拉流
* 下述zegoLiveRoom是SDK的单例对象
*/
zegoLiveRoom.setZegoRoomCallback(new IZegoRoomCallback() {
//监听其他回调
...
public void onStreamUpdated(int type, ZegoStreamInfo[] listStream, String roomID) {
for (ZegoStreamInfo streamInfo : listStream) {
if (type == ZegoConstants.StreamUpdateType.Added) {
// 业务可以在这里拉流,并做UI的渲染逻辑
...
g_ZegoApi.startPlaying(zegoStreamInfo.streamID, playRenderView);
...
} else if (type == ZegoConstants.StreamUpdateType.Deleted) {
// 业务可以在这里停止拉流,并做去掉UI的渲染逻辑,否则会出现问题
...
g_ZegoApi.stopPlayingStream(zegoStreamInfo.streamID);
g_ZegoApi.setPreviewView(null);
playRenderView = null;
...
}
}
}
}
SDK核心接口代码(注意由于示例 Demo 源码涉及UI相关的处理,如下示例只简单展示核心SDK接口的使用):
g_ZegoApi.loginRoom(roomID, role, new IZegoLoginCompletionCallback() {
@Override
public void onLoginCompletion(int stateCode, ZegoStreamInfo[] zegoStreamInfos) {
// zegoStreamInfos,内部封装了 userID、userName、streamID 和 extraInfo。
// 登录房间成功后,开发者可通过 zegoStreamInfos 获取到当前房间推流信息,便于后续的拉流操作。
if (stateCode == 0) {
Log.i("登录房间成功 roomId : %s", roomID);
for(ZegoStreamInfo zegoStreamInfo : zegoStreamInfos){
// 业务逻辑,可以在这里推流或拉流,并做UI的展示
...
g_ZegoApi.startPlaying(zegoStreamInfo.streamID, playRenderView);
...
}
} else {
Log.i("登录房间失败, stateCode : %d", stateCode);
// 业务异常处理逻辑
...
}
}
});
参考文档:快速开始-登录房间
注意:若使用 ZEGO 的房间信令服务功能来获取在推流的流id,这里需要在登录房间的回调中获取当前房间在推流的流id;若业务自己维护推流的流id,可在登录房间之后不等待登录房间的回调直接拉流,此种方式需要业务自己维护流id并确保所拉的流在推。
SDK核心接口代码(注意由于示例 Demo 源码涉及UI相关的处理,如下示例只简单展示核心SDK接口的使用):
...;//根据业务逻辑创建所需的视图对象,并做UI相关的逻辑
g_ZegoApi.setPreviewView(view);// 设置渲染的view
g_ZegoApi.setPreviewViewMode(ZegoVideoViewMode.ScaleAspectFill);// 根据业务需要,设置预览渲染视图的模式
g_ZegoApi.startPreview();// 启动预览
g_ZegoApi.startPublishing(String streamID, String title, int flag, String extraInfo);// 推流
推流参考文档:快速开始-推流
开发者需要在下面两个时机点,触发拉流:
onLoginCompletion 的回调中,会返回房间中已有的流列表 ZegoStreamInfo[],拉取此列表中的流。 onStreamUpdated 中,根据流增减情况开始/停止拉流。 上述拉流时机可参考本节3.2 监听房间流新增与流减少的回调与3.3 登录房间的示例的注释部分的说明。
拉流步骤:
onPlayStateUpdate 回调的流id参数streamID中,获取拉流是否成功的状态。 SDK核心接口代码(注意由于示例 Demo 源码涉及UI相关的处理,如下示例只简单展示核心SDK接口的使用):
g_ZegoApi.startPlayingStream(streamID, view);
g_ZegoApi.setViewMode(int mode, String streamID);
拉流参考文档:快速开始-拉流
| 方法 | 描述 |
|---|---|
| initSDK | 初始化SDK |
| setZegoRoomCallback | 设置房间信令相关的回调接口 |
| loginRoom | 登录房间,推拉流之前必须登录房间 |
| startPublishing | 开始推流 |
| startPreview | 启动本地预览 |
| startPlayingStream | 开始拉流 |
| stopPublishing | 停止推流 |
| stopPlayingStream | 停止拉流 |
| logoutRoom | 退出房间 |
| unInitSDK | 释放 SDK 资源,停止各种系统监听 |
Q1:业务自己维护流id是什么意思?
答:即客户端App拉流的流id不是通过 ZEGO SDK 的回调获取,而是App客户端向业务自己的服务端去请求获取。业务方的用户的推流id和拉流id都由业务方的后端服务来维护。
业务侧自己维护流id,业务方对自己的用户的推拉流服务的可控性更强,由于 ZEGO SDK 支持跨房间连麦(主播PK场景),而ZEGO房间信令服务只是同个房间内有效,因此跨房间连麦的场景需要客户自己维护流id。
Q2: 为什么想要推拉流必须登录房间?
答:这是 ZEGO SDK 做的限制,在推拉流之前必须登录房间。ZEGO SDK 在推拉流的基础上增加了房间信令服务,ZEGO SDK 的一些实时回调都是基于房间信令服务实现。
Q3: 在视频通话场景中,为什么拉的流越多,手机发热越严重,视频画面也越卡?
答:在多人实时视频通话的场景中,每多拉一路流,就会有多一路流的下行带宽消耗,设备每多解码渲染一路流,相应也会增加设备的性能消耗,因此在多人实时视频通话的场景中,拉多路流时应该考虑适当降低推流的编码分辨率和推流码率,或者使用进阶功能-分层视频编码的功能来在网络好的时候拉高一些分辨率的流,网络不好的时候拉分辨率低一些的流。
Q4: 如何实现多人音频通话的功能?
答:在本示例专题 DEMO 的基础上,在推流之前关闭摄像头enableCamera设置为false即可。
Q5: 如何实现房主禁麦的功能?
答:开发者可以使用自己的IM或者第三方IM或 ZEGO SDK 的发送自定义信令的接口 sendCustomCommand与enableMic 实现。业务上自定义发送报文的格式,收到自定义信令的回调 onReceiveCustomCommand 之后根据业务自定义的协议格式调用 enableMic 为 false 。
Q6: 使用 ZEGO SDK 如何设置视频通话的房主?
答:ZEGO SDK 与 ZEGO 的推拉流服务原则上没有房主的概念,房主角色的相关功能业务上可以自己实现。
Q7: 使用 ZEGO SDK 实现多人视频通话,最大支持多少路视频通话?
答:由于设备性能的考虑,ZEGO SDK 在互推互拉的场景进行了限制,同个设备最大支持12路连麦。开发者如果希望支持更多路连麦,可联系 ZEGO 技术支持获取指定路数的SDK。

联系我们
文档反馈