乐趣区

关于java:Android端实现多人视频语音聊天|音视频开发

1 多人视频通话性能

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

2 多人语音通话的前提条件

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

  • 已在我的项目中集成 ZEGO Express SDK,实现根本的实时音视频性能,详情请参考 疾速开始 – 集成 和 疾速开始 – 实现视频通话。
  • 已在 ZEGO 控制台 创立我的项目,并申请无效的 AppID 和 AppSign,详情请参考 控制台 – 项目管理 中的“我的项目信息”。

3 安卓端多人语音通话的示例源码下载

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

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

4 即构多人语音通话 SDK 的应用步骤

本节将介绍如何应用 ZEGO Express SDK 实现多人视频通话,流程图如下:

4.1 多人语音聊天 SDK 创立引擎

定义 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);

4.2 多人视频通话性能开启房间内用户变动告诉

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

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

4.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 多人视频通话拉取音视频流

4.4.1 多人视频聊天拉取其余用户的音视频

进行视频通话时,咱们须要拉取到其余用户的音视频。

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

咱们能够在该回调中,调用 startPlayingStream,传入“streamID”拉取播放该用户的音视频。您可通过监听 onPlayerStateUpdate 回调通晓是否胜利拉取音视频。

4.4.2 多人语音聊天展现用户进出房间的信息

onRoomUserUpdate 回调能够用于监听房间内的用户变动,房间内其余用户进入或退出都会触发该回调。

房间人数大于 500 人的状况下 onRoomUserUpdate 回调不保障无效。若业务场景存在房间人数大于 500 的状况,不应依赖于该回调设计业务逻辑。若有在房间人数大于 500 时应用该回调的需要,请分割 ZEGO 技术支持。

4.4 的代码示例如下:

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);
                    }
                }
            }
        });

多人语音聊天 SDK 的 API 调用时序图参考

5 获取 Java 多人语音聊天 SDK 更多帮忙

获取本文 Java 多人语音聊天 SDK 的开发文档、技术支持,拜访即构文档核心,可实现视频会议和直播场景下多人视频语音聊天性能;

近期有开发布局的开发者可上即构官网查看,恰逢即构七周年全线音视频产品 1 折的优惠,分割商务获取产品优惠;

退出移动版