LiveCoreView
是一个跨平台的视频直播核心组件,提供了直播中的关键能力,例如开播、观看、连麦和主播 PK。通过集成 LiveCoreView
,您可以在短时间内快速搭建直播主流程,并在此基础上添加您自己的业务 UI 视图,实现高度定制化的直播应用。效果展示
主播开播预览 | 观众观看 | 主播连麦 |
![]() | ![]() |
![]() |
环境准备
Xcode 15 及以上。
iOS 13.0 及以上。
CocoaPods 环境安装,点击查看。
组件接入
步骤 1:开通服务
步骤 2:集成与配置
1. 添加依赖:请在您的 Podfile 文件中添加
pod 'LiveStreamCore'
依赖。target 'xxxx' do......pod 'LiveStreamCore'end
2. 安装组件:在终端中
cd
到 Podfile 所在的目录,然后执行以下命令来安装组件。pod install
步骤 3:登录
在您的项目中调用
TUIRoomEngine.login
方法完成登录。这是使用 LiveCoreView
所有功能的关键前提。//// AppDelegate.swift//import RTCRoomEnginefunc application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {TUIRoomEngine.login(sdkAppId: 1400000001, // 请替换为步骤一取到的 SDKAppIDuserId: "denny", // 请替换为您的 UserIDuserSig: "xxxxxxxxxxx") { // 您可以在控制台中计算一个 UserSig 并填在这个位置print("login success")} onError: { code, message inprint("login failed, code: \\(code), error: \\(message ?? "nil")")}return true}
登录接口参数说明
参数 | 类型 | 说明 |
SDKAppID | int | |
UserID | String | 当前用户的唯一 ID,仅包含英文字母、数字、连字符和下划线。 |
userSig | String | 用于腾讯云鉴权的票据。请注意: 开发环境:您可以采用本地 GenerateTestUserSig.genTestSig 函数生成 userSig 或者 通过 UserSig 辅助工具 生成临时的 UserSig。生产环境:为了防止密钥泄露,请务必采用服务端生成 UserSig 的方式。详细信息请参考 服务端生成 UserSig。 |
组件使用
所有直播功能都通过
LiveCoreView
实现。主播预览与开播
1. 创建核心控件:
import LiveStreamCorelet liveCoreView = LiveCoreView()
2. 开启直播预览:
调用
startCamera
方法,开启本地摄像头的预览。这并不会真正开启直播间。import LiveStreamCoreliveCoreView.startCamera(useFrontCamera: true) {} onError: { code, message in}
3. 开启直播间:
调用
startLiveStream
方法,开启一个直播间并将本地音视频流推送到直播间。您可以通过 liveInfo.seatLayoutTemplateId
设置布局样式:import LiveStreamCoreimport RTCRoomEnginelet liveInfo = TUILiveInfo()liveInfo.roomId = "123456"liveInfo.seatMode = .applyToTake/**选择布局:如果要选择其他布局开播,设置 liveInfo.seatLayoutTemplateId = 600600: 动态宫格布局(默认)601: 浮动小窗布局800: 固定宫格布局801: 固定小窗布局*/liveInfo.seatLayoutTemplateId = 600liveCoreView.startLiveStream(liveInfo: liveInfo) { roomInfo in} onError: { code, message in}liveCoreView.startMicrophone {} onError: { code, message in}
布局样式示例:
600 动态宫格布局 | 601 浮动小窗布局 | 800 固定宫格布局 | 801 固定小窗布局 |
![]() | ![]() | ![]() | ![]() |
观众观看
观众通过调用
joinLiveStream
方法进入直播间,并拉取主播的音视频流。import LiveStreamCorelet liveCoreView = LiveCoreView()liveCoreView.joinLiveStream(roomId: "roomId_123456") { roomInfo in} onError: { code, message in}
观众连麦
以下是以观众向主播发起连麦为例的典型流程。观众连麦效果预览:
单人连麦 | 多人连麦 |
![]() | ![]() |
1. 观众发送连麦请求
观众调用
requestIntraRoomConnection
向主播发送连麦请求。let timeout = 60let userId = "anchorUserId" // 修改为房主的UserId,传入空字符串时默认为房主UserIdliveCoreView.requestIntraRoomConnection(userId: userId, timeOut: timeOut, openCamera: true) {} onError: { code, message in}
2. 主播端收到连麦请求
主播在
onUserConnectionRequest
回调中收到观众的连麦请求。func onUserConnectionRequest(inviterUser: TUIUserInfo) {print("收到观众连线请求:\\(inviterUser.userId)")}
3. 主播响应连麦请求
3.1 主播调用
respondIntraRoomConnection
同意或拒绝连麦。// 主播同意连麦liveCoreView.respondIntraRoomConnection(userId: audienceBUserId, isAccepted: true) {} onError: { code, message in}
3.2 观众在
onUserConnectionAccepted
或 onUserConnectionRejected
回调中收到主播的响应。func onUserConnectionAccepted(userId: String) {print("主播同意连线:\\(userId)")}
4. 断开连麦
主播挂断观众连麦:
观众 B 和主播 A 连麦成功后,主播 A 断开和观众 B 的连麦。
let userId = "audienceBUserId"liveCoreView.disconnectUser(userId: userId) {} onError: { code, message in}
主播 A 断开和观众 B 的连麦请求后,观众 B 会收到 onUserConnectionTerminated 回调。
func onUserConnectionTerminated() {print("主播关闭连线")}
观众主动结束连麦:
观众 B 和主播 A 连麦成功后,观众 B 主动断开连麦可以调用 terminateIntraRoomConnection。
liveCoreView.terminateIntraRoomConnection()
当观众 B 主动断开连麦时,主播会收到 onUserConnectionExited 回调。
func onUserConnectionExited(userInfo: TUIUserInfo) {print("观众退出连线")}
主播连线
主播连线效果预览:
双主播连线 | 多主播连线 |
![]() | ![]() |
您可以按如下 API 来完成主播连线功能。这里以主播 A 与主播 B 连线为例实现如下,以下是主播 A 向主播 B 发起跨房连线的典型流程。
说明:
以下是由 LiveCoreView 提供的主动调用方法。
所有的回调方法是指 LiveCoreView 设置的 ConnectionObserver 对象中的回调方法。
1. 主播 A 发起连线
主播 A 调用
requestCrossRoomConnection
发起连线,传入主播 B 的房间 ID。主播 A 可通过
onCrossRoomConnectionAccepted
接收请求同意回调。let roomId = "anchorRoomId"liveCoreView.requestCrossRoomConnection(roomId: roomId, timeOut: 60) {} onError: { code, message in}
2. 主播 B 收到连线请求
主播 B 在
onCrossRoomConnectionRequest
回调中收到连线请求。func onCrossRoomConnectionRequest(hostUser: TUIConnectionUser) {print("收到主播A连线房间请求:\\(hostUser.userId)")}
3. 主播 B 响应连线请求
主播 B 调用 respondToCrossRoomConnection 响应连线。
liveCoreView.respondToCrossRoomConnection(roomId: roomId, isAccepted: true) {} onError: { code, message in}
4. 退出连线
主播 B 调用
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 同意回调。let roomId = "anchorRoomId"let config = TUIBattleConfig()config.duration = battleDurationconfig.needResponse = trueconfig.extensionInfo = ""let userIdList: [String] = []let timeout: TimeInterval = 10liveCoreView.requestBattle(config: config, userIdList: userIdList, timeout: timeout) {[weak self] (battleId, battleUserList) in} onError: { _, _ in}
2. 主播 B 收到 PK 请求
主播 B 通过
onBattleRequestReceived
接收 PK 请求回调。extension ViewContrller: BattleObserver { //替换为您真实的类名func onBattleRequestReceived(battleId: String, inviter: TUIBattleUser, invitee: TUIBattleUser) {}}
3. 主播 B 响应 PK 请求
主播 B 通过调用
respondToBattle
响应 PK 请求。liveCoreView.respondToBattle(battleId: manager.battleState.battleId, isAccepted: false, onSuccess: { [weak self] in}, onError: { _, _ in})
主播 A、B 以及房间内观众收到
onBattleStarted
,收到 PK 开始通知。 extension ViewContrller: BattleObserver { //替换为您真实的类名func onBattleStarted(battleInfo: TUIBattleInfo)) {}}
4. 退出 PK 流程
自然结束:当 PK 时间截止时,会收到
onBattleEnded
回调。主动停止:主播 B 调用
terminateBattle
自己会退出 PK,主播 A 会收到 onUserExitBattle
。liveCoreView.terminateBattle(battleId: manager.battleState.battleId) {} onError: { _, _ in}