LiveCoreView
是一个跨平台的视频直播核心组件,提供了直播中的关键能力,例如开播、观看、连麦和主播 PK。通过集成 LiveCoreView
,您可以在短时间内快速搭建直播主流程,并在此基础上添加您自己的业务 UI 视图,实现高度定制化的直播应用。效果展示
主播开播预览 | 观众观看 | 主播连麦 |
![]() | ![]() |
![]() |
环境准备
Android 5.0(SDK API Level 21)及以上版本。
Gradle 7.0 及以上的版本。
Android 5.0 及以上的手机设备。
快速开始
步骤 1:准备工作
步骤 2:集成与配置
1. 添加依赖:在您项目的 app/build.gradle.kts(或 build.gradle)文件中,添加 LiveCoreView 组件的依赖。
api("io.trtc.uikit:live-stream-core:latest.release")
api 'io.trtc.uikit:live-stream-core:latest.release'
2. 配置混淆规则:由于 SDK 内部使用了 Java 反射特性,请在 proguard-rules.pro 文件中添加以下代码,将相关类加入不混淆名单。
-keep class com.tencent.** { *; }-keep class com.trtc.uikit.livekit.livestreamcore.** { *; }-keep class com.google.gson.** { *;}
3. 配置清单文件:在 app/src/main/AndroidManifest.xml 文件的
<application>
节点中,添加以下配置以覆盖组件内部的设置,使用您自己的 android:allowBackup
。// app/src/main/AndroidManifest.xml<application...// 添加如下配置覆盖 依赖的 sdk 中的配置android:allowBackup="false"tools:replace="android:allowBackup">=
步骤 3:登录
在您的项目中调用
TUIRoomEngine.login
方法完成登录。这是使用 LiveCoreView
所有功能的关键前提。// 登录TUILogin.login(applicationContext,1400000001, // 请替换为开通服务控制台的 SDKAppID"denny", // 请替换为您的 UserID"xxxxxxxxxxx", // 您可以在控制台中计算一个 UserSig 并填在这个位置object : TUICallback() {override fun onSuccess() {Log.i(TAG, "login success")}override fun onError(errorCode: Int, errorMessage: String) {Log.e(TAG, "login failed, errorCode: $errorCode msg:$errorMessage")}})
// 登录TUILogin.login(context,1400000001, // 请替换为开通服务控制台的 SDKAppID"denny", // 请替换为您的 UserID"xxxxxxxxxxx", // 您可以在控制台中计算一个 UserSig 并填在这个位置new TUICallback() {@Overridepublic void onSuccess() {Log.i(TAG, "login success");}@Overridepublic void onError(int errorCode, String errorMessage) {Log.e(TAG, "login failed, errorCode: " + errorCode + " msg:" + errorMessage);}});
登录接口参数说明
参数 | 类型 | 说明 |
SDKAppID | int | |
UserID | String | 当前用户的唯一 ID,仅包含英文字母、数字、连字符和下划线。 |
userSig | String | 用于腾讯云鉴权的票据。请注意: 开发环境:您可以采用本地 GenerateTestUserSig.genTestSig 函数生成 userSig 或者 通过 UserSig 辅助工具 生成临时的 UserSig。生产环境:为了防止密钥泄露,请务必采用服务端生成 UserSig 的方式。详细信息请参考 服务端生成 UserSig。 |
组件使用
所有直播功能都通过
LiveCoreView
实现。主播预览与开播
步骤1:创建核心控件
您可以在 Activity 中通过代码或 XML 方式加载
LiveCoreView
。val livecoreView = LiveCoreView(this)
LiveCoreView liveCoreView = new LiveCoreView(this);
步骤2:开启直播预览
调用
startCamera
方法,开启本地摄像头的预览。这并不会真正开启直播间。livecoreView.startCamera(true, null)
liveCoreView.startCamera(true, null);
步骤3:开启直播间
调用
startLiveStream
方法,开启一个直播间并将本地音视频流推送到直播间。您可以通过 liveInfo.seatLayoutTemplateId
设置布局样式:val liveInfo = TUILiveListManager.LiveInfo()liveInfo.roomId = "123456"/**选择布局:如果要选择其他布局开播,设置 liveInfo.seatLayoutTemplateId = 600600: 动态宫格布局(默认)601: 浮动小窗布局800: 固定宫格布局801: 固定小窗布局*/liveInfo.seatLayoutTemplateId = 600livecoreView.startLiveStream(liveInfo, null)livecoreView.startMicrophone(null)
TUILiveListManager.LiveInfo liveInfo = new TUILiveListManager.LiveInfo();liveInfo.roomId = "roomId_123456";/**选择布局:如果要选择其他布局开播,设置 liveInfo.seatLayoutTemplateId = 600600: 动态宫格布局(默认)601: 浮动小窗布局800: 固定宫格布局801: 固定小窗布局*/liveInfo.seatLayoutTemplateId = 600livecoreView.startLiveStream(liveInfo, null);livecoreView.startMicrophone(null);
布局样式示例:
600 动态宫格布局 | 601 浮动小窗布局 | 800 固定宫格布局 | 801 固定小窗布局 |
![]() | ![]() | ![]() | ![]() |
观众观看
观众通过调用 joinLiveStream 方法进入直播间,并拉取主播的音视频流。
val livecoreView = LiveCoreView(this)livecoreView.joinLiveStream("roomId_123456", null)
LiveCoreView liveCoreView = new LiveCoreView(this);livecoreView.joinLiveStream("roomId_123456", null);
观众连麦
以下是以观众向主播发起连麦为例的典型流程。观众连麦效果预览:
单人连麦 | 多人连麦 |
![]() | ![]() |
步骤1:观众发送连麦请求
观众调用
requestIntraRoomConnection
向主播发送连麦请求。val userId = "anchorUserId"; // 修改为房主的UserId,传入空字符串时默认为房主UserIdval timeout = 60;liveCoreView.requestIntraRoomConnection(userId, 10, null)
String userId = "anchorUserId"; // 修改为房主的UserId,传入空字符串时默认为房主UserIdint timeout = 60;liveCoreView.requestIntraRoomConnection(userId, timeout, true, null);
步骤2:主播端收到连麦请求
主播在
onUserConnectionRequest
回调中收到观众的连麦请求。override fun onUserConnectionRequest(inviterUser: UserInfo) {Log.i(TAG, "收到观众连线请求:${inviterUser.userId}")}
@Overridepublic void onUserConnectionRequest(LiveStreamDefine.LiveUser inviterUser) {Log.i(TAG, "收到观众连线请求:" + inviterUser.userId);}:
步骤3:主播响应连麦请求
主播调用
respondIntraRoomConnection
同意或拒绝连麦。// 主播同意连麦liveCoreView.respondIntraRoomConnection(audienceBUserId, true, null)
// 主播同意连麦liveCoreView.respondIntraRoomConnection(userId, true, null);// 主播拒绝连麦liveCoreView.respondIntraRoomConnection(userId, false, null);
观众在
onUserConnectionAccepted
或 onUserConnectionRejected
回调中收到主播的响应。override fun onUserConnectionAccepted(inviterUser: UserInfo) {Log.i(TAG, "主播同意连线:${inviterUser.userId}")}
@Overridepublic void onUserConnectionAccepted(LiveStreamDefine.LiveUser liveUser) {Log.i(TAG, "观众同意连线:" + liveUser.userId);}@Overridepublic void onUserConnectionRejected(LiveStreamDefine.LiveUser liveUser) {Log.i(TAG, "观众拒绝连线:" + liveUser.userId);}:
步骤4:断开连麦
主播挂断观众连麦:
观众 B 和主播 A 连麦成功后,主播 A 断开和观众 B 的连麦。
val userId = "audienceBUserId"liveCoreView.disconnectUser(userId, null)
String userId = "audienceUserId";liveCoreView.disconnectUser(userId, null);
主播 A 断开和观众 B 的连麦请求后,观众 B 会收到 onUserConnectionTerminated 回调。
override fun onUserConnectionTerminated(inviterUser: UserInfo) {Log.i(TAG, "主播关闭连线")}
@Overridepublic void onUserConnectionTerminated() {Log.i(TAG, "主播关闭连线");}
观众主动结束连麦:
观众 B 和主播 A 连麦成功后,观众 B 主动断开连麦可以调用 terminateIntraRoomConnection。
liveCoreView.terminateIntraRoomConnection()
liveCoreView.terminateIntraRoomConnection();
当观众 B 主动断开连麦时,主播会收到 onUserConnectionExited 回调。
override fun onUserConnectionExited(inviterUser: LiveStreamDefine.LiveUser) {Log.i(TAG, "观众退出连线")}
@Overridepublic void onUserConnectionExited(UserInfo liveUser) {Log.i(TAG, "观众退出连线:${liveUser.userId}");}
主播连线
主播连线效果预览:
双主播连线 | 多主播连线 |
![]() | ![]() |
您可以按如下 API 来完成主播连线功能。这里以主播 A 与主播 B 连线为例实现如下,以下是主播 A 向主播 B 发起跨房连线的典型流程。
说明:
以下是由 LiveCoreView 提供的主动调用方法。
所有的回调方法是指 LiveCoreView 设置的 ConnectionObserver 对象中的回调方法。
步骤1:主播 A 发起连线
主播 A 调用
requestCrossRoomConnection
发起连线,传入主播 B 的房间 ID。主播 A 可通过
onCrossRoomConnectionAccepted
接收请求同意回调。val roomId = "anchorBRoomId"mLiveViewList.requestCrossRoomConnection(roomId, 10, null)
String roomId = "anchorBRoomId";mLiveViewList.requestCrossRoomConnection(roomId, 10, null);
步骤2:主播 B 收到连线请求
主播 B 在
onCrossRoomConnectionRequest
回调中收到连线请求。override fun onCrossRoomConnectionRequest(inviterUser: UserInfo) {Log.i(TAG, "收到主播A连线房间请求:${inviterUser.userId}")}
@Overridepublic void onCrossRoomConnectionRequest(LiveStreamDefine.RoomInfo roomInfo) {Log.i(TAG, "收到主播A连线房间请求:" + roomInfo.roomId);}
步骤3:主播 B 响应连线请求
主播 B 调用 respondToCrossRoomConnection 响应连线。
liveCoreView.respondToCrossRoomConnection(roomId, true, null)
// 同意连线请求liveCoreView.respondToCrossRoomConnection(roomId, true, null);
步骤4:退出连线
主播 B 调用
terminateCrossRoomConnection
退出连线。liveCoreView.terminateCrossRoomConnection
()
liveCoreView.terminateCrossRoomConnection
()
主播 PK
LiveCoreView 提供了主播 PK 相关的 API , 由于每种 PK 玩法的 UI 都不一样,所以LiveCoreView 只提供 API,您需要自己完成 UI 效果的实现。
主播 PK 效果预览:
双主播PK | 多主播PK |
![]() | ![]() |
说明:
PK 功能依赖于连线功能,所以您需要在主播连线的情况下才能发起 PK请求。
以下主动调用 API 是由
LiveCoreView
提供。所有的回调方法是指
LiveCoreView
设置的 BattleObserver
对象中的回调方法。您可以按如下 API 来完成主播PK功能。这里以主播 A 与主播 B PK 为例实现如下。
步骤1:主播 A 发起 PK
主播 A 调用
requestBattle
发起 PK。主播 A 可通过
onBattleRequestAccept
接收 PK 同意回调。val BATTLE_DURATION = 30val battleConfig = BattleConfig()battleConfig.duration = BATTLE_DURATIONbattleConfig.needResponse = truebattleConfig.extensionInfo = ""val list: MutableList<String> = ArrayList()list.add("anchorBUserId")val BATTLE_REQUEST_TIMEOUT = 10liveCoreView.requestBattle(battleConfig, list, BATTLE_REQUEST_TIMEOUT,object : LiveCoreViewDefine.BattleRequestCallback {override fun onSuccess(battleId: String, requestedUserIdList: List<String>) {}override fun onError(error: TUICommonDefine.Error, message: String) {}})
final int BATTLE_DURATION = 30;TUILiveBattleManager.BattleConfig battleConfig = new TUILiveBattleManager.BattleConfig();battleConfig.duration = BATTLE_DURATION;battleConfig.needResponse = true;battleConfig.extensionInfo = "";List<String> list = new ArrayList<>();list.add("anchorBUserId");final int BATTLE_REQUEST_TIMEOUT = 10;liveCoreView.requestBattle(battleConfig, list, BATTLE_REQUEST_TIMEOUT,new LiveCoreViewDefine.BattleRequestCallback() {@Overridepublic void onSuccess(String battleId, List<String> requestedUserIdList) {}@Overridepublic void onError(TUICommonDefine.Error error, String message) {}});
步骤2:主播 B 收到 PK 请求
主播 B 通过
onBattleRequestReceived
接收 PK 请求回调。override fun onBattleRequestReceived(battleId: String, inviterUser: BattleUser, invitee: BattleUser) {Log.i(TAG, "收到主播 A 的 PK 请求::$battleId")}
@Overridepublic void onBattleRequestReceived(String battleId, BattleUser inviter, BattleUser invitee) {Log.i(TAG, "收到主播 A 的 PK 请求:" + battleId);}
步骤3:主播 B 响应 PK 请求
主播 B 通过调用
respondToBattle
响应 PK 请求。// 同意 PK 请求val battleId = "battleId"liveCoreView.respondToBattle(battleId, true, null)
// 同意 PK 请求String battleId = "battleId";liveCoreView.respondToBattle(battleId, true, null);
主播 A、B 以及房间内观众收到
onBattleStarted
,收到 PK 开始通知。 override fun onBattleStarted(battleInfo: BattleInfo) {Log.i(TAG, "PK 开始回调")}
@Overridepublic void onBattleStarted(BattleInfo battleInfo) {Log.i(TAG, "主播连线房间列表更新");}
步骤4:退出 PK
自然结束:当 PK 时间截止时,会收到
onBattleEnded
回调。主动停止:主播 B 调用
terminateBattle
自己会退出 PK,主播 A 会收到 onUserExitBattle
。mLiveCoreView.terminateBattle(battleId, null)
mLiveCoreView.terminateBattle(battleId, null);