主播-观众连麦

下载pdf
更新时间:2019-04-29 16:06

1 简介

预先说明: 由于观众端也可以推流成为主播,为了避免歧义,下文中的观众均指 ZegoRoleZEGO_AUDIENCE 的角色,主播均指 ZegoRoleZEGO_ANCHOR 的角色。

SDK 提供了主播和观众的连麦(多主播同台)功能,支持主播与观众互动。直播中的连麦分为两种情况:

  1. 观众向主播申请连麦。
  2. 主播邀请观众连麦。

下面分别介绍这两种方式的实现。

2 准备工作

连麦操作的前提是主播正在推流、观众正在同一房间拉流观看。因此前置步骤同推拉流一致,此处不再赘述。

2.1 主播推流

参考文档:快速集成-推流

请注意,连麦模式推流,需要指定 startPublishing:title:flag: 中的 flag 为 ZEGO_JOIN_PUBLISH

2.2 观众拉流

参考文档:快速集成-拉流

3 观众申请连麦

观众申请连麦的流程为:

  1. 观众向主播提出连麦申请
  2. 主播收到观众的连麦申请
  3. 主播响应连麦申请(同意或拒绝)
  4. 观众获取申请连麦结果
  5. 主播结束连麦(或观众结束连麦)
  6. 观众获取结束连麦结果

流程图如下所示:

按照上述步骤,SDK API 调用过程如下所示。

请特别注意:

下述处理流程中,请开发者注意区分各 API 是属于观众端逻辑,还是主播端逻辑。否则可能导致数据流不通,功能异常。

3.1 观众申请连麦

开发者需要在观众端调用此 API 实现连麦请求。主播端的响应结果会通过其中的 blk 回调。

ZegoLiveRoomApi-Player.h

/**
 请求连麦

 @param blk 回调 block
 @return true 成功,false 失败
 @attention 观众请求连麦后,主播会收到 [ZegoLivePublisherDelegate -onJoinLiveRequest:fromUserID:fromUserName:roomID:] 回调
 @note 连麦成功后,结果通过 blk 回调
 */
- (bool)requestJoinLive:(ZegoResponseBlock)blk;

3.2 主播收到连麦请求

由于开发者已经在主播推流环节,设置了 ZegoLivePublisherDelegate 代理对象,此处无需再次设置。

观众连麦请求发送成功后,主播端可直接在此 API 中收到观众端的连麦申请。

ZegoLiveRoomApi-Publisher.h

/**
 收到连麦请求

 @param seq 连麦请求序列号,标识当次连麦请求
 @param userId 来源用户 ID
 @param userName 来源用户名
 @param roomID 房间 ID
 @attention 观众调用 [ZegoLiveRoomApi (Player) -requestJoinLive] 申请连麦后,主播端会收到本通知
 */
- (void)onJoinLiveRequest:(int)seq fromUserID:(NSString *)userId fromUserName:(NSString *)userName roomID:(NSString *)roomID;

3.3 主播响应连麦

主播端收到观众端的连麦请求后,需要调用此 API 做出响应(同意或拒绝)。

一般是在 3.2 onJoinLiveRequest 的通知中调用此 API 响应。

ZegoLiveRoomApi-Publisher.h

/**
 响应连麦请求

 @param seq 连麦请求序列号,标识当次连麦请求
 @param rspResult 响应结果,0 表示同意连麦
 @return true 成功,false 失败
 @attention 主播端通过 [ZegoLivePublisherDelegate -onJoinLiveRequest:fromUserID:fromUserName:seq:] 收到观众连麦申请,再调用本 API 响应
 */
- (bool)respondJoinLiveReq:(int)seq result:(int)rspResult;

3.4 观众获取连麦结果

观众端可直接在 3.1 requestJoinLive 的回调 blk 中获取主播端的响应结果,无需额外调用其他 API。

3.5 主播结束连麦

连麦结束后,开发者需要在主播端调用此 API 结束与指定观众的连麦。

/**
 结束连麦

 @param userId 指定 UserId 停止连麦
 @param block 信令发送结果
 @return true 成功,false 失败
 */
- (bool)endJoinLive:(NSString *)userId completionBlock:(ZegoCustomCommandBlock)block;

除此之外,观众也可结束连麦,调用 stopPublishing 即可。

3.6 观众获取结束连麦结果

主播端结束连麦后,观众端可在此 API 中获取结束连麦的通知,并在其中进行一些清理操作。

/**
 收到结束连麦信令

 @param fromUserId 来源用户 ID
 @param fromUserName 来源用户名
 @param roomID 房间 ID
 */
- (void)onEndJoinLiveCommad:(NSString *)fromUserId userName:(NSString *)fromUserName roomID:(NSString *)roomID;

此步骤仅适用于主播结束连麦,观众调用 stopPublishing 结束连麦,主播方不支持类似回调,但可以通过房间流的删减知悉。

4 主播邀请连麦

主播邀请观众连麦的流程为:

  1. 主播向观众提出连麦邀请
  2. 观众收到主播的连麦邀请
  3. 观众响应连麦申请(同意或拒绝)
  4. 主播获取邀请连麦结果
  5. 主播结束连麦(或观众结束连麦)
  6. 观众获取结束连麦结果

流程图如下所示:

按照上述步骤,SDK API 调用过程如下。

请特别注意:

下述处理流程中,请开发者注意区分各 API 是属于观众端逻辑,还是主播端逻辑。否则可能导致数据流不通,功能异常。

4.1 主播邀请连麦

开发者需要在主播端调用此 API 实现连麦邀请,邀请的观众必须是同一房间内的观众。观众端的响应结果会通过其中的 blk 回调。

ZegoLiveRoomApi-Publisher.h

/**
 邀请连麦

 @param userID 准备邀请的用户 ID
 @param blk 邀请成功后,通过 blk 回调结果
 @return true 成功,false 失败
 @attention 主播邀请连麦成功后,被邀请的观众收到  [ZegoLivePlayerDelegate -onInviteJoinLiveRequest:fromUserID:fromUserName:roomID:] 通知
 */
- (bool)inviteJoinLive:(NSString *)userID responseBlock:(ZegoResponseBlock)blk;

4.2 观众收到连麦邀请

由于开发者已经在观众拉流环节,设置了 ZegoLivePlayerDelegate 代理对象,此处无需再次设置。

主播连麦邀请发送成功后,被邀请的观众端可直接在此 API 中收到主播端的连麦请求。

ZegoLiveRoomApi-Player.h

/**
 收到主播端的邀请连麦请求

 @param seq 连麦请求序列号,标识当次连麦请求
 @param userId 来源用户 ID
 @param userName 来源用户名
 @param roomID 房间 ID
 @attention 主播端调用 [ZegoLiveRoomApi (Publisher) -inviteJoinLive:responseBlock:] 邀请观众连麦后,观众端会收到此通知
 @note 建议在此通知中,调用 [ZegoLiveRoomApi (Player) -respondInviteJoinLiveReq:result:] 回应邀请连麦请求
 */
- (void)onInviteJoinLiveRequest:(int)seq fromUserID:(NSString *)userId fromUserName:(NSString *)userName roomID:(NSString *)roomID;

4.3 观众响应连麦

观众端收到主播端的连麦邀请后,需要调用此 API 做出响应(同意或拒绝)。一般是在 4.2 onInviteJoinLiveRequest 的通知中调用此 API 响应。

ZegoLiveRoomApi-Player.h

/**
 回应主播端的邀请连麦请求

 @param seq 连麦请求序列号,标识当次连麦请求
 @param rspResult 回应,0 为同意
 @return true 成功,false 失败
 @attention 一般在 [ZegoLivePlayerDelegate -onInviteJoinLiveRequest:fromUserID:fromUserName:roomID:] 中调用本 API 回应邀请连麦请求
 */
- (bool)respondInviteJoinLiveReq:(int)seq result:(int)rspResult;

4.4 主播获取连麦结果

主播端可直接在 4.1 inviteJoinLive 的回调 blk 中获取观众端的响应结果,无需额外调用其他 API。

4.5 主播结束连麦

连麦结束后,开发者需要在主播端调用此 API 结束与指定观众的连麦。

/**
 结束连麦

 @param userId 指定 UserId 停止连麦
 @param block 信令发送结果
 @return true 成功,false 失败
 */
- (bool)endJoinLive:(NSString *)userId completionBlock:(ZegoCustomCommandBlock)block;

除此之外,观众也可结束连麦,调用 stopPublishing 即可。

4.6 观众获取结束连麦结果

主播端结束连麦后,观众端可在此 API 中获取结束连麦的通知,并在其中进行一些清理操作。

/**
 收到结束连麦信令

 @param fromUserId 来源用户 ID
 @param fromUserName 来源用户名
 @param roomID 房间 ID
 */
- (void)onEndJoinLiveCommad:(NSString *)fromUserId userName:(NSString *)fromUserName roomID:(NSString *)roomID;

此步骤仅适用于主播结束连麦,观众调用 stopPublishing 结束连麦,主播方不支持类似回调,但可以通过房间流的删减知悉。

5 连麦系统架构图

连麦系统架构图如下所示: