@tencentcloud/sdk-mcp 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,227 @@
1
+ ## 概述
2
+
3
+ 本文对 TUILiveKit Demo 中的**直播列表页面**进行了详细的介绍,您可以在已有项目中直接参考本文档集成我们开发好的直播列表页面,也可以根据您的需求按照文档中的内容对页面的样式,布局以及功能项进行深度的定制。
4
+
5
+ ![](https://write-document-release-1258344699.cos.ap-guangzhou.tencentcos.cn/100027862798/f73d96db8c8611f0ae9d5254001c06ec.png)
6
+
7
+
8
+ ## 快速接入
9
+
10
+ ### 步骤1:环境配置及开通服务
11
+
12
+ 在进行快速接入之前,您需要参见 [准备工作](https://write.woa.com/document/188228825253294080),满足相关环境配置及开通对应服务。
13
+
14
+ ### 步骤2: 安装依赖
15
+
16
+ 您可以选择以下任一方式安装依赖:
17
+
18
+
19
+
20
+
21
+ 【npm】
22
+ ``` bash
23
+ npm install tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3 --save
24
+ ```
25
+
26
+
27
+ 【pnpm】
28
+ ``` bash
29
+ pnpm add tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3
30
+ ```
31
+
32
+
33
+ 【yarn】
34
+ ``` bash
35
+ yarn add tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3
36
+ ```
37
+
38
+ ### 步骤3: 直播列表页面接入
39
+
40
+ 在您的项目下创建 **live-list.vue **文件,可直接复制如下代码至您的项目中集成**直播列表页面**。
41
+ ``` javascript
42
+ <template>
43
+ <UIKitProvider language="zh-CN">
44
+ <div class="container">
45
+ <header class="header">
46
+ <h1 class="title">在线直播</h1>
47
+ </header>
48
+ <main class="main">
49
+ <LiveList />
50
+ </main>
51
+ </div>
52
+ </UIKitProvider>
53
+ </template>
54
+
55
+ <script setup lang="ts">
56
+ import { onMounted } from 'vue';
57
+ import { LiveList, type LiveInfo, useLoginState } from 'tuikit-atomicx-vue3';
58
+ import { UIKitProvider } from '@tencentcloud/uikit-base-component-vue3';
59
+
60
+ const { login } = useLoginState();
61
+
62
+ async function initLogin() {
63
+ try {
64
+ await login({
65
+ sdkAppId: 0, // SDKAppID, 可以参考步骤 1 获取
66
+ userId: '', // UserID, 可以参考步骤 1 获取
67
+ userSig: '', // userSig, 可以参考步骤 1 获取
68
+ });
69
+ } catch (error) {
70
+ console.error('登录失败:', error);
71
+ }
72
+ }
73
+
74
+ onMounted(async () => {
75
+ await initLogin();
76
+ });
77
+ </script>
78
+
79
+ <style scoped>:global(*),:global(::after),:global(::before){box-sizing:border-box;margin:0}.container{display:flex;flex-direction:column;height:100vh;width:100vw;background:var(--bg-color-default)}.header{display:flex;align-items:center;flex-shrink:0}.title{margin:0;font-size:24px;font-weight:600;color:var(--text-color-primary);letter-spacing:-.5px}.main{flex:1;padding:24px;overflow-y:auto;min-height:0}</style>
80
+ ```
81
+
82
+ > **注意:**
83
+ >
84
+
85
+ > 若您需要实现直播列表到进入直播间的跳转逻辑,可参考本文中[指定直播间](https://write.woa.com/#61f1bbc9-1f23-4b69-aceb-7ab3f35a0ec2)部分内容。
86
+ >
87
+
88
+
89
+ ### 步骤4: 启动项目
90
+
91
+ 运行下面的命令后可生成直播列表页面,您可选择对应的直播间进入观看。
92
+ ``` bash
93
+ npm run dev
94
+ ```
95
+
96
+ ## 自由定制
97
+
98
+ 根据上述功能展示图,我们也支持您根据项目需求对直播列表页面进行 UI 定制能力。主要可供定制的能力如下表所示。
99
+ <table>
100
+ <tr>
101
+ <td rowspan="1" colSpan="1" >**类别**</td>
102
+
103
+ <td rowspan="1" colSpan="1" >**功能**</td>
104
+
105
+ <td rowspan="1" colSpan="1" >**描述**</td>
106
+ </tr>
107
+
108
+ <tr>
109
+ <td rowspan="1" colSpan="1" >**直播间列表**</td>
110
+
111
+ <td rowspan="1" colSpan="1" >自定义直播间列表区域展示</td>
112
+
113
+ <td rowspan="1" colSpan="1" >**支持:**<br>- **直播间信息文字 展示/隐藏、UI 进行定制**<br>- **直播间一行/一列展示固定数量定制**</td>
114
+ </tr>
115
+
116
+ <tr>
117
+ <td rowspan="1" colSpan="1" >**个人信息**</td>
118
+
119
+ <td rowspan="1" colSpan="1" >自定义个人信息展示</td>
120
+
121
+ <td rowspan="1" colSpan="1" >**支持:**<br>- **展示/隐藏个人信息**<br>- **个人信息字体、颜色 UI 自定义设置**</td>
122
+ </tr>
123
+ </table>
124
+
125
+
126
+ ## 指定直播间
127
+
128
+ 由于涉及到直播列表(或首页)到直播间的跳转逻辑,您需要配置 Vue Router。在项目 `src` 目录下新建 `router` 文件夹,并创建 `index.ts` 文件。然后,在您的主文件(例如 **main.ts **或 **index.ts**)中引入并使用路由。可参见 [GitHub 代码示例](https://github.com/Tencent-RTC/TUILiveKit/blob/main/Web/web-vite-vue3/src/main.ts),如果需要直播列表,可参见文档 [观众观看页面](https://write.woa.com/document/185968222948704256)。
129
+ ``` typescript
130
+ // live-list.vue 可增量添加至您的代码中
131
+ <template>
132
+ <UIKitProvider>
133
+ // .....省略部分参考快速接入步骤 3 部分
134
+ <LiveList @live-room-click="handleLiveRoomClick" />
135
+ </UIKitProvider>
136
+ </template>
137
+
138
+ <script setup lang="ts">
139
+ import { useRouter, useRoute } from 'vue-router';
140
+
141
+ const router = useRouter();
142
+ const route = useRoute();
143
+
144
+ function handleLiveRoomClick(liveInfo: LiveInfo) {
145
+ if (liveInfo?.liveId) {
146
+ router.push({ path: '/live-player', query: { ...route.query, liveId: liveInfo.liveId } });
147
+ }
148
+ }
149
+
150
+ <script>
151
+
152
+ // src/router/index.ts
153
+ import { createRouter, createWebHistory } from 'vue-router';
154
+
155
+ const routes = [
156
+ {
157
+ // 路由跳转至观看页面
158
+ path: '/live-player',
159
+ component: () => import('../views/live-player.vue'),
160
+ },
161
+ ];
162
+
163
+ const router = createRouter({
164
+ history: createWebHistory(),
165
+ routes,
166
+ });
167
+ export default router;
168
+
169
+ // src/main.ts
170
+ import { createApp } from 'vue';
171
+ import App from './App.vue';
172
+ import router from './router';
173
+
174
+ const app = createApp(App);
175
+ app.use(router);
176
+ app.mount('#app');
177
+ ```
178
+
179
+ ## 资源参考
180
+
181
+ ### 其他参考文档
182
+ - [TUILiveKit Web 观看页](https://write.woa.com/document/185968222948704256)
183
+
184
+ - [TUILiveKit Web 推流助手页](https://write.woa.com/document/185222135291670528)
185
+
186
+ - [TUILiveKit Web 监播页](https://write.woa.com/document/185222048061181952)
187
+
188
+
189
+ ### 更多资源
190
+
191
+ [腾讯云实时音视频控制台](https://console.cloud.tencent.com/trtc)
192
+
193
+
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+
206
+
207
+
208
+
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+ ####
220
+
221
+ ####
222
+
223
+ ####
224
+
225
+ ####
226
+
227
+ ####
@@ -0,0 +1,374 @@
1
+ ## 概述
2
+
3
+ 本文对 TUILiveKit Demo 中的**观看页面**进行了详细的介绍,您可以在已有项目中直接参考本文档集成我们开发好的观看页面,也可以根据您的需求按照文档中的内容对页面的样式,布局以及功能项进行深度的定制。这边文档用于直播观看场景,如果需要直播连麦场景,请使用 LiveView 组件。
4
+
5
+ ## 功能概览
6
+ <table>
7
+ <tr>
8
+ <td rowspan="1" colSpan="1" >**功能分类**</td>
9
+
10
+ <td rowspan="1" colSpan="1" >**具体能力**</td>
11
+ </tr>
12
+
13
+ <tr>
14
+ <td rowspan="1" colSpan="1" >**直播视频播放**</td>
15
+
16
+ <td rowspan="1" colSpan="1" >高清流畅的直播体验</td>
17
+ </tr>
18
+
19
+ <tr>
20
+ <td rowspan="1" colSpan="1" >**弹幕互动**</td>
21
+
22
+ <td rowspan="1" colSpan="1" >实时弹幕交流</td>
23
+ </tr>
24
+
25
+ <tr>
26
+ <td rowspan="1" colSpan="1" >**观众列表**</td>
27
+
28
+ <td rowspan="1" colSpan="1" >查看在线观众信息</td>
29
+ </tr>
30
+
31
+ <tr>
32
+ <td rowspan="1" colSpan="1" >**关注主播**</td>
33
+
34
+ <td rowspan="1" colSpan="1" >一键关注喜欢的主播</td>
35
+ </tr>
36
+
37
+ <tr>
38
+ <td rowspan="1" colSpan="1" >**全屏播放**</td>
39
+
40
+ <td rowspan="1" colSpan="1" >沉浸式观看体验</td>
41
+ </tr>
42
+
43
+ <tr>
44
+ <td rowspan="1" colSpan="1" >**Web 桌面浏览器支持**</td>
45
+
46
+ <td rowspan="1" colSpan="1" > 跨平台兼容</td>
47
+ </tr>
48
+ </table>
49
+
50
+
51
+ ## 功能展示
52
+
53
+ 观看页面提供默认行为和风格,但如果默认行为和样式不能完全满足您的需求,您也可以对 UI 进行自定义。图中显示的数字与特定功能列表中的类别相对应。其中主要包含直播**信息展示、视频直播区域、在线观众、音视频操作、直播时长、画面分辨率切换、全屏功能、聊天互动、消息列表等。**
54
+
55
+ ![](https://write-document-release-1258344699.cos.ap-guangzhou.tencentcos.cn/100027862798/de40dc288ebd11f0814e525400bf7822.png)
56
+
57
+
58
+ ## 快速接入
59
+
60
+ ### 步骤1:环境配置及开通服务
61
+
62
+ 在进行快速接入之前,您需要参见 [准备工作](https://write.woa.com/document/185222107981008896),满足相关环境配置及开通对应服务。
63
+
64
+ ### 步骤2: 安装依赖
65
+
66
+
67
+
68
+
69
+ 【npm】
70
+ ``` bash
71
+ npm install tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3 --save
72
+ ```
73
+
74
+
75
+ 【pnpm】
76
+ ``` bash
77
+ pnpm add tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3
78
+ ```
79
+
80
+
81
+ 【yarn】
82
+ ``` bash
83
+ yarn add tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3
84
+ ```
85
+
86
+ ### 步骤3: 观看页面接入
87
+
88
+ 在您的项目下创建 `live-player.vue` 文件,可直接复制如下代码至您的项目中集成**观看页面**。
89
+ ``` typescript
90
+
91
+ <template>
92
+ <UIKitProvider language="zh-CN" theme="dark">
93
+ <div class="live-container">
94
+ <!-- 直播核心区域 -->
95
+ <section class="live-main">
96
+ <!-- 顶部信息栏 -->
97
+ <div class="top-bar">
98
+ <div class="top-left">
99
+ <Avatar
100
+ :src="currentLive?.liveOwner.avatarUrl"
101
+ :size="24"
102
+ class="avatar"
103
+ />
104
+ <span class="user-name">
105
+ {{ currentLive?.liveOwner.userName || currentLive?.liveOwner.userId }}
106
+ </span>
107
+ <div class="follow-btn" @click="handleFollow">
108
+ <span>关注</span>
109
+ </div>
110
+ </div>
111
+ <div class="top-right">
112
+ <div class="audience-preview" @click="showAudienceDrawer">
113
+ <Avatar
114
+ v-for="(user, index) in audienceList.slice(0, 3)"
115
+ :key="user.userId || index"
116
+ :src="user.avatarUrl"
117
+ :size="24"
118
+ class="audience-avatar"
119
+ />
120
+ <div class="audience-count">
121
+ <span>{{ audienceList.length }}</span>
122
+ </div>
123
+ </div>
124
+ <IconClose class="back-btn" size="20" @click="handleBack" />
125
+ </div>
126
+ </div>
127
+
128
+ <!-- 直播播放器 -->
129
+ <div class="stream-container">
130
+ <LiveCoreView class="player" />
131
+ </div>
132
+
133
+ <!-- 悬浮消息列表 -->
134
+ <div class="floating-message-list">
135
+ <BarrageList class="message-list" />
136
+ </div>
137
+
138
+ <!-- 底部消息输入 -->
139
+ <div class="bottom-input">
140
+ <div class="message-input-wrapper">
141
+ <BarrageInput
142
+ :width="inputWidth"
143
+ height="44px"
144
+ :placeholder="'说点什么...'"
145
+ :autoFocus="false"
146
+ :disabled="!isLiveActive"
147
+ />
148
+ </div>
149
+ </div>
150
+ </section>
151
+
152
+ <!-- 观众列表抽屉 -->
153
+ <div v-if="audienceDrawerVisible" class="audience-drawer-overlay" @click="closeAudienceDrawer">
154
+ <div class="audience-drawer" @click.stop>
155
+ <div class="drawer-header">
156
+ <h3>在线观众 ({{ audienceList.length }})</h3>
157
+ </div>
158
+ <div class="drawer-content">
159
+ <LiveAudienceList class="audience-list" />
160
+ <div v-if="audienceList.length === 0" class="empty-audience">
161
+ <p>暂无观众在线</p>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </div>
166
+
167
+ <!-- 直播结束遮罩 -->
168
+ <div v-if="liveEndVisible" class="live-end-overlay">
169
+ <div class="live-end-content">
170
+ <div class="end-title">
171
+ <span>直播已结束</span>
172
+ </div>
173
+ <Avatar
174
+ :src="currentLive?.liveOwner.avatarUrl"
175
+ :size="85"
176
+ class="end-avatar"
177
+ />
178
+ <span class="end-name">{{ currentLive?.liveOwner.userName || currentLive?.liveOwner.userId }}</span>
179
+ </div>
180
+ </div>
181
+ </div>
182
+ </UIKitProvider>
183
+ </template>
184
+
185
+ <script setup lang="ts">
186
+ import { onMounted, ref, computed } from 'vue';
187
+ import {
188
+ LiveAudienceList,
189
+ BarrageList,
190
+ BarrageInput,
191
+ useLiveAudienceState,
192
+ LiveCoreView,
193
+ useLiveState,
194
+ Avatar,
195
+ useLoginState
196
+ } from 'tuikit-atomicx-vue3';
197
+ import { UIKitProvider, IconClose } from '@tencentcloud/uikit-base-component-vue3';
198
+
199
+ const { audienceList, fetchAudienceList } = useLiveAudienceState();
200
+ const { currentLive } = useLiveState();
201
+ const { login } = useLoginState();
202
+
203
+ const audienceDrawerVisible = ref(false);
204
+ const liveEndVisible = ref(false);
205
+ const isLiveActive = ref(true);
206
+
207
+ const inputWidth = computed(() => {
208
+ return window.innerWidth > 768 ? '200px' : '158px';
209
+ });
210
+
211
+ async function initLogin() {
212
+ try {
213
+ await login({
214
+ sdkAppId: 0, // SDKAppID, 可以参考步骤 1 获取
215
+ userId: '', // UserID, 可以参考步骤 1 获取
216
+ userSig: '', // userSig, 可以参考步骤 1 获取
217
+ });
218
+ } catch (error) {
219
+ console.error('登录失败:', error);
220
+ }
221
+ }
222
+
223
+ function handleBack() {
224
+ console.log('返回上一页');
225
+ }
226
+
227
+ function handleFollow() {
228
+ console.log('关注主播');
229
+ }
230
+
231
+ async function showAudienceDrawer() {
232
+ await fetchAudienceList();
233
+ audienceDrawerVisible.value = true;
234
+ }
235
+
236
+ function closeAudienceDrawer() {
237
+ audienceDrawerVisible.value = false;
238
+ }
239
+
240
+ onMounted(async () => {
241
+ await initLogin();
242
+ });
243
+ </script>
244
+
245
+ <style scoped>
246
+ :global(body){height:100vh;width:100vw;margin:0;padding:0;overflow:hidden;font-size:14px;line-height:1.6;text-rendering:optimizeLegibility;}:global(*),:global(*::before),:global(*::after){box-sizing:border-box;margin:0;}.live-container{position:fixed;display:flex;justify-content:center;align-items:center;width:100%;height:100%;background-color:black;color:var(--text-color1,#fff);}.live-main{width:100%;height:100%;position:relative;background-color:var(--uikit-color-bg-color-dialog);}.top-bar{position:absolute;top:10px;left:0;right:0;display:flex;justify-content:space-between;align-items:center;z-index:100;height:50px;padding:0 10px;}.top-left{display:flex;align-items:center;gap:5px;max-width:55%;padding:5px;background-color:var(--uikit-color-black-6);border-radius:25px;backdrop-filter:blur(10px);overflow:hidden;}.back-btn{cursor:pointer;color:var(--text-color1,#fff);transition:color 0.2s;flex-shrink:0;}.back-btn:hover{color:#4086FF;}.avatar{border:1px solid var(--uikit-color-white-7);flex-shrink:0;}.user-name{color:var(--text-color1,#fff);font-weight:500;font-size:14px;max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.follow-btn{display:flex;align-items:center;justify-content:center;width:50px;max-width:100px;height:24px;background-color:#4086FF;border-radius:12px;cursor:pointer;transition:background-color 0.2s;flex-shrink:0;overflow:hidden;}.follow-btn:hover{background-color:#2B6AD6;}.follow-btn span{font-size:14px;color:var(--text-color1,#fff);}.top-right{display:flex;align-items:center;gap:5px;overflow:hidden;}.audience-preview{display:flex;align-items:center;gap:1px;cursor:pointer;}.audience-avatar{border:1px solid var(--uikit-color-white-7);}.audience-count{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background-color:var(--uikit-color-black-6);border-radius:50%;text-align:center;color:var(--text-color1,#fff);overflow:hidden;}.audience-count span{flex:1;font-size:12px;}.close-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background-color:var(--uikit-color-black-6);border-radius:50%;cursor:pointer;color:var(--text-color1,#fff);transition:background-color 0.2s;}.close-btn:hover{background-color:rgba(255,255,255,0.2);}.stream-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;}.player{width:100%;height:100%;background-color:black;}.floating-message-list{position:absolute;left:0;bottom:60px;z-index:99;pointer-events:none;}.message-list{width:100%;height:100%;overflow-y:auto;padding:8px;}.bottom-input{position:absolute;bottom:10px;left:0;right:0;display:flex;align-items:center;justify-content:space-between;height:48px;padding:0 10px;z-index:100;}.message-input-wrapper{display:flex;align-items:center;gap:8px;}.input-actions{display:flex;align-items:center;gap:4px;}.emoji-btn,.gift-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;background-color:var(--uikit-color-black-6);border:none;border-radius:18px;color:var(--text-color1,#fff);cursor:pointer;transition:all 0.2s;font-size:16px;backdrop-filter:blur(10px);}.emoji-btn:hover,.gift-btn:hover{background-color:#4086FF;transform:scale(1.05);}.audience-drawer-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:1000;display:flex;align-items:flex-end;justify-content:center;}.audience-drawer{width:100%;max-width:500px;height:90%;background-color:rgb(31,32,36);border-radius:20px 20px 0 0;display:flex;flex-direction:column;animation:slideUp 0.3s ease-out;}@keyframes slideUp{from{transform:translateY(100%);}to{transform:translateY(0);}}.drawer-header{display:flex;align-items:center;justify-content:space-between;padding:20px;border-bottom:1px solid #333;}.drawer-header h3{margin:0;font-size:18px;font-weight:600;color:var(--text-color1,#fff);}.close-drawer-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background-color:transparent;border:none;border-radius:50%;color:#999;cursor:pointer;transition:all 0.2s;}.close-drawer-btn:hover{background-color:#333;color:var(--text-color1,#fff);}.drawer-content{flex:1;overflow:hidden;position:relative;}.audience-list{height:100%;overflow-y:auto;padding:16px;}.empty-audience{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#666;text-align:center;padding:40px 20px;}.empty-icon{font-size:48px;margin-bottom:16px;opacity:0.5;}.empty-audience p{font-size:16px;margin:0;}.live-end-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgba(31,32,36,0.95);z-index:1000;display:flex;align-items:center;justify-content:center;}.live-end-content{display:flex;flex-direction:column;align-items:center;gap:20px;text-align:center;padding:40px;}.close-icon{position:absolute;top:20px;right:20px;display:flex;align-items:center;justify-content:center;width:40px;height:40px;background-color:rgba(255,255,255,0.1);border-radius:50%;cursor:pointer;color:#fff;transition:background-color 0.2s;}.close-icon:hover{background-color:rgba(255,255,255,0.2);}.end-title{padding-top:60px;padding-bottom:30px;}.end-title span{font-size:24px;font-weight:600;color:var(--text-color1,#fff);}.end-avatar{border:1px solid var(--uikit-color-white-7);}.end-name{font-size:16px;color:var(--text-color1,#fff);}@media screen and (orientation:landscape){.floating-message-list{width:400px;height:100px;}}@media screen and (orientation:portrait){.floating-message-list{width:260px;height:180px;}.bottom-input{padding:0 20px;}}@media (max-width:768px){.top-bar{padding:0 8px;}.top-left{max-width:70%;padding:6px 10px;}.user-name{max-width:80px;}}
247
+ </style>
248
+
249
+ ```
250
+
251
+ ### 步骤4: 启动项目
252
+ ``` bash
253
+ npm run dev
254
+ ```
255
+
256
+ ## 自由定制
257
+
258
+ 另外,我们也支持您根据项目需求对观看页面进行 UI 定制能力。主要可供定制的能力如下表所示。可供定制内容包括但不限于对源码中的**颜色主题、字体、圆角、按钮、图标、输入框、弹框等**内容,都可以进行**增加、删除、修改**等定制操作,下列分别给出颜色主题、按钮以及图标的定制示例,您可以参考实现方式通用到其他组件,满足您的 UI 定制需要。
259
+ <table>
260
+ <tr>
261
+ <td rowspan="1" colSpan="1" >**类别**</td>
262
+
263
+ <td rowspan="1" colSpan="1" >**功能**</td>
264
+
265
+ <td rowspan="1" colSpan="1" >**描述**</td>
266
+ </tr>
267
+
268
+ <tr>
269
+ <td rowspan="1" colSpan="1" >**直播信息展示**</td>
270
+
271
+ <td rowspan="1" colSpan="1" >自定义观看页面信息区域展示</td>
272
+
273
+ <td rowspan="1" colSpan="1" >**支持:**<br>- **展示/隐藏 Logo,替换为您需要的 Logo**<br>- **UI 定制、展示/隐藏关注按钮,替换为您需要的按钮风格**</td>
274
+ </tr>
275
+
276
+ <tr>
277
+ <td rowspan="1" colSpan="1" >**在线观众**</td>
278
+
279
+ <td rowspan="1" colSpan="1" >自定义观众信息展示</td>
280
+
281
+ <td rowspan="1" colSpan="1" >**支持:**<br>- **展示/隐藏观众等级**<br>- **观众信息字体、颜色 UI 自定义设置**<br>- **替换为您需要的 Icon 风格**</td>
282
+ </tr>
283
+
284
+ <tr>
285
+ <td rowspan="1" colSpan="1" >**消息列表**</td>
286
+
287
+ <td rowspan="1" colSpan="1" >自定义消息弹幕区域展示</td>
288
+
289
+ <td rowspan="1" colSpan="1" >**支持:**<br>- **展示/隐藏聊天输入区域**<br>- **支持 UI 定制聊天气泡风格、定制观众等级等内容**</td>
290
+ </tr>
291
+ </table>
292
+
293
+
294
+ ### 颜色主题
295
+
296
+ 参见**步骤3**中代码示例,您可以使用操作 theme 的值来满足您切换颜色主题。
297
+ ``` java
298
+ <UIKitProvider theme="dark"> // theme 传入 dark 时,界面整体颜色主题为黑色主题
299
+ xxx // theme 传入 light 时,界面整体颜色主题为白色主题
300
+ </UIKitProvider>
301
+ ```
302
+
303
+ ### 按钮 Button / 图标 Icon
304
+
305
+ 若您需要对按钮 Button 或者图标 Icon 进行新增或替换等 UI 定制,您可以通过如下方式进行实现,以观看页面操作的 Icon 为例。参考下图,您可以找到对应 Button / Icon 指定位置源码,对当前部分的按钮进行**增加、删除、替换**等 UI 定制操作。
306
+
307
+ ![](https://write-document-release-1258344699.cos.ap-guangzhou.tencentcos.cn/100027862798/dd256f268ebd11f088af5254005ef0f7.png)
308
+
309
+
310
+ ## 播放直播流
311
+
312
+ ### 步骤1:指定 LiveId 播放
313
+
314
+ 若您需要指定 **LiveId** 进行播放,您需要在上述**快速接入中的步骤3**代码基础上增量添加如下内容,参考方式如下:
315
+ ``` java
316
+ // live-player.vue
317
+ import { onMounted } from 'vue';
318
+ import { useLiveState } from 'tuikit-atomicx-vue3';
319
+
320
+ const { joinLive } = useLiveState();
321
+
322
+ onMounted(async () => {
323
+ await joinLive({ liveId: 'xxx' }); // 输入 liveId 加入直播间,具体参数含义可参考步骤 1 中的准备工作
324
+ });
325
+ ```
326
+
327
+ ### 步骤2:路由配置
328
+
329
+ 由于涉及到直播列表(或首页)到直播间的跳转逻辑,您需要配置 Vue Router。在项目 `src` 目录下新建 `router` 文件夹,并创建 `index.ts` 文件。然后,在您的主文件(例如 `main.ts` 或 `index.ts`)中引入并使用路由。可参考 GitHub [代码示例](https://github.com/Tencent-RTC/TUILiveKit/blob/main/Web/web-vite-vue3/src/main.ts), 如需要直播列表,可参考文档 [直播列表](https://write.woa.com/document/185968224430342144)。
330
+ ``` typescript
331
+ // src/router/index.ts
332
+ import { createRouter, createWebHistory } from 'vue-router';
333
+
334
+ const routes = [
335
+ {
336
+ path: '/live-player',
337
+ component: () => import('../views/live-player.vue'),
338
+ },
339
+ // 如果需要直播列表功能,可添加如下路由
340
+ // {
341
+ // path: '/live-list',
342
+ // component: () => import('../views/live-list.vue'),
343
+ // },
344
+ ];
345
+
346
+ const router = createRouter({
347
+ history: createWebHistory(),
348
+ routes,
349
+ });
350
+ export default router;
351
+
352
+ // src/main.ts
353
+ import { createApp } from 'vue';
354
+ import App from './App.vue';
355
+ import router from './router';
356
+
357
+ const app = createApp(App);
358
+ app.use(router);
359
+ app.mount('#app');
360
+ ```
361
+
362
+ ## 资源参考
363
+
364
+ ### 其他参考文档
365
+ - [TUILiveKit Web 直播列表页](https://write.woa.com/document/185968224430342144)
366
+
367
+ - [TUILiveKit Web 推流助手页](https://write.woa.com/document/185222135291670528)
368
+
369
+ - [TUILiveKit Web 监播页](https://write.woa.com/document/185222048061181952)
370
+
371
+
372
+ ### 更多资源
373
+
374
+ [腾讯云实时音视频控制台](https://console.cloud.tencent.com/trtc)