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() {@Overridepublic 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为参数}}}@Overridepublic void onRoomStateUpdate(String roomID, ZegoRoomState state, int errorCode, JSONObject extendedData) {//房间状态回调super.onRoomStateUpdate(roomID, state, errorCode, extendedData);if(state == ZegoRoomState.CONNECTED){//可以根据实际业务进行设计}}@Overridepublic void onRoomStreamUpdate(String roomID, ZegoUpdateTypeupdateType, 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折的优惠,联系商务获取产品优惠;

Android端实现多人视频语音聊天|音视频开发相关推荐

  1. 直播软件源码如何在Android端实现多人视频通话

    本篇主要讨论直播软件源码如何在Android端实现多人视频通话.主要需要实现以下功能: 随着加入人数和他们的手机摄像头分辨率的变化,显示不同的UI,即所谓的"分屏" 点击分屏中的小 ...

  2. Android分屏直播方案,直播软件源码如何在Android端实现多人视频通话

    本篇主要讨论直播软件源码如何在Android端实现多人视频通话.主要需要实现以下功能: 随着加入人数和他们的手机摄像头分辨率的变化,显示不同的UI,即所谓的"分屏" 点击分屏中的小 ...

  3. Silverlight视频语音聊天项目

    Silverlight视频语音聊天项目 时间:2010-08-18 08:41来源:SilverlightChina.Net 作者:银光中国网 点击:1901次 Silverlight Socket语 ...

  4. 【flex chat】 p2p视频语音聊天室 欢迎你的测试

    [flex chat] p2p视频语音聊天室 欢迎你的测试, 花了我2个星期的时间,相对来说比较完善了,用的是Adobe提供的P2P服务器.后期有时间可以继续开发,以现有的功能可以实现视频会议.视频客 ...

  5. 请教高手(关于视频语音聊天室)

    请教各路大侠: 目前网络上流行的视频语音聊天室是用什么程序编写的呀? 请问哪里有相关的教程? 谢谢!!!!!!! 菜鸟

  6. 视频语音聊天室办理会员是骗人的吗?

    现在很多朋友们会咨询杭州雅顾聊天室开发公司,说现在很多聊天室都会推荐购买会员才能和美女主播一对一进行私人聊天,有木有可能是骗人的呢? 其实我们小编告诉你:现在的视频语音聊天室只需要你注册一个会员就可以 ...

  7. 语音聊天源码开发之常用动画效果的实现

    效果展示 下面是语音聊天源码开发中比较入门的豪华礼物动画--烟花. 一个复杂的礼物动画,首先是美术给出gif实现草图和素材,技术进行动画剖析和图片压缩,在语音聊天源码中加载图片和实现动画,其中要注意内 ...

  8. Android 使用ViewPager2+ExoPlayer+VideoCache 实现仿抖音视频翻页播放

    1. 实现效果 效果图中,视频没有铺满 是因为使用了ExoPlayer的RESIZE_MODE_FIT模式, 虽然使用RESIZE_MODE_FILL模式可以填充整个父布局,但是本Demo中使用的视频 ...

  9. Android实现视频剪切、视频拼接以及音视频合并

    因公司项目有需求,要实现视频剪切,视频拼接以及音视频合并的功能,自己通过在网上查找大量的资料终于把功能实现了,把实现的公共类提取出来,以便以后复习巩固. 使用map4parser作为视频处理包,and ...

最新文章

  1. Intellij IDEA 将工程转换成maven工程 详解
  2. c语言填空题删除字符串k右边,计算机二级C语言上机模拟试题及解题思路
  3. C++中两个数交换不引进中间变量的方法
  4. Java异常分类及处理
  5. qt和python关系_Python与Qt - AlphaJay的个人空间 - OSCHINA - 中文开源技术交流社区
  6. RN position定位及Android兼容处理
  7. Codeforces Round # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)
  8. html360chromeURL无法编辑,关于近期360拦截本站以及部分网友无法用chrome打开本站问题...
  9. mac系统如何连接服务器地址,mac如何远程连接服务器地址
  10. live share_带Live Share的Visual Studio Code中的实时编码入门
  11. mysql创建拼音函数_MySQL汉字转换拼音(存储函数)
  12. 【VulnHub靶场】——HARRYPOTTER第一部: ARAGOG (1.0.2)
  13. MyBatis第N+1种分页方式,全新的MyBatis分页
  14. 概率论与数理统计 期末突击复习
  15. Geometric GAN
  16. ClickHouse函数介绍
  17. 防火墙双机热备+负载分担
  18. 预制体与非预制体_为什么更多的Web设计师应该尝试使用预制网站
  19. 读论文《Recurrent neural network based language model 》
  20. PMP笔记-区分质量保障(QA)和质量控制(QC)

热门文章

  1. python 时间戳转化为日期格式 datetime、date、时间元组
  2. 解决Excel中VBA批量打印速度慢的问题
  3. 必备知识:关于曲线的一、二、三阶导的总结
  4. H3C网络搭建入门(H3C、Oracle、CRT三种软件的关联,以便于模拟实际)
  5. 【Android】让HeaderView也参与回收机制,自我感觉是优雅的为 RecyclerView 添加 HeaderView (FooterView)的解决方案
  6. C练题笔记之:Leetcode-307. 区域和检索 - 数组可修改
  7. C练题笔记之:Leetcode-38. 外观数列
  8. 【ODOO】Docker Compose 编排ODOO应用
  9. 数码管显示原理:共阴极和共阳极的区别,静态显示程序。
  10. 微信小程序上拉触底事件函数onReachBottom不触发的解决方案