Android端实现多人视频语音聊天|音视频开发

海哥  金牌会员 | 2022-9-16 17:21:04 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 881|帖子 881|积分 2643

1 多人视频通话功能

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

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

在应用多人视频语音通话场景之前,请确保:
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 接口设置回调代理。
  1. /** 定义 SDK 引擎对象 */
  2. ZegoExpressEngine engine;
  3. ZegoEngineProfile profile = new ZegoEngineProfile();
  4. /** 请通过官网注册获取,格式为 123456789L */
  5. profile.appID = appID;
  6. /** 64个字符,请通过官网注册获取,格式为"0123456789012345678901234567890123456789012345678901234567890123" */
  7. profile.appSign = appSign;
  8. /** 通用场景接入 */
  9. profile.scenario = ZegoScenario.GENERAL;
  10. /** 设置app的application 对象 */
  11. profile.application = getApplication();
  12. /** 创建引擎 */
  13. engine = ZegoExpressEngine.createEngine(profile, null);
复制代码
4.2 多人视频通话功能开启房间内用户变化通知

开发者需在每位用户登录房间时将 ZegoRoomConfig 中的 “isUserStatusNotify” 设为 “true”,用于接收其他用户进出房间的回调通知。
  1. ZegoRoomConfig RoomConfig = new ZegoRoomConfig();
  2. RoomConfig.isUserStatusNotify = true;
  3. // 登录房间
  4. engine.loginRoom(roomID, user, RoomConfig);
复制代码
4.3 多人视频通话预览自己的画面,并推送到远端

在用户调用 loginRoom 之后,可以调用 startPublishingStream 接口,传入 “streamID”,将自己的音视频流推送到 ZEGO 音视频云。您可通过回调 setEventHandler 监听 onPublisherStateUpdate 回调知晓推流是否成功。
如果希望看到自己的画面,可调用 startPreview 接口设置预览视图,并启动本地预览。
“streamID” 由您本地生成,但是需要保证:同一个 AppID 下,“streamID” 全局唯一。如果同一个 AppID 下,不同用户各推了一条 “streamID” 相同的流,会导致后推流的用户推流失败。
  1. //进行预览和推流
  2. engine.startPreview(new ZegoCanvas(preview));//preview 为一个View 对象,开发者可以根据业务自定义,一般常用的是TextureView对象
  3. 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 的代码示例如下:
  1. engine.setEventHandler(new IZegoEventHandler() {
  2.             @Override
  3.             public void onRoomUserUpdate(String roomID, ZegoUpdateType updateType, ArrayList<ZegoUser> userList) {
  4.                 super.onRoomUserUpdate(roomID, updateType, userList);
  5.                 //房间用户变化回调,本示例是以toast为展示示例,实际业务流程需开发者按需设计
  6.                 if(updateType == ZegoUpdateType.ADD){
  7.                     // 当 “updateType” 为 “ZegoUpdateTypeADD” 时,用户可以拉取 userList 里的用户进行处理
  8.                     for(ZegoUser user : userList){
  9.                         //进行Toast展示
  10.                         Toast.makeText(myActivity,user.userID+"加入房间",Toast.LENGTH_SHORT).show();//myActivity为一个content对象,若在activity中可使用该Activity为参数
  11.                     }
  12.                 }else{
  13.                     // 当 “updateType” 为 “ZegoUpdateTypeDelete” 时,用户可以拉取 userList 里的用户进行处理
  14.                     for(ZegoUser user : userList){
  15.                         //进行Toast展示
  16.                         Toast.makeText(myActivity,user.userID+"加入房间",Toast.LENGTH_SHORT).show();//myActivity为一个content对象,若在activity中可使用该Activity为参数
  17.                     }
  18.                 }
  19.             }
  20.             @Override
  21.             public void onRoomStateUpdate(String roomID, ZegoRoomState state, int errorCode, JSONObject extendedData) {
  22.                 //房间状态回调
  23.                 super.onRoomStateUpdate(roomID, state, errorCode, extendedData);
  24.                 if(state == ZegoRoomState.CONNECTED){
  25.                     //可以根据实际业务进行设计
  26.                 }
  27.             }
  28.             @Override
  29.             public void onRoomStreamUpdate(String roomID, ZegoUpdateType
  30.                     updateType, ArrayList< ZegoStream > streamList, JSONObject extendedData) {
  31.                 // 流变化回调
  32.                 super.onRoomStreamUpdate(roomID, updateType, streamList, extendedData);
  33.                 // 在这里更新 UI 或执行其他操作
  34.                 if(updateType == ZegoUpdateType.ADD){
  35.                     // 当 “updateType” 为 “ZegoUpdateTypeADD” 时,用户可以拉取 streamList 里各条音视频流以展示房间内其他用户的画面和声音
  36.                     for(ZegoStream stream : streamList){
  37.                         //进行拉流,preview 为一个View 对象,开发者可以根据业务自定义,一般常用的是TextureView对象;在展示多人视频的时候,开发者需要使用不同的 View 承载不同音视频流的画面,保证不同用户的视频不会重叠在一起;此处的示例代码会覆盖当前正在拉流的画面
  38.                         engine.startPlayingStream( stream.streamID,new ZegoCanvas(preview));
  39.                     }
  40.                 }else{
  41.                     // 当 “updateType” 为 “ZegoUpdateTypeDELETE” 时,用户可以停止拉取相应的音视频流
  42.                     for(ZegoStream stream : streamList){
  43.                         //停止拉流
  44.                         engine.stopPlayingStream( stream.streamID);
  45.                     }
  46.                 }
  47.             }
  48.         });
复制代码
多人语音聊天SDK的 API 调用时序图参考


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

获取本文Java 多人语音聊天SDK的开发文档、技术支持,访问即构文档中心,可实现视频会议和直播场景下多人视频语音聊天功能;
近期有开发规划的开发者可上即构官网查看,恰逢即构七周年全线音视频产品1折的优惠,联系商务获取产品优惠;

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表