产品动态
产品近期公告
关于 TRTC Live 正式上线的公告
关于TRTC Conference 正式版上线的公告
Conference 商业化版本即将推出
关于多人音视频 Conference 开启内测公告
关于音视频通话 Call 正式版上线的公告
关于腾讯云音视频终端 SDK 播放升级及新增授权校验的公告
关于 TRTC 应用订阅套餐服务上线的相关说明
LiveAudienceStore 是 AtomicXCore 中专门负责管理直播间观众信息的模块。通过LiveAudienceStore,可以在直播应用快速构建一套完整的观众列表及管理系统。
核心概念 | 类型 | 核心职责与描述 |
LiveUserInfo | data class | 代表一个观众(用户)的基础信息模型。它包含了用户的唯一标识 ( userID)、昵称 (userName) 和头像地址 (avatarURL)。 |
LiveAudienceState | data class | 代表观众模块的当前状态。其核心属性 audienceList 是一个 StateFlow,存储了观众列表的实时状态;audienceCount 则代表当前观众总数的实时状态。 |
LiveAudienceListener | abstract class | 代表观众动态的实时事件。分为 onAudienceJoined (观众加入) 和 onAudienceLeft (观众离开) 两种,用于实现对观众列表的增量更新。 |
LiveAudienceStore | abstract class | 这是与观众列表功能交互的核心管理类。通过它,您可以获取观众列表快照、执行管理操作,并通过订阅其 LiveAudienceListener 来接收实时动态。 |
LiveAudienceStore 实例,并主动拉取一次当前的观众列表,用于首次展示。import kotlinx.coroutines.*import kotlinx.coroutines.flow.*import io.trtc.tuikit.atomicxcore.api.CompletionHandlerimport io.trtc.tuikit.atomicxcore.api.live.LiveAudienceStoreimport io.trtc.tuikit.atomicxcore.api.live.LiveUserInfoclass AudienceManager(private val liveId: String) {private val audienceStore: LiveAudienceStore = LiveAudienceStore.create(liveId)private val scope = CoroutineScope(Dispatchers.Main)// 对外暴露【全量】观众列表的状态流,方便UI层订阅private val _audienceList = MutableStateFlow<List<LiveUserInfo>>(emptyList())val audienceList: StateFlow<List<LiveUserInfo>> = _audienceList.asStateFlow()// 对外暴露观众总数的状态流private val _audienceCount = MutableStateFlow(0)val audienceCount: StateFlow<Int> = _audienceCount.asStateFlow()init {// 1. 订阅状态和事件,实现见下一节subscribeToAudienceState()subscribeToAudienceEvents()// 2. 主动拉取首屏数据fetchInitialAudienceList()}/// 主动获取一次观众列表快照private fun fetchInitialAudienceList() {audienceStore.fetchAudienceList(object : CompletionHandler {override fun onSuccess() {println("首次拉取观众列表成功")// 成功后,数据会通过下面的 state 订阅通道自动更新}override fun onFailure(code: Int, desc: String) {println("首次拉取观众列表失败: $desc")}})}// ... 后续代码}
audienceStore 的 liveAudienceState 和添加 LiveAudienceListener,以接收全量列表快照和实时的观众进出事件,从而驱动UI更新。class AudienceManager {/// 订阅 state,用于获取观众总数和列表快照private fun subscribeToAudienceState() {scope.launch {// audienceList 是一个全量快照audienceStore.liveAudienceState.audienceList.collect { audienceList ->_audienceList.value = audienceList}}scope.launch {// audienceCount 是实时总数audienceStore.liveAudienceState.audienceCount.collect { count ->_audienceCount.value = count}}}private val liveAudienceListener = object : LiveAudienceListener() {override fun onAudienceJoined(audience: LiveUserInfo) {println("观众 ${newAudience.userName} 加入了直播间")// 增量更新:在当前列表末尾添加新观众val currentList = _audienceList.value.toMutableList()if (!currentList.any { it.userID == newAudience.userID }) {currentList.add(newAudience)_audienceList.value = currentList}}override fun onAudienceLeft(departedAudience: LiveUserInfo) {println("观众 ${departedAudience.userName} 离开了直播间")// 增量更新:从当前列表中移除离开的观众val currentList = _audienceList.value.toMutableList()currentList.removeAll { it.userID == departedAudience.userID }_audienceList.value = currentList}}/// 订阅 event,用于处理观众的实时进出事件private fun subscribeToAudienceEvents() {audienceStore.addLiveAudienceListener(liveAudienceListener)}}
kickUserOutOfRoom 接口可以将指定用户请出直播间。class AudienceManager {fun kick(userId: String) {audienceStore.kickUserOutOfRoom(userId, object : CompletionHandler {override fun onSuccess() {println("成功将用户 $userId 踢出房间")// 踢出成功后,您会收到 onAudienceLeft 事件}override fun onFailure(code: Int, desc: String) {println("踢出用户 $userId 失败: $desc")}})}}
setAdministrator 和 revokeAdministrator 接口可以管理用户的管理员身份。class AudienceManager {/// 将用户设为管理员fun promoteToAdmin(userId: String) {audienceStore.setAdministrator(userId, object : CompletionHandler {override fun onSuccess() {println("成功将用户 $userId 设为管理员")}override fun onFailure(code: Int, desc: String) {println("设置管理员失败: $desc")}})}/// 撤销用户的管理员身份fun revokeAdmin(userId: String) {audienceStore.revokeAdministrator(userId, object : CompletionHandler {override fun onSuccess() {println("成功撤销用户 $userId 的管理员身份")}override fun onFailure(code: Int, desc: String) {println("撤销管理员失败: $desc")}})}}
LiveAudienceStore 的观众加入事件监听器(LiveAudienceListener.onAudienceJoined)来获取新观众加入的实时通知。一旦事件触发,我们便提取出新观众的昵称信息,然后立即调用 BarrageStore 的本地插入接口 appendLocalTip。import io.trtc.tuikit.atomicxcore.api.live.LiveAudienceListenerimport io.trtc.tuikit.atomicxcore.api.live.LiveAudienceStoreimport io.trtc.tuikit.atomicxcore.api.live.LiveUserInfoimport io.trtc.tuikit.atomicxcore.api.barrage.Barrageimport io.trtc.tuikit.atomicxcore.api.barrage.BarrageStoreimport io.trtc.tuikit.atomicxcore.api.barrage.BarrageTypeclass LiveRoomManager(private val liveId: String) {init {// 初始化两个核心管理器setupWelcomeMessageFlow()}private val liveAudienceListener = object : LiveAudienceListener() {override fun onAudienceJoined(audience: LiveUserInfo) {// 3. 创建一条本地提示消息val welcomeTip = Barrage().apply {liveID = liveIdmessageType = BarrageType.TEXTtextContent = "欢迎 ${audience.userName} 进入直播间!"}// 4. 获取 BarrageStore 的实例 (得益于内部机制,这会是同一个实例)val barrageStore = BarrageStore.create(liveId)// 5. 调用 BarrageStore 的接口将其插入弹幕列表barrageStore.appendLocalTip(welcomeTip)}}private fun setupWelcomeMessageFlow() {// 1. 获取 LiveAudienceStore 的实例val audienceStore = LiveAudienceStore.create(liveId)// 2. 订阅观众事件audienceStore.addLiveAudienceListener(liveAudienceListener)}}
LiveAudienceState 中的在线人数(audienceCount)是如何更新的?时机和频率是怎样的?audienceCount 的更新并非总是实时的,其机制如下:LiveAudienceState 中观察到 audienceCount 的变化。audienceCount 是一个非常接近实时的高精度估算值,但在极端高并发场景下,它可能存在短暂的延迟或数据丢失。因此,我们建议您将其用于UI展示,而不应作为计费、统计等需要绝对精准场景的唯一依据。文档反馈