三、直播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 —— 聊天室ID
hostName: String —— 主播名称
title: String —— 活动主题
audienceJoinUrl —— 观众链接
startTime: Long —— 活动开始时间
endTime: Long —— 活动结束时间
liveCover: String —— 活动封面

相关接口:QSLiveSDK.getLiveRoomInfo(): QSLiveRoomInfo

4、获取拉流地址

接口:QSLiveSDK.getPullUrl(conferenceId: String): PullUrlResp?

该方法可以获取到直播拉流地址。该方法是一个suspend方法,如果调用方使用Java调用,可采用如下方式:

import org.jetbrains.annotations.NotNull;

import kotlin.coroutines.CoroutineContext;

public class JavaTest {

public static void main(String[] args) {
    QSLiveSDK.INSTANCE.getPullUrl("coferenceId", new Continuation<PullUrlResp>() {
            @Override
            public void resume(PullUrlResp value) {
                // todo 处理回调数据
            }

            @Override
            public void resumeWithException(@NotNull Throwable exception) {

            }

            @NotNull
            @Override
            public CoroutineContext getContext() {
                return null;
            }
        });
    }
}

如果使用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、埋点

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