多人视频通话,即多个人连麦互相推拉流。 例如:
主要应用场景,为语聊房、面对面K歌房、多人实时视频聊天、线上座谈会等。
相关功能的 Demo 源码,请联系 ZEGO 技术支持获取。
参考文档:快速开始-初始化
在视频通话过程中,可能会有其他人中途加入当次视频通话(登录对应房间并推流)或退出当次视频通话(停止推流并退出房间),所以需要监听流变化的回调。例如:
/**
* 通过设置 api 房间代理,可以收到房间内的一些信息回调。
*/
[self.zegoApi setRoomDelegate:self];
/**
* 开发者可以按自己的需求在回调里实现自己的业务, 这里演示监听onStreamUpdated方法来感知房间内的流变化来进行拉流或停止拉流
*/
- (void)onStreamUpdated:(int)type
streams:(NSArray<ZegoStream*> *)streamList
roomID:(NSString *)roomID {
if (type == ZEGO_STREAM_ADD) {
// 流变更类型为添加,在这里做流添加后的逻辑,如开始拉流
...
for (ZegoStream *stream in streamList) {
...
[self.zegoApi startPlaying:stream.streamID inView:playView];
...
}
...
} else if (type == ZEGO_STREAM_DELETE){
// 流变更类型为删除,在这里做流删除后的逻辑,如停止拉流
...
for (ZegoStream *stream in streamList) {
...
[self stopPlayStream:streamId];
...
}
...
}
}
SDK核心接口代码(注意由于示例 Demo 源码涉及UI相关的处理,如下示例只简单展示核心SDK接口的使用):
[self.zegoApi loginRoom:roomID role:ZEGO_ANCHOR withCompletionBlock:^(int errorCode, NSArray<ZegoStream *> *streamList) {
if (stateCode == 0) {
// 登录房间成功
// 回调的 streamList 参数包含房间内已经存在的推流列表
// 业务逻辑,可以在这里将该列表流进行拉流
...
for (ZegoStream *stream in streamList) {
...
[self.zegoApi startPlaying:stream.streamID inView:playView];
...
}
...
} else {
// 登录异常处理逻辑
...
}
}];
参考文档:快速开始-登录房间
注意:若使用 ZEGO 的房间信令服务功能来获取在推流的流id,这里需要在登录房间的回调中获取当前房间在推流的流id;若业务自己维护推流的流id,可在登录房间之后不等待登录房间的回调直接拉流,此种方式需要业务自己维护流id并确保所拉的流在推。
SDK核心接口代码(注意由于示例 Demo 源码涉及UI相关的处理,如下示例只简单展示核心SDK接口的使用):
...;//根据业务逻辑创建所需的视图对象,并做UI相关的逻辑
[self.zegoApi setPreviewView:view];// 设置渲染的view
[self.zegoApi setPreviewViewMode:ZegoVideoViewModeScaleToFill];// 根据业务需要,设置预览渲染视图的模式
[self.zegoApi startPreview];// 启动预览
[self.zegoApi startPublishing:streamId title:nil flag:ZEGO_JOIN_PUBLISH];// 推流,根据业务需要设置合理参数
推流参考文档:快速开始-推流
开发者需要在下面两个时机点,触发拉流:
streamList
,拉取此列表中的流。 onStreamUpdated:streams:roomID:
中,根据流增减情况开始/停止拉流。 上述拉流时机可参考本节3.2 监听房间流新增与流减少的回调与3.3 登录房间的示例的注释部分的说明。
拉流步骤:
onPlayStateUpdate:streamID:
回调中获取拉流状态
SDK核心接口代码(注意由于示例 Demo 源码涉及UI相关的处理,如下示例只简单展示核心SDK接口的使用): [self.zegoApi startPlayingStream:streamId inView:playView];
[self.zegoApi setViewMode:ZegoVideoViewModeScaleToFill ofStream:streamId];
拉流参考文档:快速开始-拉流方法 | 描述 |
---|---|
initWithAppID:appSignature:completionBlock: | 初始化SDK |
setRoomDelegate: | 设置房间信令相关的回调接口 |
loginRoom:role:withCompletionBlock: | 登录房间,推拉流之前必须登录房间 |
startPublishing:title:flag: | 开始推流 |
startPreview | 启动本地预览 |
startPlayingStream:inView: | 开始拉流 |
stopPublishing | 停止推流 |
stopPlayingStream: | 停止拉流 |
logoutRoom | 退出房间 |
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。
联系我们
文档反馈