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

连麦

更新时间:2022-10-11 15:49

1 功能简介

连麦是指在直播中,主播与观众一起直播。

主要的应用场景如下:

  1. 在大型直播中,主播需要和观众互动时,主播邀请观众一起直播。
  2. 多主播同台,主播中需要两个及以上的主播同时进行直播,比如双师课堂。

注意:

此文档作为示例,所描述的主播端、观众端实现连麦的流程不涉及主播邀请观众连麦和观众申请连麦的信令交互,只要观众端在主播房间推流成功(不需要征求主播的同意),主播就拉取观众流,实现连麦。

对于主播邀请观众连麦和观众申请连麦的信令交互,开发者可根据实际的业务需求,做以下处理:

  1. 增加观众向主播申请连麦信令的收发处理,比如观众向主播发送申请连麦的信令后,观众在收到主播的同意连麦信令后才能开始推流,否则不能推流。
  2. 增加主播邀请观众连麦信令的收发处理,比如主播向观众发送邀请连麦的信令后,观众收到主播的邀请连麦信令,同意连麦之后才进行推流,实现观众与主播连麦。

主播、观众说明:

由于观众端也可以推流成为主播,为了避免歧义,下文中的观众均指登录房间时 RoomRoleAudience 的角色,主播均指登录房间时 RoomRoleAnchor 的角色。

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

2 连麦系统架构图&时序图

2.1 连麦系统架构图

2.2 主播观众连麦交互时序图

3 主播端调用流程

3.1 初始化 SDK

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

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

在直播连麦过程中,可能会有其他观众在直播中途连麦成为主播(在主播房间推流)或已连麦观众在直播中途结束连麦(在主播房间停止推流),所以需要监听流变化的回调以处理相关的流操作(拉流/停止拉流)。

此示例代码会拉取主播自己所在房间所有正在推的流(连麦观众流),用户可根据实际业务需求,限制拉流数量即连麦者的数量。

 /**
  * 通过设置 SDK 房间代理,可以收到房间内的一些信息回调。
  * 开发者可以按自己的需求在回调里实现自己的业务,这里演示监听 onStreamUpdated 方法来感知房间内的流变化,以实现相关的流操作(拉流或停止拉流)
  * 下述 zegoLiveRoom 是 SDK 的单例对象
  */
zegoLiveRoom.setZegoRoomCallback(new IZegoRoomCallback() {
    // 其它回调实现
    ...

    // 流更新回调
    @Override
    public void onStreamUpdated(int type, ZegoStreamInfo[] zegoStreamInfos, String roomID) {
       // 房间流列表更新

       // 当登录房间成功后,如果房间内中途有人推流或停止推流。房间内其他人就能通过该回调收到流更新通知。
       for (ZegoStreamInfo streamInfo : zegoStreamInfos) {
           // 当有流新增的时候,拉流
           if (type == ZegoConstants.StreamUpdateType.Added) {
           // 此处是向已连麦观众列表中增加此条流的用户信息(JoinLiveUserInfo),用户可根据实际情况做处理
           JoinLiveUserInfo userInfo = new JoinLiveUserInfo(streamInfo.userID, streamInfo.streamID);
                                ZGJoinLiveHelper.sharedInstance().addJoinLiveAudience(userInfo);

           // 开始拉流,此处的 view 需要自行管理,填写可用的视图
           zegoLiveRoom.startPlayingStream(streamInfo.streamID, view);
           // 设置拉流视图模式,此处采用 SDK 默认值--等比缩放填充整个 view,可能有部分被裁减。
           zegoLiveRoom.setViewMode(ZegoVideoViewMode.ScaleAspectFill, streamInfo.streamID);
           } 
           // 当有其他流关闭的时候,停止拉流
           else if (type == ZegoConstants.StreamUpdateType.Deleted) 
           {
               // 如果此条流删除信息是连麦者的流,做停止拉流的处理,用户可根据实际需要管理此处的连麦者信息(JoinLiveUserInfo)
               for (JoinLiveUserInfo userInfo:ZGJoinLiveHelper.sharedInstance().getHasJoinedUsers()){
                   if (userInfo.userID.equals(streamInfo.userID)){
                       // 停止拉流
                       zegoLiveRoom.stopPlayingStream(streamInfo.streamID);
                       // 移除此连麦者
                       ZGJoinLiveHelper.sharedInstance().removeJoinLiveAudience(userInfo);
                       break;
                    }
                }
           }
       }
    }
});

3.3 登录房间

请参考文档:快速开始-登录房间

3.4 推流

登录房间成功后开始推流。

请注意,需使用连麦模式推流,即指定 startPublishing(streamID, title, flag) 中的 flag 为 ZegoConstants.PublishFlag.JoinPublish

/**
 * 在收到登录房间成功的回调后进行推流,用户可根据实际情况处理,不是非得在登录房间的回调里进行推流。
 * 下述 zegoLiveRoom 是 SDK 的单例对象
 */

// 设置房间配置,监听房间内用户状态的变更通知
zegoLiveRoom.setRoomConfig(true, true);
// 开始推流前需要先登录房间,此处是主播登录房间,成功登录后开始推流
zegoLiveRoom.loginRoom(mRoomID, ZegoConstants.RoomRole.Anchor, new IZegoLoginCompletionCallback() {
     @Override
     public void onLoginCompletion(int errorCode, ZegoStreamInfo[] zegoStreamInfos) {
          if (errorCode == 0) {
             // 设置预览视图模式,此处采用 SDK 默认值--等比缩放填充整个 view,可能有部分被裁减。
             zegoLiveRoom.setPreviewViewMode(ZegoVideoViewMode.ScaleAspectFill);
             // 设置预览视图,此处的 view 需要自行管理,填写可用的视图 
             zegoLiveRoom.setPreviewView(view);
             // 启动预览
             zegoLiveRoom.startPreview();
             // 开始推流,flag 参数使用连麦场景
             zegoLiveRoom.startPublishing(anchorStreamID, "anchor", ZegoConstants.PublishFlag.JoinPublish); 
           } else {
             Log.i("zego","登录房间失败");
           }
     }
});

推流的详细介绍请参考文档:快速开始-推流

4 观众端调用流程

4.1 初始化 SDK

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

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

在直播连麦过程中,可能会有其他观众在直播中途连麦成为主播(在主播房间推流)或已连麦观众在直播中途结束连麦(在主播房间停止推流),所以需要监听流变化的回调以处理相关的流操作(拉流/停止拉流)。

此示例代码在进入主播房间后拉取中途连麦者的流,或者停止拉取中途退出的连麦者对应的流,用户可根据实际业务需求,限制拉流数量。

 /**
  * 通过设置 SDK 房间代理,可以收到房间内的一些信息回调。
  * 开发者可以按自己的需求在回调里实现自己的业务,这里演示监听 onStreamUpdated 方法来感知房间内的流变化,以实现相关的流操作(拉流或停止拉流)
  * 下述 zegoLiveRoom 是 SDK 的单例对象
  */
zegoLiveRoom.setZegoRoomCallback(new IZegoRoomCallback() {
    // 其它回调实现
    ...

    // 流更新回调
    @Override
    public void onStreamUpdated(int type, ZegoStreamInfo[] zegoStreamInfos, String roomID) {
       // 房间流列表更新

       // 当登录房间成功后,如果房间内中途有人推流或停止推流。房间内其他人就能通过该回调收到流更新通知。
       for (ZegoStreamInfo streamInfo : zegoStreamInfos) {
           // 当有流新增的时候,拉流
           if (type == ZegoConstants.StreamUpdateType.Added) {
           // 开始拉流,此处的 view 需要自行管理,填写可用的视图
           zegoLiveRoom.startPlayingStream(streamInfo.streamID, textureView);
           // 设置拉流视图模式,此处采用 SDK 默认值--等比缩放填充整个 view,可能有部分被裁减。
           zegoLiveRoom.setViewMode(ZegoVideoViewMode.ScaleAspectFill, streamInfo.streamID);
           } 
           // 当有其他流关闭的时候,停止拉流
           else if (type == ZegoConstants.StreamUpdateType.Deleted) 
           {
               // 此处的 mPlayStreamIDs 是已拉取流的流名列表
              for (String playStreamID:mPlayStreamIDs){
                  if (playStreamID.equals(streamInfo.streamID)){
                     // 如果此条流是正在观看的流,停止拉取此条流
                     zegoLiveRoom.stopPlayingStream(streamInfo.streamID);
                     // 从已取流的流列表中移除该条流
                     mPlayStreamIDs.remove(streamInfo.streamID);

                     // 判断该条已关闭的流是否为主播流
                     if (streamInfo.userID.equals(mAnchorID)) {
                         // 可界面提示主播停止直播了

                         // 在已连麦的情况下,主播停止直播连麦观众也停止推流
                         if (isJoinedLive) {
                            zegoLiveRoom.stopPublishing();
                            // 停止预览
                            zegoLiveRoom.stopPreview();
                         }
                     }   

                     break;
                  }
              }
           }
      }
  }
});

4.3 登录房间

请参考文档:快速开始-登录房间

注意:必须登录主播所在的房间。 因为连麦操作的前提是主播正在推流,观众在与主播同一个房间里拉流观看。

4.4 拉流

登录房间成功后拉取房间内的流。

此示例代码会拉取主播房间所有正在推的流(主播流+连麦观众流),用户可根据实际业务需求,限制拉流数量。

/**
 * 在收到登录房间成功的回调后进行拉流。
 * 下述 zegoLiveRoom 是 SDK 的单例对象
 */

// 开始拉流前需要先登录房间,此处是以观众身份登录主播所在的房间
zegoLiveRoom.loginRoom(anchorID, ZegoConstants.RoomRole.Audience, new IZegoLoginCompletionCallback() {
     @Override
     public void onLoginCompletion(int errorCode, ZegoStreamInfo[] zegoStreamInfos) {
         if (errorCode == 0) {
            for (ZegoStreamInfo streamInfo:zegoStreamInfos){
                // 开始拉流,此处的 view 需要自行管理,填写可用的视图
                zegoLiveRoom.startPlayingStream(streamInfo.streamID, view);
                // 设置拉流视图模式,此处采用 SDK 默认值--等比缩放填充整个 view,可能有部分被裁减。
                zegoLiveRoom.setViewMode(ZegoVideoViewMode.ScaleAspectFill, streamInfo.streamID);
            }
         } else {
            Log.i("zego","登录房间失败");             
         }
     }    
});

拉流的详细介绍请参考文档:快速开始-拉流

4.5 与主播连麦

与主播进行连麦即观众进行推流。

观众想停止与主播连麦时,停止推流即可。

若有连麦者数量的限制,可在观众推流的地方进行控制,比如已连麦观众数已经达到上限时不允许推流。

/**
 * 观众进行推流
 * 下述 zegoLiveRoom 是 SDK 的单例对象
 */ 

// 设置预览视图模式,此处采用 SDK 默认值--等比缩放填充整个 view,可能有部分被裁减。
zegoLiveRoom.setPreviewViewMode(ZegoVideoViewMode.ScaleAspectFill);
// 设置预览视图,此处的 view 需要自行管理,填写可用的视图
zegoLiveRoom.setPreviewView(view);
// 启动预览
zegoLiveRoom.startPreview();
// 开始推流,flag 参数使用连麦场景
zegoLiveRoom.startPublishing(streamID, "audienceJoinLive", ZegoConstants.PublishFlag.JoinPublish);

5 API 参考列表

方法 描述
initSDK 初始化SDK
setZegoRoomCallback 设置房间信令相关的回调接口
setZegoIMCallback 设置 IM 回调接口,用于接收即时通信内容。
setZegoLivePublisherCallback 设置推流回调监听
setZegoLivePlayerCallback 设置拉流回调监听
setRoomConfig 设置房间配置信息
loginRoom 登录房间,推拉流之前必须登录房间
setPreviewViewMode 设置预览模式
setPreviewView 设置本地预览视频的视图
startPreview 启动本地预览
startPublishing 开始推流
startPlayingStream 开始拉流
setViewMode 设置用于拉流的View的播放模式
stopPublishing 停止推流
stopPlayingStream 停止拉流
logoutRoom 退出房间
unInitSDK 释放 SDK 资源,停止各种系统监听

6 相关文档

7 FAQ

Q1: 使用 ZEGO SDK 实现连麦,最大支持多少路连麦?

  答:由于设备性能的考虑,ZEGO SDK 在互推互拉的场景进行了限制,同个设备最大支持 12 路连麦。开发者如果希望支持更多路连麦,可联系 ZEGO 技术支持获取指定路数的SDK。

Q2: 如何实现主播邀请观众连麦、观众申请连麦?

  答:建议使用开发者自有的 IM 或第三方的 IM 来实现信令交互,也可以使用 ZEGO 的 sendCustomCommand 接口来实现。可参考 ZEGO 的 连麦 接口来做交互,此套连麦接口只是交互示例,消息收发不一定可靠,若开发者使用 ZEGO 的 IM 接口,须在业务上实现消息可靠性的逻辑。

Q3:A 观众和主播连麦成功后,B 观众也和主播连麦了,A 如何知道 B 的流?

  答:成功登录房间之后房间内的有新增的流时,SDK 都会通过 IZegoRoomCallback.onStreamUpdated 接口来通知,当 type == ZegoConstants.StreamUpdateType.Added 时是新增流相关的信息,开发者可根据业务需求,拉新增的流并做对应 UI 相关的操作。

Q4:观众或者连麦者如何知道主播是否停止直播了?

  答:当所登录房间中有流减少时,SDK 都会通过 IZegoRoomCallback.onStreamUpdated 接口来通知,当 type == ZegoConstants.StreamUpdateType.Deleted 时是删除流相关的信息,可以通过 ZegoStreamInfo 类型的参数获取到 userID,判断是否是主播;如果此条删除流是正在拉的流,需要停止拉流,并根据业务需求,做对应的 UI 相关的操作。

Q5: 使用 ZEGO SDK 实现连麦,连麦者多的时候设备发热严重,画面卡顿怎么办?

  答:此为正常现象,当所拉的流数增多,需要更高的带宽更高的性能来处理画面的渲染,当设备性能和带宽不够时,会发生画面卡顿,设备发热严重的现象,建议当开发者在连麦人数增多时适当降低推流分辨率和码率。

本篇目录