三、直播SDK接口说明
1、进入和退出直播间
(1)进入直播间
接口:QSLiveSDK.enterRoom(req: QSLiveReq)
接口说明可参考第二章中joinLive()接口的参数说明。对于快速集成的客户来说,可以不关心该接口。
注意:当处于直播间小窗状态时,进入其他直播间前需要SDK集成方先退出上一场直播间,否则会直接调起上一场直播间。
(2)退出直播间
接口:QSLiveSDK.exitRoom()
接口。
对于快速集成的客户来说,可以不关心该接口。
(3)监听直播间进入结果
如果想要监听进入直播间是否成功,可以调用以下接口监听进入直播间结果回调
QSLiveSDK.registerLiveConnectResult(callback: QSLiveConnectResultCallback)private val connectCallback = object : QSLiveConnectResultCallback { override fun onConnectSuccess() { QSLiveSDK.getChatService()?.addChatCallback(chatCallback) QSLiveSDK.getVoiceChatService()?.addVoiceChatCallback(voiceCallback) fetchHistoryMessage() connectResultLiveData.postValue(true) } override fun onConnectFailed(code: Int, message: String) { connectResultLiveData.postValue(false) }}
2、监听直播间推流状态
QSLiveSDK.getChatRoomService().addChatRoomCallback(callback: QSLiveRoomCallback)private val heartBeatCallback = object: QSLiveRoomCallback { override fun onLiveStatusChanged(liveStatus: QSLiveStatus) { when (liveStatus) { QSLiveStatus.START -> "直播开始推流" QSLiveStatus.END, QSLiveStatus.NOT_START, QSLiveStatus.WAIT, QSLiveStatus.END_RECORDING, QSLiveStatus.RECORDED -> "直播已结束" else -> {} } }}
3、获取直播间信息
获取直播间相关的信息,主要信息如下:
roomId: String —— 聊天室IDhostName: String —— 主播名称title: String —— 活动主题audienceJoinUrl —— 观众链接startTime: Long —— 活动开始时间endTime: Long —— 活动结束时间liveCover: String —— 活动封面
相关接口:QSLiveSDK.getLiveRoomInfo(): QSLiveRoomInfo
4、获取拉流地址
接口:QSLiveSDK.getPullUrl(conferenceId: String): PullUrlResp?
该方法可以获取到直播拉流地址。可采用如下方式:
QSLiveSDK.INSTANCE.getPullUrl("coferenceId", new Continuation<PullUrlResp>() { }
如果使用kotlin调用,需要放到协程中调用。
5、直播间观众服务
直播SDK提供直播间观众进入、退出、被踢出直播间相关的回调,方便集成方处理相关的业务逻辑
注册监听接口: QSLiveCoreSDK.getMemberService()?.addMemberCallback(memberCallbackQSLiveMemberCallback)
接口回调类:
interface QSLiveMemberCallback { /** * 有新的观众进入直播间 */ fun onMemberAdd(user: QSLiveUserInfo) {} /** * 有观众离开直播间 */ fun onMemberRemove(userId: String) {} /** * 直播间观众信息变化 */ fun onMemberChanged(user: QSLiveUserInfo) {} /** * 当主播把当前观众踢出直播间时会收到此回调 */ fun onKickOut() {}}
6、集成观众连麦
观众连麦有两种类型:HandUpType.MESSAGE
,HandUpType.SOCKET
;具体使用哪种类型,取决于主持人通过何种方式获取连麦列表;如果主持人使用云会议 PC 客户端,则请使用 HandUpType.SOCKET
类型;如果主持人通过直播 sdk 获取连麦列表(即QSLiveVoiceChatService.getRequestMemberList
),请使用 HandUpType.MESSAGE
。
举手方法请调用 QSLiveVoiceChatService.requestVoiceChat()
,并且传入相应的类型,默认类型为 HandUpType.MESSAGE
。
在举手过程中,如果观众想要取消举手请调用 QSLiveVoiceChatService.cancelVoiceChat()
,并传入相应的类型;
当主持人对连麦观众进行操作时,观众会收到以下回调;
interface QSLiveVoiceCallback { /** * 主播对于连麦请求的回应 * @param status 0: 同意;1: 不同意 */ fun onAudienceRequestResult(status: Int) {} /** * 观众收到主持人结束发言的回调 */ fun onAudienceSpeakingFinish() {}}
主持人可以邀请观众发言,通过调用 QSLiveVoiceChatService.inviteVoiceChat();
观众会收到相应回调,观众可以调用 agreeHostInvite 或 denyHostInvite 来同意或者拒绝主持人的邀请,主持人会收到相应回调;
interface QSLiveVoiceCallback { /** * 观众收到主播的连麦邀请,观众端实现 * @param userId 主播邀请的观众,回调中需要比对观众自己的 id * @param hostId 主播 Id */ fun onHostRequest(userId: String, hostId: String) {} /** * 观众对于主播邀请连麦的回应,主持人端实现 * @param userId 观众的 Id * @param status 0: 同意;1: 不同意 */ fun onHostRequestResult(userId: String, status: Int) {}}
7、会中自定义 View
连麦成功后,需要会中和直播间的 UI 一致;
自定义 View 需要实现 下面的接口:
interface AudienceCustomView { /** * 提供自定义 View 在会中的共享池容器,共享池将始终填充该容器 */ fun getVideoContainer(): FrameLayout}
自定义 View 的具体实现可参考 demo 中的 InteractionCustomView ;
设置自定义 View 需要实现 QSMeetingCustomViewProvider ,具体如下:
QSLiveSDK.setMeetingCustomViewProvider(object: QSMeetingCustomViewProvider(){ override fun provideCustomView(context: Context): AudienceCustomView { return InteractionCustomView(context) }})
8、会中共享池
如果您只是想要直播间实时的画面而不想发生页面的跳转,推荐您直接获取会中共享池;
首先在连麦成功后进行入会,注册入会的回调 ;
interface QSJoinMeetingCallback { /** * 入会成功 */ fun onJoinSuccess() /** * 入会过程中,用户自己取消 */ fun onJoinCancelled() {} /** * 入会失败 * @param errorCode 错误码 * @param message 错误信息 */ fun onJoinFailed(errorCode: Int, message: String)}
在入会成功的回调中调用 setUpLivePool 方法;
/** * 向指定容器中添加共享池,注意此操作会移除该容器中的所有子视图,并添加共享池; * 如果你要为共享池添加控制视图,请在此方法之后设置; * @param container 承载共享池的容器 */fun setUpLivePool(container: ConstraintLayout)
9、入白名单会议
该方法不再建议使用,后续会废弃。推荐使用带jointId参数的直播链接入会。 如果预约的会议是白名单会议,需要额外调用一个接口获取jointId,在调用
TangInterface.joinConference()
接口时传入jointId和phone
获取jointId时,需要按角色区分嘉宾或观众。注意观众身份拿jointId时需要传入当前这场会的主持人ID(hostId)和观众链接(会议信息中的audienceUnionUrl)
QSLiveCoreSDK.getJointId(req: QSGetJointIdReq, role: QSLiveRole, callback: (success: Boolean, jointId: String, msg: String?) -> Unit)enum class QSLiveRole { /** * 嘉宾身份 */ ROLE_GUEST, /** * 观众身份 */ ROLE_AUDIENCE}
10、启用云会议会中的互动功能
在使用直播SDK通过嘉宾链接或观众链接入会时,如果需要互动功能,可以调用该接口
QSLiveSDK.enableMeetingInteraction()
11、添加自定义分享功能
我们提供了用户可自定义分享功能,以满足用户不同的分享需求
/** * 添加自定义分享类型 * @param location 添加的位置 * @param list 自定义分享类型 * @param insertHead 是否从头部添加 否则从尾部添加 */QSLiveSDK.getLiveCustomConfig().addCustomShareTypes(location, customTypes)/** * 分享位置 */enum class LiveShareLocation { ROOM, // 直播间 POSTER // 海报}/** * 自定义分享数据 */class LiveCustomShareData { var customKey: String? = null // 自定义key var customTitle: String? = null // 自定义标题 var customIconRes: Int? = null // 自定义Icon 本地资源 var customIconUrl: String? = null // 自定义Icon 网络资源}/** * 添加自定义分享回调 */QSLiveSDK.getLiveCustomConfig().customShareListener = object : LiveShareListener { override fun onShareStart( context: Context, location: LiveShareLocation, shareInfo: LiveCustomShareInfo ) {} }/** * 自定义分享的回调数据 */class LiveCustomShareInfo { var key: String? = null // 自定义分享的key var liveTitle: String? = null // 直播标题 var liveLogo: String? = null // 直播logo var liveLink: String? = null // 直播链接 var liveCode: String? = null // 直播码 var livePoster: String? = null // 直播海报 var liveTimeStart: Long? = null // 直播开启时间 var liveTimeEnd: Long? = null // 直播结束时间 var liveHost: String? = null // 直播主办方}/** * 设置已有分享功能的开关项 */QSLiveSDK.getLiveCustomConfig().setCustomShareConfig(customShareConfig)/** * 分享功能开关项详情 */class CustomShareConfig( var linkEnable: Boolean = true // 分享链接是否可用 var posterEnable: Boolean = true // 分享海报是否可用 var posterSaveEnable: Boolean = true // 海报下载是否可用)
12、埋点
埋点服务在进入直播间成功以后自动启动,不再需要手动调用启动