三、直播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.MESSAGEHandUpType.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、埋点

埋点服务在进入直播间成功以后自动启动,不再需要手动调用启动