本文讲述zego即构科技实时音视频SDK高级功能之一:主播-观众连麦功能,以iOS环境为例。
1、简介
预先说明: 由于观众端也可以推流成为主播,为了避免歧义,下文中的观众均指 ZegoRole 为 ZEGO_AUDIENCE 的角色,主播均指 ZegoRole 为 ZEGO_ANCHOR 的角色。
SDK 提供了主播和观众的连麦(多主播同台)功能,支持主播与观众互动。直播中的连麦分为两种情况:
1.1观众向主播申请连麦。
1.2主播邀请观众连麦。
下面分别介绍这两种方式的实现。
2、准备工作
连麦操作的前提是主播正在推流、观众正在同一房间拉流观看。因此前置步骤同推拉流一致,此处不再赘述。
2.1 主播推流
参考:初级功能指南-推流。请注意,连麦模式推流,需要指定 startPublishing:title:flag: 中的 flag 为 ZEGO_JOIN_PUBLISH。
2.2 观众拉流
参考:初级功能指南-拉流
3、观众申请连麦
观众申请连麦的流程为:
观众向主播提出连麦申请
主播收到观众的连麦申请
主播响应连麦申请(同意或拒绝)
观众获取申请连麦结果
主播结束连麦(或观众结束连麦)
观众获取结束连麦结果
流程图如下所示:
按照上述步骤,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、主播邀请连麦
主播邀请观众连麦的流程为:
主播向观众提出连麦邀请
观众收到主播的连麦邀请
观众响应连麦申请(同意或拒绝)
主播获取邀请连麦结果
主播结束连麦(或观众结束连麦)
观众获取结束连麦结果
流程图如下所示:
按照上述步骤,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、连麦系统架构图
连麦系统架构图如下所示: