tencent cloud

实时音视频

动态与公告
产品动态
产品近期公告
关于 TRTC Live 正式上线的公告
关于TRTC Conference 正式版上线的公告
Conference 商业化版本即将推出
关于多人音视频 Conference 开启内测公告
关于音视频通话 Call 正式版上线的公告
关于腾讯云音视频终端 SDK 播放升级及新增授权校验的公告
关于 TRTC 应用订阅套餐服务上线的相关说明
产品简介
产品概述
基本概念
产品功能
产品优势
应用场景
性能数据
购买指南
计费概述
免费时长说明
月订阅
现收现付
TRTC 逾期与暂停政策
常见问题解答
退款说明
新手指引
Demo 体验
视频通话 SDK
组件介绍
开通服务
跑通 Demo
快速接入
离线唤醒
会话聊天
云端录制
AI 降噪
界面定制
Chat 集成通话能力
更多特性
无 UI 集成
服务端 API
客户端 API
解决方案
错误码表
发布日志
常见问题
视频会议 SDK
组件介绍(TUIRoomKit)
开通服务(TUIRoomKit)
跑通 Demo(TUIRoomKit)
快速接入(TUIRoomKit)
屏幕共享(TUIRoomKit)
预定会议(TUIRoomKit)
会中呼叫(TUIRoomKit)
界面定制(TUIRoomKit)
虚拟背景(TUIRoomKit)
会议控制(TUIRoomKit)
云端录制(TUIRoomKit)
AI 降噪(TUIRoomKit)
会中聊天(TUIRoomKit)
机器人推流(TUIRoomKit)
更多特性(TUIRoomKit)
客户端 API(TUIRoomKit)
服务端 API(TUIRoomKit)
常见问题(TUIRoomKit)
错误码 (TUIRoomKit)
SDK更新日志(TUIRoomKit)
直播与语聊 SDK
Live 视频直播计费说明
组件介绍
开通服务(TUILiveKit)
跑通 Demo
无 UI 集成
UI 自定义
直播监播
视频直播
语聊房
高级功能
客户端 API
服务端 API
错误码
发布日志
常见问题
RTC Engine
开通服务
SDK 下载
API-Example
接入指引
API-参考手册
高级功能
AI 集成
概述
MCP 配置
Skills 配置
集成指南
常见问题
RTC RESTFUL API
History
Introduction
API Category
Room Management APIs
Stream mixing and relay APIs
On-cloud recording APIs
Data Monitoring APIs
Pull stream Relay Related interface
Web Record APIs
AI Service APIs
Cloud Slicing APIs
Cloud Moderation APIs
Making API Requests
Call Quality Monitoring APIs
Usage Statistics APIs
Data Types
Appendix
Error Codes
控制台指南
应用管理
套餐包管理
用量统计
监控仪表盘
开发辅助
解决方案
实时合唱
常见问题
迁移指南
计费相关
功能相关
UserSig 相关
应对防火墙限制相关
缩减安装包体积相关
Andriod 与 iOS 相关
Web 端相关
Flutter 相关
Electron 相关
TRTCCalling Web 相关
音视频质量相关
其他问题
旧版文档
RTC RoomEngine SDK(旧)
集成 TUIRoom (Web)
集成 TUIRoom (Android)
集成 TUIRoom (iOS)
集成 TUIRoom (Flutter)
集成 TUIRoom (Electron)
TUIRoom API 查询
实现云端录制与回放(旧)
监控仪表盘计费(旧)
协议与策略
安全合规认证
安全白皮书
信息安全说明
服务等级协议
苹果隐私策略:PrivacyInfo.xcprivacy
TRTC 政策
隐私协议
数据处理和安全协议
词汇表

快速接入(iOS)

PDF
聚焦模式
字号
最后更新时间: 2026-02-24 17:18:29
本文档将帮助您使用 AtomicXCore SDK 的核心组件 LiveCoreView,快速构建一个包含主播开播和观众观看功能的基础直播 App。

核心功能

LiveCoreView 是一个专为直播场景设计的轻量级 UIView 组件,是您构建直播场景的核心,它封装了所有复杂的底层直播技术(例如推拉流、连麦、音视频渲染)。您可以将 LiveCoreView 作为直播画面的“画布”,专注于上层 UI 与交互的开发。
通过下方的视图层级示意图,您可以直观了解 LiveCoreView 在直播界面中的位置和作用:


核心概念

核心概念
核心职责
关键 API / 属性
LiveCoreView
负责底层音视频流的推流、拉流与渲染,并提供代理接口用于挂载上层自定义 UI(如用户信息、PK 进度条)。
viewType
.pushView (主播推流)
.playView (观众拉流)。
setLiveID():绑定当前视图要渲染的直播间 ID。
videoViewDelegate:视频画面上的 UI 插槽代理。
LiveListStore
管理直播间的全生命周期(创建、进入、离开),并负责状态同步与被动事件(如直播结束、被踢出)的监听。
createLive():主播发起直播。
endLive(): 主播结束直播。
joinLive():观众进入直播间。
leaveLive():观众退出直播。
LiveInfo
用于在开播前定义房间的各项参数,如房间号、麦位布局模式、最大连麦人数等。
liveID:房间唯一标识符。
seatLayoutTemplateID:布局模板 ID(如 600 为动态宫格)。

准备工作

步骤1:开通服务

请参见 开通服务,获取体验版或付费版 SDK。

步骤2:在当前项目中导入 AtomicXCore

1. 安装组件:请在您的 Podfile 文件中添加 pod 'AtomicXCore' 依赖,然后执行pod install
target 'xxxx' do
pod 'AtomicXCore', '~> 4.0'
end
2. 配置工程权限: 请在应用的 Info.plist 文件中添加相机和麦克风的使用权限说明。
<key>NSCameraUsageDescription</key>
<string>TUILiveKit需要访问你的相机权限,开启后录制的视频才会有画面</string>
<key>NSMicrophoneUsageDescription</key>
<string>TUILiveKit需要访问您的麦克风权限,开启后录制的视频才会有声音</string>


步骤3:实现登录逻辑

在您的项目中调用 LoginStore.shared.login 完成登录,这是使用 AtomicXCore 所有功能的关键前提
重要:
推荐在您 App 自身的用户账户登录成功后,再调用 LoginStore.shared.login,以确保登录业务逻辑的清晰和一致。
import AtomicXCore

// AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
LoginStore.shared.login(sdkAppID: 1400000001, // 替换为您的 SDKAppID
userID: "test_001", // 替换为您的 UserID
userSig: "xxxxxxxxxxx") { result in // 替换为您的 UserSig
switch result {
case .success(let info):
debugPrint("login success")
case .failure(let error):
debugPrint("login failed code:\\(error.code), message:\\(error.message)")
}
}
return true
}
登录接口参数说明:
参数
类型
说明
SDKAppID
Int
UserID
String
当前用户的唯一 ID,仅包含英文字母、数字、连字符和下划线。
userSig
String
用于腾讯云鉴权的票据。请注意:
开发环境:您可以采用本地 GenerateTestUserSig.genTestSig 函数生成 UserSig 或者通过 UserSig 辅助工具 生成临时的 UserSig。
生产环境:为了防止密钥泄露,请务必采用服务端生成 UserSig 的方式。详细信息请参见 服务端生成 UserSig
更多信息请参见 如何计算及使用 UserSig

搭建基础直播间

步骤1:实现主播视频开播

主播开播流程如下,您只需执行以下几步操作,即可快速搭建主播视频直播。

提示:
主播开播推流的业务代码,您也可以参考 TUILiveKit 开源项目中的 TUILiveRoomAnchorViewController.swift 文件来了解完整的实现逻辑。
1. 初始化主播推流的视图
在您的主播视图控制器中,创建一个 LiveCoreView 实例,并将 viewType 指定为 .pushView(推流视图)。
import AtomicXCore

// YourAnchorViewController 代表您的主播开播视图控制器
class YourAnchorViewController: UIViewController {

private let liveId: String
// 1. 将 LiveCoreView 作为您视图控制器的一个属性
private let coreView = LiveCoreView(viewType:.pushView, frame: UIScreen.main.bounds)
// 2. 新增便利构造函数完成实例初始化
// - liveId: 您需要开播的直播房间 id
public init(liveId: String) {
self.liveId = liveId
super.init(nibName: nil, bundle: nil)
self.coreView.setLiveID(liveId)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public override func viewDidLoad() {
super.viewDidLoad()
// 3. 将主播推流页面加载到您的视图上
view.addSubview(coreView)
}
}
2. 打开摄像头和麦克风
通过调用 DeviceStoreopenLocalCamera、openLocalMicrophone 接口打开摄像头和麦克风,您无需做额外操作,LiveCoreView 会自动预览当前摄像头的视频流,示例代码如下:
import AtomicXCore

// YourAnchorViewController 代表您的主播开播视图控制器
class YourAnchorViewController: UIViewController {
// ... 其他代码 ...
public override func viewDidLoad() {
super.viewDidLoad()
// 打开设备
openDevices()
}
private func openDevices() {
// 1. 打开前置摄像头
DeviceStore.shared.openLocalCamera(isFront: true, completion: nil)
// 2. 打开麦克风
DeviceStore.shared.openLocalMicrophone(completion: nil)
}
}
3. 开始直播
通过调用 LiveListStorecreateLive 接口开始视频直播,完整示例代码如下:
import AtomicXCore

// YourAnchorViewController 代表您的主播开播视图控制器
class YourAnchorViewController: UIViewController {

// ... 其他代码 ...

// 调用开播接口开始直播
private func startLive() {
var liveInfo = LiveInfo()
// 1. 设置直播的房间 id
liveInfo.liveID = self.liveId
// 2. 设置直播的房间名称
liveInfo.liveName = "test 直播"
// 3. 配置布局模板,videoDynamicGrid9Seats 为竖屏动态九宫格
liveInfo.seatTemplate = .videoDynamicGrid9Seats
// 4. 调用 LiveListStore.shared.createLive 开始直播
LiveListStore.shared.createLive(liveInfo) { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let info):
debugPrint("startLive success")
case .failure(let error):
debugPrint("startLive error:\\(error.message)")
}
}
}
}
LiveInfo参数说明:
参数名
类型
属性
描述
liveID
String
必填
直播间的唯一标识符。
liveName
String
选填
直播间的标题。
notice
String
选填
直播间的公告信息。
isMessageDisable
Bool
选填
是否禁言(true:是,false:否)。
isPublicVisible
Bool
选填
是否公开可见(true:是,false:否)。
seatMode
TakeSeatMode
选填
上麦模式(.free:自由上麦,.apply:申请上麦)。
seatTemplate
必填
麦位布局模板。
coverURL
String
选填
直播间的封面图片地址。
backgroundURL
String
选填
直播间的背景图片地址。
categoryList
[NSNumber]
选填
直播间的分类标签列表。
activityStatus
Int
选填
直播活动状态。
isGiftEnabled
Bool
选填
是否启用礼物功能(true:是,false:否)。
4. 结束直播
直播结束后,主播可以调用 LiveListStoreendLive 接口结束直播。SDK 会处理停止推流和销毁房间的逻辑。
import AtomicXCore

// YourAnchorViewController 代表您的主播开播视图控制器
class YourAnchorViewController: UIViewController {

// ... 其他代码 ...

// 结束直播
private func stopLive() {
LiveListStore.shared.endLive { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let data):
debugPrint("endLive success")
case .failure(let error):
debugPrint("endLive error: \\(error.message)")
}
}
}
}

步骤2:实现观众进房观看

观众观看流程如下,通过简单几步操作,即可实现观众观看直播。

提示:
观众进房拉流的业务代码,您也可以参考 TUILiveKit 开源项目中的 TUILiveRoomAudienceViewController.swift 文件来了解完整的实现逻辑。
1. 实现观众拉流页面
在您的观众视图控制器中,创建 LiveCoreView 实例,并将 viewType 指定为 .playView(拉流视图)。
import AtomicXCore

// YourAudienceViewController 代表您的观众观看视图控制器
class YourAudienceViewController: UIViewController {
// 1. 初始化观众拉流页面
private let coreView = LiveCoreView(viewType:.playView, frame: UIScreen.main.bounds)
private let liveId: String
public init(liveId: String) {
self.liveId = liveId
super.init(nibName: nil, bundle: nil)
// 2. 绑定直播 id
self.coreView.setLiveID(liveId)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public override func viewDidLoad() {
super.viewDidLoad()
// 3. 将主播推流页面加载到您的视图上
view.addSubview(coreView)
}
}
2. 进入直播间观看
通过调用 LiveListStorejoinLive 接口加入直播,您无需做额外操作,LiveCoreView 会自动播放当前房间的视频流,完整示例代码如下:
import AtomicXCore

// YourAudienceViewController 代表您的观众观看视图控制器
class YourAudienceViewController: UIViewController {
// ... 其他代码 ...

public override func viewDidLoad() {
super.viewDidLoad()
// 3. 将主播推流页面加载到您的视图上
view.addSubview(coreView)

// 4. 进入直播间
joinLive()
}

private func joinLive() {
// 调用 LiveListStore.shared.joinLive 进入直播间
// - liveId: 与主播开播同样的 liveId
LiveListStore.shared.joinLive(liveID: liveId) { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let info):
debugPrint("joinLive success")
case .failure(let error):
debugPrint("joinLive error \\(error.message)")
// 进房失败,也需要退出页面
// self.dismiss(animated: true)
}
}
}
}
3. 退出直播
观众退出直播间时,需要调用 LiveListStoreleaveLive 接口退出直播。SDK 会自动停止拉流并退出房间。
import AtomicXCore

// YourAudienceViewController 代表您的观众观看视图控制器
class YourAudienceViewController: UIViewController {

// ... 其他代码 ...

// 退出直播
private func leaveLive() {
LiveListStore.shared.leaveLive { [weak self] result in
guard let self = self else { return }
switch result {
case .success:
debugPrint("leaveLive success")
case .failure(let error):
debugPrint("leaveLive error \\(error.message)")
}
}
}
}

步骤3:监听直播事件

在观众加入直播间后,您还需要处理一些房间内的“被动”事件。例如,主播主动结束了直播,或者观众因为违规等原因被踢出房间。如果不监听这些事件,观众端 UI 可能会停留在黑屏页面,影响用户体验。
您可以通过订阅 LiveListStore 提供的 liveListEventPublisher 来实现事件监听。
import AtomicXCore
import Combine // 1. 导入 Combine 框架

// YourAudienceViewController 代表您的观众观看视图控制器
class YourAudienceViewController: UIViewController {
// ... 其他代码 (coreView, liveId, init, deinit, joinLive, leaveLive等) ...

// 2. 定义 cancellableSet 来管理订阅生命周期
private var cancellableSet: Set<AnyCancellable> = []
public override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(coreView)
// 3. 监听直播事件
setupLiveEventListener()
// 4. 进入直播间
joinLive()
}

// 5. 新增一个方法来设置事件监听
private func setupLiveEventListener() {
LiveListStore.shared.liveListEventPublisher
.receive(on: RunLoop.main) // 确保在主线程处理 UI 更新
.sink { [weak self] event in
guard let self = self else { return }
switch event {
case .onLiveEnded(let liveID, let reason, let message):
// 监听到直播结束
debugPrint("Live ended. liveID: \\(liveID), reason: \\(reason.rawValue), message: \\(message)")
// 在此处处理退出直播间的逻辑,例如关闭当前页面
// self.dismiss(animated: true)
case .onKickedOutOfLive(let liveID, let reason, let message):
// 监听到被踢出直播
debugPrint("Kicked out of live. liveID: \\(liveID), reason: \\(reason.rawValue), message: \\(message)")
// 在此处处理退出直播间的逻辑
// self.dismiss(animated: true)
}
}
.store(in: &cancellableSet) // 管理订阅
}
// ... joinLive() 和 leaveLive() 方法 ...
}

运行效果

集成 LiveCoreView 后,您将得到一个纯净的视频渲染视图,它已具备完整的直播业务能力,但没有任何交互 UI。您可以参考下一章节 丰富直播场景 来完善直播场景。

动态宫格布局
浮动小窗布局
固定宫格布局
固定小窗布局

模板取值

.videoDynamicGrid9Seats
.videoDynamicFloat7Seats
.videoFixedGrid9Seats
.videoFixedFloat7Seats
描述
默认布局,可根据连麦人数动态调整宫格大小。
连麦嘉宾以浮动小窗形式显示。
连麦人数固定,每个嘉宾占据一个固定宫格。
连麦人数固定,嘉宾以固定小窗形式显示。
运行效果













功能进阶

实现房间内的自定义状态同步

在直播中,主播可能需要向所有观众同步一些自定义信息,例如“当前房间话题”、“背景音乐信息”等。LiveListStoreMetaData 功能可以实现这一点。

实现方式:

1. 主播端将自定义信息(建议使用 JSON 格式)通过 updateLiveMetaData 接口设置到一个或多个 key 中。AtomicXCore 会将这个变更实时同步给所有观众。
2. 观众端只需订阅 LiveListState.currentLive,监听 metaData 的变化,一旦发现关心的 key 更新,就解析其 value 并刷新业务状态。

示例代码:

import AtomicXCore
import Combine

// 1. 定义一个背景音乐模型 (可选,建议使用 Codable)
struct MusicModel: Codable {
let musicId: String
let musicName: String
}

// 2. 主播端:在您的主播业务逻辑中,添加推送背景音乐的方法
func updateBackgroundMusic(music: MusicModel) {
guard let jsonData = try? JSONEncoder().encode(music),
let jsonString = String(data: jsonData, encoding: .utf8) else { return }

// 将要更新的元数据
let metaData = ["music_info": jsonString]

// 使用全局单例的 liveListStore 来更新 metaData
LiveListStore.shared.updateLiveMetaData(metaData) { result in
if case .success = result {
print("背景音乐 \\(music.musicName) 推送成功")
} else if case .failure(let error) = result {
print("背景音乐推送失败: \\(error.message)")
}
}
}

// 3. 观众端:在您的观众业务逻辑中,订阅并响应
private func subscribeToDataUpdates() {
LiveListStore.shared.state
// 监听当前房间的 metaData
.subscribe(StatePublisherSelector(keyPath: \\LiveListState.currentLive))
.map { $0.metaData["music_info"]}
.removeDuplicates()
.receive(on: DispatchQueue.main)
.sink { jsonString in
guard let jsonString = jsonString,
let data = jsonString.data(using: .utf8),
let music = try? JSONDecoder().decode(MusicModel.self, from: data) else {
return
}
// 刷新业务状态,播放新的音乐
// ... (例如: playMusic(music))
}
.store(in: &cancellables)
}


丰富直播场景

当您完成了基础的直播功能后,您可以参考以下功能指南来为直播添加丰富的互动玩法。
直播功能
功能介绍
功能 Stores
实现指南
实现观众音视频连线
观众申请上麦,与主播进行实时视频互动。
实现主播跨房连线 PK
两个不同房间的主播进行连线,实现互动或 PK。
添加弹幕聊天功能
观众可以在直播间发送和接收实时文字消息。
构建礼物赠送系统
观众可以向主播赠送虚拟礼物,增加互动和趣味性。
GiftStore

API 文档

Store/Component
功能描述
API 文档
LiveCoreView
直播视频流展示与交互的核心视图组件:负责视频流渲染和视图挂件处理,支持主播直播、观众连麦、主播连线等场景。
LiveListStore
直播间全生命周期管理:创建 / 加入 / 离开 / 销毁房间,查询房间列表,修改直播信息(名称、公告等),监听直播状态(如被踢出、结束)。
DeviceStore
音视频设备控制:麦克风(开关 / 音量)、摄像头(开关 / 切换 / 画质)、屏幕共享,设备状态实时监听。
CoGuestStore
观众连麦管理:连麦申请 / 邀请 / 同意 / 拒绝,连麦成员权限控制(麦克风 / 摄像头),状态同步。
CoHostStore
主播跨房连线:支持多布局模板(动态网格等),发起 / 接受 / 拒绝连线,连麦主播互动管理。
BattleStore
主播 PK 对战:发起 PK(配置时长 / 对手),管理 PK 状态(开始 / 结束),同步分数,监听对战结果。
GiftStore
礼物互动:获取礼物列表,发送 / 接收礼物,监听礼物事件(含发送者、礼物详情)。
BarrageStore
弹幕功能:发送文本 / 自定义弹幕,维护弹幕列表,实时监听弹幕状态。
LikeStore
点赞互动:发送点赞,监听点赞事件,同步总点赞数。
LiveAudienceStore
观众管理:获取实时观众列表(ID / 名称 / 头像),统计观众数量,监听观众进出事件。
AudioEffectStore
音频特效:变声(童声 / 男声)、混响(KTV 等)、耳返调节,实时切换特效。
BaseBeautyStore
基础美颜:调节磨皮 / 美白 / 红润(0-9级),重置美颜状态,同步效果参数。

常见问题

主播调用 createLive 或 观众调用 joinLive 后为什么画面是黑的,没有视频画面?

检查 setLiveID:请确保在调用开播或观看接口前,已经为 LiveCoreView 实例设置了正确的 liveID。
检查设备权限:请确保 App 已获得摄像头和麦克风的系统使用权限。
检查主播端:主播端是否正常调用 DeviceStore.shared.openLocalCamera(isFront: true) 打开了摄像头。
检查网络:请检查设备网络连接是否正常。

主播端打开摄像头后,开播后可以看到本地视频预览画面,开播前视频预览是黑屏?

检查主播端:请检查主播推流视图LiveCoreViewviewType是否配置为.pushView
检查观众端:请检查观众拉流视图LiveCoreViewviewType是否配置为 .playView

使用 updateLiveMetaData 时有哪些需要注意的限制和规则?

为了保证系统的稳定和高效,metaData 的使用遵循以下规则:
权限: 只有房主和管理员可以调用 updateLiveMetaData。普通观众没有权限。
数量与大小限制
单个房间最多支持 10 个 key。
每个 key 的长度不超过 50 字节,每个 value 的长度不超过 2KB
单个房间所有 value 的总大小不超过 16KB
冲突解决metaData 的更新机制是"后来者覆盖"。如果多个管理员在短时间内修改同一个 key,最后一次的修改会生效。建议在业务设计上避免多人同时修改同一个关键信息。

rsync 因权限不足导致依赖三方库资源拷贝失败

例如在使用 Xcode 集成 SnapKit 框架进行开发时,可能会遇到如下编译报错:
rsync(xxxx):1:1: SnapKit.framework/SnapKit_Privacy.bundle/: mkpathat: Operation not permitted

问题原因

Xcode 的用户脚本沙盒机制限制了构建过程中 rsync 脚本对 SnapKit.framework 资源文件的写入权限,导致框架内的 SnapKit_Privacy.bundle 无法正常拷贝。

解决步骤

1. 关闭用户脚本沙盒:打开 Xcode 项目,进入项目的 Build Settings,搜索 User Script Sandboxing(或标识 ENABLE_USER_SCRIPT_SANDBOXING),将其值从 YES 修改为 NO
2. 清理并重新构建项目执行 Product → Clean Build Folder 清理项目缓存,然后重新编译运行即可。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈