互动视频
  • iOS : Objective-C
  • Android
  • macOS
  • Windows
  • Linux
  • Web
  • 小程序
  • Electron
  • 概述
  • 限制说明
  • SDK 下载
  • 快速开始
  • 常用功能
  • 推拉流进阶
  • 视频进阶
  • 音频进阶
  • 其他功能
  • 废弃接口
  • API 文档
  • 常见错误码
  • 常见问题
  • AI教育
  • KTV 合唱
  • 视频直播
  • 视频通话
  • 游戏直播
  • 直播答题
  • 娃娃机
  • 文档中心
  • 互动视频
  • 常用功能
  • 多人视频通话

多人视频通话

更新时间:2023-12-26 15:12

1 功能简介

1.1 功能描述

多人视频通话,即多个人连麦互相推拉流。 例如:

1.2 常用场景

主要应用场景,为语聊房、面对面K歌房、多人实时视频聊天、线上座谈会等。

2 使用步骤

相关功能的 Demo 源码,请联系 ZEGO 技术支持获取。

2.1 初始化 SDK

参考文档:快速开始-初始化

2.2 监听房间流新增与流减少的回调

在视频通话过程中,可能会有其他人中途加入当次视频通话(登录对应房间并推流)或退出当次视频通话(停止推流并退出房间),所以需要监听流变化的回调。例如:

/**
  * 通过设置 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];
            ...
        }
        ...
    }
}

2.3 登录房间

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并确保所拉的流在推。

2.4 推流或拉流

2.4.1 推流

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];// 推流,根据业务需要设置合理参数

推流参考文档:快速开始-推流

2.4.2 拉流

开发者需要在下面两个时机点,触发拉流:

  1. 登录成功的回调中,会返回房间中已有的流列表 streamList,拉取此列表中的流。
  2. ZegoLiveRoomApi 的 RoomDelegate 的流更新回调 onStreamUpdated:streams:roomID: 中,根据流增减情况开始/停止拉流。

上述拉流时机可参考本节3.2 监听房间流新增与流减少的回调3.3 登录房间的示例的注释部分的说明。

拉流步骤:

  1. 开始拉流
  2. 设置拉流画面填充模式
  3. onPlayStateUpdate:streamID: 回调中获取拉流状态 SDK核心接口代码(注意由于示例 Demo 源码涉及UI相关的处理,如下示例只简单展示核心SDK接口的使用):
    [self.zegoApi startPlayingStream:streamId inView:playView];
    [self.zegoApi setViewMode:ZegoVideoViewModeScaleToFill ofStream:streamId];
    拉流参考文档:快速开始-拉流

3 API 参考列表

方法 描述
initWithAppID:appSignature:completionBlock: 初始化SDK
setRoomDelegate: 设置房间信令相关的回调接口
loginRoom:role:withCompletionBlock: 登录房间,推拉流之前必须登录房间
startPublishing:title:flag: 开始推流
startPreview 启动本地预览
startPlayingStream:inView: 开始拉流
stopPublishing 停止推流
stopPlayingStream: 停止拉流
logoutRoom 退出房间

4 相关文档

5 FAQ

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。

本篇目录