基于ZEGO SDK实现多人视频通话功能


前言

本文展示了如何使用 ZEGO Express SDK 构造多人视频通话场景,即实现多对多实时音视频互动。用户可在房间内与其余用户进行实时视频通话,互相推拉流。该场景可用于多人实时视频聊天、视频会议等。


一、前提条件

在应用多人视频通话场景之前,请确保:

  • 已在项目中集成 ZEGO Express SDK,实现基本的实时音视频功能,详情请参考 快速开始 - 集成 和 快速开始 - 实现流程。
  • 已在 ZEGO 控制台 创建项目,并申请有效的 AppID 和 AppSign,详情请参考 控制台 - 项目管理

二、示例源码下载

请参考 下载示例源码 获取源码。

相关源码请查看 “/ZegoExpressExample/Scenes/src/main/java/im/zego/Scenes/VideoForMultipleUsers” 目录下的文件。

三、使用步骤

本节将介绍如何使用 ZEGO Express SDK 实现多人视频通话,流程图如下:
在这里插入图片描述

1. 创建引擎

定义 SDK 引擎对象,调用 createEngine 接口,将申请到的 AppID 和 AppSign 传入参数 “appID” 和 “appSign”,创建引擎单例对象。

如果需要注册回调代理,可将实现了 IZegoEventHandler 的对象传入参数 “eventHandler”。如果不需要注册回调代理,可将 “null” 传入参数 “eventHandler”,创建引擎后仍需要注册回调时可通过调用 setEventHandler 接口设置回调代理。

代码如下(示例):

/** 定义 SDK 引擎对象 */
ZegoExpressEngine engine;

ZegoEngineProfile profile = new ZegoEngineProfile();
/** 请通过官网注册获取,格式为 123456789L */
profile.appID = appID;
/** 64个字符,请通过官网注册获取,格式为"0123456789012345678901234567890123456789012345678901234567890123" */
profile.appSign = appSign;
/** 通用场景接入 */
profile.scenario = ZegoScenario.GENERAL;
/** 设置app的application 对象 */
profile.application = getApplication();
/** 创建引擎 */
engine = ZegoExpressEngine.createEngine(profile, null);

2.开启房间内用户变化通知

开发者需在每位用户登录房间时将 ZegoRoomConfig 中的 “isUserStatusNotify” 设为 “true”,用于接收其他用户进出房间的回调通知。

代码如下:

ZegoRoomConfig RoomConfig = new ZegoRoomConfig();
RoomConfig.isUserStatusNotify = true;
// 登录房间
engine.loginRoom(roomID, user, RoomConfig);

3.预览自己的画面,并推送到远端

在用户调用 loginRoom 之后,可以调用 startPublishingStream 接口,传入 “streamID”,将自己的音视频流推送到 ZEGO 音视频云。您可通过回调 setEventHandler 监听 onPublisherStateUpdate 回调知晓推流是否成功。

如果希望看到自己的画面,可调用 startPreview 接口设置预览视图,并启动本地预览。

“streamID” 由您本地生成,但是需要保证:同一个 AppID 下,“streamID” 全局唯一。如果同一个 AppID 下,不同用户各推了一条 “streamID” 相同的流,会导致后推流的用户推流失败。

//进行预览和推流
engine.startPreview(new ZegoCanvas(preview));//preview 为一个View 对象,开发者可以根据业务自定义,一般常用的是TextureView对象
 engine.startPublishingStream("YOUR_STREAM_ID");//用户本端的StreamID

4.拉取音视频流

4.1 拉取其他用户的音视频

进行视频通话时,我们需要拉取到其他用户的音视频。

onRoomStreamUpdate :在同一房间内的其他用户将音视频流推送到 ZEGO 音视频云时,我们会在此回调中收到音视频流新增的通知。

我们可以在该回调中,调用 startPlayingStream,传入 “streamID” 拉取播放该用户的音视频。您可通过监听 onPlayerStateUpdate 回调知晓是否成功拉取音视频。

4.2 展示用户进出房间的信息

onRoomUserUpdate 回调可以用于监听房间内的用户变化,房间内其他用户进入或退出都会触发该回调。

拉取音视频流示例代码如下:

engine.setEventHandler(new IZegoEventHandler() {
            @Override
            public void onRoomUserUpdate(String roomID, ZegoUpdateType updateType, ArrayList<ZegoUser> userList) {
                super.onRoomUserUpdate(roomID, updateType, userList);
                //房间用户变化回调,本示例是以toast为展示示例,实际业务流程需开发者按需设计
                if(updateType == ZegoUpdateType.ADD){
                    // 当 “updateType” 为 “ZegoUpdateTypeADD” 时,用户可以拉取 userList 里的用户进行处理
                    for(ZegoUser user : userList){
                        //进行Toast展示
                        Toast.makeText(myActivity,user.userID+"加入房间",Toast.LENGTH_SHORT).show();//myActivity为一个content对象,若在activity中可使用该Activity为参数
                    }
                }else{
                    // 当 “updateType” 为 “ZegoUpdateTypeDelete” 时,用户可以拉取 userList 里的用户进行处理
                    for(ZegoUser user : userList){
                        //进行Toast展示
                        Toast.makeText(myActivity,user.userID+"加入房间",Toast.LENGTH_SHORT).show();//myActivity为一个content对象,若在activity中可使用该Activity为参数
                    }
                }
            }
            @Override
            public void onRoomStateUpdate(String roomID, ZegoRoomState state, int errorCode, JSONObject extendedData) {
                //房间状态回调
                super.onRoomStateUpdate(roomID, state, errorCode, extendedData);
                if(state == ZegoRoomState.CONNECTED){
                    //可以根据实际业务进行设计
                }
            }
            @Override
            public void onRoomStreamUpdate(String roomID, ZegoUpdateType
                    updateType, ArrayList< ZegoStream > streamList, JSONObject extendedData) {
                // 流变化回调
                super.onRoomStreamUpdate(roomID, updateType, streamList, extendedData);
                // 在这里更新 UI 或执行其他操作
                if(updateType == ZegoUpdateType.ADD){
                    // 当 “updateType” 为 “ZegoUpdateTypeADD” 时,用户可以拉取 streamList 里各条音视频流以展示房间内其他用户的画面和声音
                    for(ZegoStream stream : streamList){
                        //进行拉流,preview 为一个View 对象,开发者可以根据业务自定义,一般常用的是TextureView对象;在展示多人视频的时候,开发者需要使用不同的 View 承载不同音视频流的画面,保证不同用户的视频不会重叠在一起;此处的示例代码会覆盖当前正在拉流的画面
                        engine.startPlayingStream( stream.streamID,new ZegoCanvas(preview));
                    }
                }else{
                    // 当 “updateType” 为 “ZegoUpdateTypeDELETE” 时,用户可以停止拉取相应的音视频流
                    for(ZegoStream stream : streamList){
                        //停止拉流
                        engine.stopPlayingStream( stream.streamID);
                    }
                }
            }
        });

API 调用时序图参考

在这里插入图片描述


提示

通过以上几个步骤可以快速实现多人视频通话功能。以上代码示例基于Android Java开发,更多详细步骤可以参考ZEGO开发者文档。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uniapp可以使用ZEGO实时音视频SDK实现视频通话功能。通过该SDK,用户可以在房间内与其他用户进行实时视频通话实现多人视频聊天的场景,例如多人实时视频聊天、视频会议等。 要实现uniapp的视频通话功能,可以按照以下步骤进行操作: 1. 使用ZEGO uniapp实时音视频SDK多人视频聊天功能,可以先了解SDK功能和使用方法。可以查看相关文章中提供的uniapp音视频通话示例源码运行指引,通过运行示例代码来测试SDK功能。 2. 在uniapp中引入ZEGO uniapp实时音视频SDK,并初始化SDK的配置。 3. 创建视频通话的房间,可以使用SDK提供的接口来创建房间,并设定房间的相关设置。 4. 加入房间,可以使用SDK提供的接口将用户加入到指定的房间中。 5. 开启本地预览,用户可以使用SDK提供的接口开启本地视频预览,将用户自己的视频内容展示在界面上。 6. 发布本地流,用户可以使用SDK提供的接口将自己的视频流发布到房间中,以便其他用户能够看到用户的视频内容。 7. 订阅远程流,用户可以使用SDK提供的接口订阅其他用户发布的视频流,以便在界面上显示其他用户的视频内容。 8. 实时通话,用户可以通过SDK提供的接口来进行实时视频通话,可以实现视频画面的互动和音频的互动。 以上是uniapp实现视频通话的主要步骤。通过ZEGO uniapp实时音视频SDK,可以方便地构建多人视频聊天场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值