@tencentcloud/sdk-mcp 1.6.3 → 1.6.5

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.
Files changed (302) hide show
  1. package/index.js +0 -4
  2. package/knowledge/build-index.js +1 -1
  3. package/knowledge/chunker.js +81 -52
  4. package/knowledge/path-meta.js +181 -21
  5. package/knowledge/search/exact-lookup.js +166 -0
  6. package/knowledge/search/filter-pool.js +73 -19
  7. package/knowledge/search/product-scope-intent.js +2 -2
  8. package/knowledge/search/requires-framework.js +1 -1
  9. package/knowledge/search/search-knowledge.js +234 -57
  10. package/package.json +1 -1
  11. package/resource/_schema/feature-aliases.yaml +1 -0
  12. package/resource/integration/callkit/preset/android/integration.md +3 -5
  13. package/resource/integration/callkit/preset/flutter/integration.md +2 -3
  14. package/resource/integration/callkit/preset/ios/integration.md +2 -5
  15. package/resource/integration/callkit/preset/react/integration.md +12 -26
  16. package/resource/integration/callkit/preset/vue/integration.md +17 -33
  17. package/resource/integration/chat/preset/android/integration.md +44 -14
  18. package/resource/integration/chat/preset/flutter/integration.md +54 -13
  19. package/resource/integration/chat/preset/ios/integration.md +42 -6
  20. package/resource/integration/chat/preset/react/integration.md +30 -28
  21. package/resource/integration/chat/preset/uni-app/integration.md +101 -40
  22. package/resource/integration/chat/preset/vue/integration.md +62 -28
  23. package/resource/integration/livekit/preset/live/android/live-audience-integration.md +133 -0
  24. package/resource/integration/livekit/preset/live/android/live-host-integration.md +225 -0
  25. package/resource/integration/livekit/preset/live/android/live-list-integration.md +278 -0
  26. package/resource/integration/livekit/preset/live/android/prepare-integration.md +271 -0
  27. package/resource/integration/livekit/preset/live/ios/live-audience-integration.md +207 -0
  28. package/resource/integration/livekit/preset/live/ios/live-host-integration.md +358 -0
  29. package/resource/integration/livekit/preset/live/ios/live-list-integration.md +246 -0
  30. package/resource/integration/livekit/preset/live/ios/prepare-integration.md +218 -0
  31. package/resource/integration/livekit/preset/live/vue/live-list-integration.md +4 -7
  32. package/resource/integration/livekit/preset/live/vue/live-player-desk-integration.md +5 -12
  33. package/resource/integration/livekit/preset/live/vue/live-player-h5-integration.md +4 -11
  34. package/resource/integration/livekit/preset/live/vue/live-pusher-integration.md +250 -482
  35. package/resource/integration/roomkit/preset/vue/integration.md +399 -106
  36. package/resource/knowledge/callkit/best-practice/web/callengine-invitation.md +80 -0
  37. package/resource/knowledge/callkit/best-practice/web/callengine-log-control.md +20 -0
  38. package/resource/knowledge/callkit/best-practice/web/callkit-call-vs-calls.md +116 -0
  39. package/resource/knowledge/callkit/core-sdk/android/answer-call.md +11 -15
  40. package/resource/knowledge/callkit/core-sdk/android/make-call.md +10 -13
  41. package/resource/knowledge/callkit/core-sdk/android/offline-push.md +2 -4
  42. package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +10 -17
  43. package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +11 -17
  44. package/resource/knowledge/callkit/core-sdk/flutter/offline-push.md +11 -20
  45. package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +10 -15
  46. package/resource/knowledge/callkit/core-sdk/ios/make-call.md +9 -14
  47. package/resource/knowledge/callkit/core-sdk/ios/offline-push.md +12 -18
  48. package/resource/knowledge/callkit/core-sdk/miniprogram/call-engine.md +390 -0
  49. package/resource/knowledge/callkit/core-sdk/miniprogram/call-event.md +317 -0
  50. package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +16 -22
  51. package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +17 -23
  52. package/resource/knowledge/callkit/core-sdk/web/call-engine.md +39 -0
  53. package/resource/knowledge/callkit/core-sdk/web/call-event.md +341 -0
  54. package/resource/knowledge/callkit/core-sdk/web/callengine-api-overview.md +39 -0
  55. package/resource/knowledge/callkit/faq/android.md +1 -5
  56. package/resource/knowledge/callkit/faq/common.md +10 -12
  57. package/resource/knowledge/callkit/faq/ios.md +5 -7
  58. package/resource/knowledge/callkit/faq/uniapp-app.md +7 -7
  59. package/resource/knowledge/callkit/faq/uniapp-miniprogram.md +9 -12
  60. package/resource/knowledge/callkit/faq/web.md +2 -12
  61. package/resource/knowledge/callkit/preset/android/api.md +5 -8
  62. package/resource/knowledge/callkit/preset/ios/api.md +4 -6
  63. package/resource/knowledge/callkit/preset/miniprogram/api.md +295 -0
  64. package/resource/knowledge/callkit/preset/react/api.md +622 -0
  65. package/resource/knowledge/callkit/preset/react/uikit-api-reference.md +475 -0
  66. package/resource/knowledge/callkit/preset/vue/api.md +622 -0
  67. package/resource/knowledge/callkit/preset/vue/uikit-api-reference.md +587 -0
  68. package/resource/knowledge/callkit/preset/web/api.md +1 -1
  69. package/resource/knowledge/chat/best-practice/web/image-message-url-handling.md +16 -0
  70. package/resource/knowledge/chat/preset/android/features/chat-setting.md +1 -1
  71. package/resource/knowledge/chat/preset/android/features/conversation-list.md +0 -1
  72. package/resource/knowledge/chat/preset/android/features/language.md +2 -4
  73. package/resource/knowledge/chat/preset/android/features/message-input.md +1 -1
  74. package/resource/knowledge/chat/preset/android/features/message-list.md +1 -2
  75. package/resource/knowledge/chat/preset/android/features/search.md +0 -1
  76. package/resource/knowledge/chat/preset/android/features/theme.md +1 -1
  77. package/resource/knowledge/chat/preset/android-view/integration.md +35 -10
  78. package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +0 -1
  79. package/resource/knowledge/chat/preset/flutter/features/language.md +1 -1
  80. package/resource/knowledge/chat/preset/flutter/features/message-list.md +0 -1
  81. package/resource/knowledge/chat/preset/flutter/features/search.md +4 -5
  82. package/resource/knowledge/chat/preset/flutter/features/theme.md +1 -1
  83. package/resource/knowledge/chat/preset/ios/features/chat-setting.md +1 -1
  84. package/resource/knowledge/chat/preset/ios/features/conversation-list.md +0 -1
  85. package/resource/knowledge/chat/preset/ios/features/language.md +2 -5
  86. package/resource/knowledge/chat/preset/ios/features/message-list.md +0 -1
  87. package/resource/knowledge/chat/preset/ios/features/search.md +0 -1
  88. package/resource/knowledge/chat/preset/ios/features/theme.md +1 -1
  89. package/resource/knowledge/chat/preset/ios-uikit/integration.md +57 -166
  90. package/resource/knowledge/chat/preset/react/features/chat-setting.md +0 -1
  91. package/resource/knowledge/chat/preset/react/features/conversation-actions.md +3 -3
  92. package/resource/knowledge/chat/preset/react/features/conversation-list.md +3 -3
  93. package/resource/knowledge/chat/preset/react/features/conversation-preview.md +1 -1
  94. package/resource/knowledge/chat/preset/react/features/message-input.md +2 -3
  95. package/resource/knowledge/chat/preset/react/features/search.md +0 -1
  96. package/resource/knowledge/chat/preset/vue/features/chat-header.md +1 -1
  97. package/resource/knowledge/chat/preset/vue/features/chat-setting.md +3 -4
  98. package/resource/knowledge/chat/preset/vue/features/conversation-list.md +4 -4
  99. package/resource/knowledge/chat/preset/vue/features/conversation-preview.md +1 -1
  100. package/resource/knowledge/chat/preset/vue/features/message-input.md +2 -2
  101. package/resource/knowledge/chat/preset/vue/features/message-list.md +2 -2
  102. package/resource/knowledge/chat/preset/vue/features/search.md +0 -1
  103. package/resource/knowledge/chat/preset/vue/features/theme.md +4 -4
  104. package/resource/knowledge/livekit/core-sdk/api-reference/android/AudioEffectStore.md +0 -7
  105. package/resource/knowledge/livekit/core-sdk/api-reference/android/BarrageStore.md +2 -5
  106. package/resource/knowledge/livekit/core-sdk/api-reference/android/BattleStore.md +12 -15
  107. package/resource/knowledge/livekit/core-sdk/api-reference/android/CameraView.md +0 -1
  108. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoGuestStore.md +0 -5
  109. package/resource/knowledge/livekit/core-sdk/api-reference/android/CoHostStore.md +0 -3
  110. package/resource/knowledge/livekit/core-sdk/api-reference/android/DeviceStore.md +0 -2
  111. package/resource/knowledge/livekit/core-sdk/api-reference/android/GiftStore.md +2 -4
  112. package/resource/knowledge/livekit/core-sdk/api-reference/android/LikeStore.md +0 -2
  113. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveAudienceStore.md +0 -2
  114. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveCoreView.md +0 -1
  115. package/resource/knowledge/livekit/core-sdk/api-reference/android/LiveSeatStore.md +2 -4
  116. package/resource/knowledge/livekit/core-sdk/api-reference/android/LoginStore.md +1 -3
  117. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/AudioEffectStore.md +0 -7
  118. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BarrageStore.md +3 -6
  119. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BaseBeautyStore.md +0 -1
  120. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/BattleStore.md +12 -15
  121. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoGuestStore.md +0 -5
  122. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/CoHostStore.md +0 -3
  123. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/DeviceStore.md +0 -2
  124. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/GiftStore.md +2 -4
  125. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LikeStore.md +0 -2
  126. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveAudienceStore.md +0 -2
  127. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveCoreView.md +0 -1
  128. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LiveSeatStore.md +2 -4
  129. package/resource/knowledge/livekit/core-sdk/api-reference/flutter/LoginStore.md +1 -3
  130. package/resource/knowledge/livekit/core-sdk/api-reference/ios/AudioEffectStore.md +0 -7
  131. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BarrageStore.md +2 -5
  132. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BaseBeautyStore.md +0 -1
  133. package/resource/knowledge/livekit/core-sdk/api-reference/ios/BattleStore.md +3 -6
  134. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoGuestStore.md +0 -5
  135. package/resource/knowledge/livekit/core-sdk/api-reference/ios/CoHostStore.md +0 -3
  136. package/resource/knowledge/livekit/core-sdk/api-reference/ios/DeviceStore.md +0 -2
  137. package/resource/knowledge/livekit/core-sdk/api-reference/ios/GiftStore.md +2 -4
  138. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LikeStore.md +0 -2
  139. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveAudienceStore.md +0 -2
  140. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveCoreView.md +0 -1
  141. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LiveSeatStore.md +2 -4
  142. package/resource/knowledge/livekit/core-sdk/api-reference/ios/LoginStore.md +1 -3
  143. package/resource/knowledge/livekit/core-sdk/api-reference/vue/capability-matrix.md +82 -0
  144. package/resource/knowledge/livekit/core-sdk/{voice/android/voice-audio-effect.md → features/android/audio-effect.md} +2 -4
  145. package/resource/knowledge/livekit/core-sdk/{live/android/live-barrage.md → features/android/barrage.md} +1 -1
  146. package/resource/knowledge/livekit/core-sdk/{live/android/live-base-beauty.md → features/android/base-beauty.md} +1 -1
  147. package/resource/knowledge/livekit/core-sdk/{voice/android/voice-gift.md → features/android/gift.md} +2 -3
  148. package/resource/knowledge/livekit/core-sdk/{live/android/live-live-list.md → features/android/live-list.md} +1 -1
  149. package/resource/knowledge/livekit/core-sdk/{live/flutter/live-audio-effect.md → features/flutter/audio-effect.md} +0 -2
  150. package/resource/knowledge/livekit/core-sdk/{voice/flutter/voice-barrage.md → features/flutter/barrage.md} +3 -3
  151. package/resource/knowledge/livekit/core-sdk/{voice/flutter/voice-gift.md → features/flutter/gift.md} +2 -2
  152. package/resource/knowledge/livekit/core-sdk/{voice/flutter/voice-room-list.md → features/flutter/live-list.md} +1 -1
  153. package/resource/knowledge/livekit/core-sdk/{voice/ios/voice-audience-list.md → features/ios/audience-list.md} +1 -1
  154. package/resource/knowledge/livekit/core-sdk/{voice/ios/voice-audio-effect.md → features/ios/audio-effect.md} +1 -3
  155. package/resource/knowledge/livekit/core-sdk/{voice/ios/voice-barrage.md → features/ios/barrage.md} +2 -2
  156. package/resource/knowledge/livekit/core-sdk/{live/ios/live-base-beauty.md → features/ios/base-beauty.md} +1 -1
  157. package/resource/knowledge/livekit/core-sdk/{live/ios/live-gift.md → features/ios/gift.md} +8 -9
  158. package/resource/knowledge/livekit/core-sdk/{live/ios/live-live-list.md → features/ios/live-list.md} +2 -2
  159. package/resource/knowledge/livekit/core-sdk/{voice/uni-app/voice-audio-effect.md → features/uni-app/audio-effect.md} +2 -3
  160. package/resource/knowledge/livekit/core-sdk/{voice/uni-app/voice-barrage.md → features/uni-app/barrage.md} +2 -2
  161. package/resource/knowledge/livekit/core-sdk/features/uni-app/base-beauty.md +145 -0
  162. package/resource/knowledge/livekit/core-sdk/{voice/uni-app/voice-gift.md → features/uni-app/gift.md} +6 -7
  163. package/resource/knowledge/livekit/core-sdk/{voice/uni-app/voice-room-list.md → features/uni-app/live-list.md} +1 -1
  164. package/resource/knowledge/livekit/core-sdk/live/android/{live-co-guest-interaction.md → co-guest-interaction.md} +2 -3
  165. package/resource/knowledge/livekit/core-sdk/live/android/{live-host-interaction.md → host-interaction.md} +2 -4
  166. package/resource/knowledge/livekit/core-sdk/live/android/{live-integration.md → integration.md} +6 -9
  167. package/resource/knowledge/livekit/core-sdk/live/flutter/{live-host-interaction.md → host-interaction.md} +1 -3
  168. package/resource/knowledge/livekit/core-sdk/live/flutter/{live-integration.md → integration.md} +1 -6
  169. package/resource/knowledge/livekit/core-sdk/live/ios/{live-co-guest-interaction.md → co-guest-interaction.md} +2 -3
  170. package/resource/knowledge/livekit/core-sdk/live/ios/{live-host-interaction.md → host-interaction.md} +3 -5
  171. package/resource/knowledge/livekit/core-sdk/live/ios/{live-integration.md → integration.md} +7 -10
  172. package/resource/knowledge/livekit/core-sdk/live/uni-app/co-guest-interaction.md +561 -0
  173. package/resource/knowledge/livekit/core-sdk/live/uni-app/host-interaction.md +323 -0
  174. package/resource/knowledge/livekit/core-sdk/live/uni-app/integration.md +312 -0
  175. package/resource/knowledge/livekit/core-sdk/voice/android/{voice-co-guest-interaction.md → co-guest-interaction.md} +3 -3
  176. package/resource/knowledge/livekit/core-sdk/voice/android/{voice-host-interaction.md → host-interaction.md} +2 -4
  177. package/resource/knowledge/livekit/core-sdk/voice/android/{voice-integration.md → integration.md} +11 -14
  178. package/resource/knowledge/livekit/core-sdk/voice/flutter/{voice-co-guest-interaction.md → co-guest-interaction.md} +0 -1
  179. package/resource/knowledge/livekit/core-sdk/voice/flutter/{voice-integration.md → integration.md} +1 -4
  180. package/resource/knowledge/livekit/core-sdk/voice/ios/{voice-co-guest-interaction.md → co-guest-interaction.md} +3 -3
  181. package/resource/knowledge/livekit/core-sdk/voice/ios/{voice-host-interaction.md → host-interaction.md} +2 -4
  182. package/resource/knowledge/livekit/core-sdk/voice/ios/{voice-integration.md → integration.md} +7 -10
  183. package/resource/knowledge/livekit/core-sdk/voice/uni-app/{voice-co-guest-interaction.md → co-guest-interaction.md} +6 -6
  184. package/resource/knowledge/livekit/core-sdk/voice/uni-app/{voice-integration.md → integration.md} +6 -7
  185. package/resource/knowledge/livekit/preset/live/vue/features/barrage.md +2 -3
  186. package/resource/knowledge/livekit/preset/live/vue/features/live-audience-list.md +1 -1
  187. package/resource/knowledge/livekit/preset/live/vue/features/live-view.md +1 -1
  188. package/resource/knowledge/push/api-reference/android.md +337 -0
  189. package/resource/knowledge/push/api-reference/donut.md +190 -0
  190. package/resource/knowledge/push/api-reference/flutter.md +176 -0
  191. package/resource/knowledge/push/api-reference/harmonyos.md +140 -0
  192. package/resource/knowledge/push/api-reference/ios.md +537 -0
  193. package/resource/knowledge/push/api-reference/react-native.md +154 -0
  194. package/resource/knowledge/push/api-reference/uni-app.md +148 -0
  195. package/resource/knowledge/push/api-reference/unity.md +119 -0
  196. package/resource/knowledge/push/api-reference/unreal-engine.md +123 -0
  197. package/resource/knowledge/push/config/android/fcm.md +1 -8
  198. package/resource/knowledge/push/config/android/honor.md +3 -7
  199. package/resource/knowledge/push/config/android/huawei.md +0 -5
  200. package/resource/knowledge/push/config/android/meizu.md +0 -5
  201. package/resource/knowledge/push/config/android/oppo.md +0 -4
  202. package/resource/knowledge/push/config/android/vivo.md +0 -4
  203. package/resource/knowledge/push/config/android/xiaomi.md +0 -2
  204. package/resource/knowledge/push/config/donut.md +33 -46
  205. package/resource/knowledge/push/config/harmonyos.md +6 -9
  206. package/resource/knowledge/push/config/ios.md +2 -9
  207. package/resource/knowledge/push/config/react-native.md +17 -25
  208. package/resource/knowledge/push/config/unity.md +16 -24
  209. package/resource/knowledge/push/config/unreal-engine.md +16 -24
  210. package/resource/knowledge/push/integration/android.md +21 -21
  211. package/resource/knowledge/push/integration/donut.md +24 -34
  212. package/resource/knowledge/push/integration/flutter.md +12 -1
  213. package/resource/knowledge/push/integration/harmonyos.md +2 -1
  214. package/resource/knowledge/push/integration/ios.md +16 -10
  215. package/resource/knowledge/push/integration/react-native.md +10 -14
  216. package/resource/knowledge/push/integration/uni-app.md +10 -6
  217. package/resource/knowledge/push/integration/unity.md +19 -22
  218. package/resource/knowledge/push/integration/unreal-engine.md +7 -9
  219. package/resource/knowledge/push/overview/prepare.md +2 -2
  220. package/resource/knowledge/roomkit/core-sdk/android/capability-matrix.md +46 -0
  221. package/resource/knowledge/roomkit/core-sdk/android/unsupported-features.md +82 -0
  222. package/resource/knowledge/roomkit/core-sdk/flutter/capability-matrix.md +46 -0
  223. package/resource/knowledge/roomkit/core-sdk/flutter/room-participant-state.md +1 -1
  224. package/resource/knowledge/roomkit/core-sdk/flutter/unsupported-features.md +82 -0
  225. package/resource/knowledge/roomkit/core-sdk/ios/capability-matrix.md +46 -0
  226. package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +1 -1
  227. package/resource/knowledge/roomkit/core-sdk/ios/unsupported-features.md +82 -0
  228. package/resource/knowledge/roomkit/core-sdk/vue/call-user-to-room.md +1 -1
  229. package/resource/knowledge/roomkit/core-sdk/vue/device-state.md +0 -4
  230. package/resource/knowledge/roomkit/core-sdk/vue/free-beauty-panel.md +2 -5
  231. package/resource/knowledge/roomkit/core-sdk/vue/room-chat.md +0 -3
  232. package/resource/knowledge/roomkit/core-sdk/vue/room-participant-state.md +0 -2
  233. package/resource/knowledge/roomkit/core-sdk/vue/room-state.md +2 -6
  234. package/resource/knowledge/roomkit/core-sdk/vue/room-view.md +0 -1
  235. package/resource/knowledge/roomkit/core-sdk/vue/schedule-room.md +1 -1
  236. package/resource/knowledge/roomkit/core-sdk/vue/screen-share.md +2 -4
  237. package/resource/knowledge/roomkit/core-sdk/vue/virtual-background.md +2 -3
  238. package/resource/knowledge/roomkit/preset/android/integration.md +14 -16
  239. package/resource/knowledge/roomkit/preset/flutter/integration.md +9 -17
  240. package/resource/knowledge/roomkit/preset/ios/integration.md +9 -17
  241. package/resource/knowledge/roomkit/preset/react/integration.md +0 -4
  242. package/resource/knowledge/trtc/android/TRTCCloud.md +97 -180
  243. package/resource/knowledge/trtc/android/TRTCCloudDef.md +20 -20
  244. package/resource/knowledge/trtc/android/TRTCCloudListener.md +43 -77
  245. package/resource/knowledge/trtc/android/TRTCStatistics.md +1 -1
  246. package/resource/knowledge/trtc/android/TXAudioEffectManager.md +4 -24
  247. package/resource/knowledge/trtc/android/TXDeviceManager.md +2 -2
  248. package/resource/knowledge/trtc/android/TXLiteAVCode.md +1 -1
  249. package/resource/knowledge/trtc/c++/ITRTCCloud.md +96 -189
  250. package/resource/knowledge/trtc/c++/ITRTCStatistics.md +1 -1
  251. package/resource/knowledge/trtc/c++/ITXAudioEffectManager.md +1 -21
  252. package/resource/knowledge/trtc/c++/ITXDeviceManager.md +4 -6
  253. package/resource/knowledge/trtc/c++/TRTCCloudCallback.md +42 -76
  254. package/resource/knowledge/trtc/c++/TRTCTypeDef.md +18 -19
  255. package/resource/knowledge/trtc/c++/TXLiteAVCode.md +1 -1
  256. package/resource/knowledge/trtc/ios/TRTCCloud.md +95 -181
  257. package/resource/knowledge/trtc/ios/TRTCCloudDelegate.md +43 -78
  258. package/resource/knowledge/trtc/ios/TRTCStatistics.md +1 -1
  259. package/resource/knowledge/trtc/ios/TXAudioEffectManager.md +1 -20
  260. package/resource/knowledge/trtc/ios/TXDeviceManager.md +4 -6
  261. package/resource/knowledge/trtc/ios/TXLiteAVCode.md +1 -1
  262. package/resource/knowledge/trtc/ios/TXLiveSDKTypeDef.md +20 -20
  263. package/server-config.js +7 -4
  264. package/server.js +2 -2
  265. package/tools/common/finalize_answer.js +1 -1
  266. package/tools/common/present_framework_choice.js +2 -2
  267. package/tools/common/search_trtc_knowledge.js +3 -3
  268. package/tools/common/submit_feedback.js +1 -1
  269. package/tools/definitions/get_native_live_uikit_integration_def.js +60 -0
  270. package/tools/definitions/get_native_livekit_core_integration_def.js +1 -1
  271. package/tools/definitions/present_framework_choice_def.js +2 -2
  272. package/tools/definitions/search_trtc_knowledge_def.js +5 -5
  273. package/tools/index.js +2 -0
  274. package/tools/live/get_native_live_uikit_integration.js +69 -0
  275. package/tools/live/get_native_livekit_core_integration.js +6 -6
  276. package/utils/is-valid-sdkappid.js +4 -0
  277. package/utils/report-cls-client.js +1 -1
  278. package/utils/report-es-client.js +1 -1
  279. package/resource/index/component-slugs.json +0 -1
  280. package/resource/index/doc-source-urls.json +0 -1
  281. package/resource/index/manifest.json +0 -1
  282. package/resource/knowledge/livekit/core-sdk/live/android/live-audio-effect.md +0 -229
  283. package/resource/knowledge/livekit/core-sdk/live/android/live-gift.md +0 -459
  284. package/resource/knowledge/livekit/core-sdk/live/flutter/live-barrage.md +0 -506
  285. package/resource/knowledge/livekit/core-sdk/live/flutter/live-gift.md +0 -427
  286. package/resource/knowledge/livekit/core-sdk/live/flutter/live-live-list.md +0 -726
  287. package/resource/knowledge/livekit/core-sdk/live/ios/live-audience-list.md +0 -265
  288. package/resource/knowledge/livekit/core-sdk/live/ios/live-audio-effect.md +0 -214
  289. package/resource/knowledge/livekit/core-sdk/live/ios/live-barrage.md +0 -427
  290. package/resource/knowledge/livekit/core-sdk/voice/android/voice-audience-list.md +0 -272
  291. package/resource/knowledge/livekit/core-sdk/voice/android/voice-barrage.md +0 -486
  292. package/resource/knowledge/livekit/core-sdk/voice/android/voice-room-list.md +0 -523
  293. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audience-list.md +0 -262
  294. package/resource/knowledge/livekit/core-sdk/voice/flutter/voice-audio-effect.md +0 -600
  295. package/resource/knowledge/livekit/core-sdk/voice/ios/voice-gift.md +0 -411
  296. package/resource/knowledge/livekit/core-sdk/voice/ios/voice-room-list.md +0 -404
  297. /package/resource/knowledge/livekit/core-sdk/api-reference/{web → vue}/index.md +0 -0
  298. /package/resource/knowledge/livekit/core-sdk/{live/android/live-audience-list.md → features/android/audience-list.md} +0 -0
  299. /package/resource/knowledge/livekit/core-sdk/{live/flutter/live-audience-list.md → features/flutter/audience-list.md} +0 -0
  300. /package/resource/knowledge/livekit/core-sdk/{live/flutter/live-base-beauty.md → features/flutter/base-beauty.md} +0 -0
  301. /package/resource/knowledge/livekit/core-sdk/{voice/uni-app/voice-audience-list.md → features/uni-app/audience-list.md} +0 -0
  302. /package/resource/knowledge/livekit/core-sdk/live/flutter/{live-co-guest-interaction.md → co-guest-interaction.md} +0 -0
@@ -1,62 +1,17 @@
1
- 本文将介绍如何接入 TUILiveKit Demo 的**主播开播页**,指导您将我们提供的开播页面集成到您的项目中,同时介绍如何对直播页面的样式、布局、以及功能进行自定义修改。
1
+ 通过本文,您将了解如何将 TUILiveKit 的**主播开播页**组件进行集成。接入该组件后,您将获得:
2
+ - 完整的 UI 界面:开箱即用的标准主播开播页。
2
3
 
3
- > **集成提示****:**
4
- >
5
-
6
- > 本文档介绍基于 **UI 组件** 的开播方式(含完整交互 UI)。若您需通过 **Core SDK** 自行搭建主播端界面,请参考 主播开播 (Core SDK)。
7
- >
8
-
9
- ## 功能展示
10
- - **横屏开播**
11
-
12
- - **竖屏开播**
13
-
14
- ## 功能概览
15
- - **画面源管理**:支持添加多个摄像头、屏幕分享、窗口分享和本地图片。
16
-
17
- - **直播画面排版**:支持对画面源拖拽、缩放,支持通过快捷菜单对画面源设置镜像、旋转和层级调整。
18
-
19
- - **观众连麦**:支持房间内观众连麦,内置多种连麦布局。
4
+ - 极高的灵活度:支持原子化拆解以及丰富的 UI 属性定制。
20
5
 
21
- - **主播 PK**:支持主播跨房连线、PK。
6
+ ## 前提条件
22
7
 
23
- - **互动聊天**:支持收发文字和表情消息,聊天互动。
24
-
25
- - **观众管理**:支持对观众禁言、踢出直播间等操作。
8
+ 请您先阅读准备工作,请确保集成对应组件并实现登录。
26
9
 
27
10
  ## 快速接入
28
11
 
29
- ### 步骤1:环境配置及开通服务
30
-
31
- 在进行快速接入之前,请参考 准备工作 集成组件并实现登录。
32
-
33
- ### 步骤2: 安装依赖
34
-
35
- 【npm】
36
- ``` bash
37
- npm install tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3 --save
38
- ```
39
-
40
- 【pnpm】
41
- ``` bash
42
- pnpm add tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3
43
- ```
44
-
45
- 【yarn】
46
- ``` bash
47
- yarn add tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3
48
- ```
49
-
50
- ### 步骤3:主播开播页面接入
51
-
52
- 在您的项目下创建 `live-pusher.vue` 文件,通过复制如下代码至您新建的 `live-pusher.vue` 文件中集成完整的**主播开播页面**。
53
-
54
- > **注意:**
55
- >
56
-
57
- > 您可以直接复制如下代码至您的工程中集成示例工程,也可以访问 [开播页面](https://github.com/Tencent-RTC/TUILiveKit/blob/main/Web/web-vite-vue3/src/TUILiveKit/LivePusherView.vue) 地址,查看更加详细的源码内容。
58
- >
12
+ 在您的现有项目(或通过准备工作创建的空模板工程)中,新建 `live-pusher.vue` 文件,并将以下示例代码复制到该文件中,即可集成完整的主播开播页面。
59
13
 
14
+ 主播开播完整示例
60
15
  ``` typescript
61
16
  <template>
62
17
  <UIKitProvider language="zh-CN" theme="dark">
@@ -83,11 +38,39 @@ yarn add tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3
83
38
  <StreamMixer />
84
39
  </div>
85
40
  <div class="live-controls">
41
+ <!-- 底部控制面板(已集成高级功能) -->
86
42
  <div class="bottom-panel">
87
- <!-- <MediaDeviceSetting />// 媒体设置能力请参考本文高级功能集成部分
88
- <CoGuestButton /> // 连麦观众能力请参考本文高级功能集成部分
89
- <OrientationSwitch /> // 布局设置请参考本文高级功能集成部分
90
- <LayoutSwitch /> // 横竖屏推流能力请参考本文高级功能集成部分 -->
43
+ <!-- 1. MediaDeviceSetting 媒体设备设置 -->
44
+ <div class="media-device-container">
45
+ <div class="device-setting">
46
+ <TUIIcon class="device-icon" :icon="microphoneIsOn ? IconAudioOpen : IconAudioClose" :size="20" @click="switchMicrophoneStatus" />
47
+ <TUISlider v-model="microphoneVolume" class="device-slider" :min="0" :max="100" :disabled="!microphoneIsOn" @change="handleMicrophoneVolumeChange" />
48
+ </div>
49
+ <div class="device-setting">
50
+ <TUIIcon class="device-icon" :icon="speakerIsOn ? IconSpeakerOn : IconSpeakerOff" :size="20" @click="switchSpeaker(!speakerIsOn)" />
51
+ <TUISlider v-model="speakerVolume" class="device-slider" :min="0" :max="100" :disabled="!speakerIsOn" @change="handleSpeakerVolumeChange" />
52
+ </div>
53
+ </div>
54
+
55
+ <!-- 2. CoGuestButton 观众连麦设置 -->
56
+ <div class="custom-icon-container" :class="{ disabled: coGuestDisabled }" @click="handleCoGuest">
57
+ <span v-if="applicants.length > 0" class="unread-count">{{ applicants.length }}</span>
58
+ <IconCoGuest class="custom-icon" />
59
+ <span class="custom-text co-guest-text">{{ t('CoGuest') }}</span>
60
+ </div>
61
+
62
+ <!-- 3. OrientationSwitch 横竖屏推流设置 -->
63
+ <div class="custom-icon-container" :class="{ disabled: currentLive?.liveId }" @click="handleOrientationSwitch">
64
+ <IconHorizontalMode v-if="currentOrientation === LiveOrientation.Landscape" class="custom-icon" />
65
+ <IconPortrait v-else class="custom-icon" />
66
+ <span class="custom-text co-guest-text">{{ currentOrientation === LiveOrientation.Portrait ? t('Portrait') : t('Landscape') }}</span>
67
+ </div>
68
+
69
+ <!-- 4. LayoutSwitch 布局设置 -->
70
+ <div class="custom-icon-container" :class="{ 'disabled': layoutSwitchDisabled }" @click="handleSwitchLayout">
71
+ <IconLayoutTemplate class="custom-icon" />
72
+ <span class="custom-text setting-text">{{ t('Layout Settings') }}</span>
73
+ </div>
91
74
  </div>
92
75
  <TUIButton type="primary" v-if="!currentLive?.liveId" @click="handleStartLive">开始直播</TUIButton>
93
76
  <TUIButton color="red" v-else @click="handleStopLive">停止直播</TUIButton>
@@ -106,49 +89,88 @@ yarn add tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3
106
89
  <BarrageInput />
107
90
  </div>
108
91
  </div>
109
-
110
92
  </div>
111
93
  </div>
94
+
95
+ <!-- 弹窗:连麦观众面板 -->
96
+ <TUIDialog :title="t('CoGuest')" :visible="coGuestPanelVisible" :custom-classes="['co-guest-dialog']" @close="coGuestPanelVisible = false" @confirm="coGuestPanelVisible = false" @cancel="coGuestPanelVisible = false">
97
+ <CoGuestPanel class="co-guest-panel" />
98
+ <template #footer><div /></template>
99
+ </TUIDialog>
100
+
101
+ <!-- 弹窗:布局模板设置面板 -->
102
+ <TUIDialog :customClasses="['layout-dialog']" :title="t('Layout Settings')" :visible="layoutSwitchVisible" @close="handleCancel" @confirm="handleConfirm" @cancel="handleCancel" appendTo="body">
103
+ <div class="layout-label">{{ t('Audience Layout') }}</div>
104
+ <div class="template-options">
105
+ <div class="options-grid">
106
+ <template v-for="template in layoutOptions" :key="template.id">
107
+ <div class="option-card" :class="{ active: selectedTemplate === template.templateId }" @click="selectTemplate(template.templateId)">
108
+ <div class="option-info">
109
+ <component :is="template.icon" v-if="template.icon" class="option-icon" />
110
+ <h4>{{ template.label }}</h4>
111
+ </div>
112
+ </div>
113
+ </template>
114
+ </div>
115
+ </div>
116
+ </TUIDialog>
117
+
112
118
  </UIKitProvider>
113
119
  </template>
114
120
 
115
121
  <script setup lang="ts">
116
- import { onMounted } from 'vue';
117
- import { UIKitProvider, TUIButton } from '@tencentcloud/uikit-base-component-vue3';
118
- import { LiveScenePanel, StreamMixer, LiveAudienceList, BarrageList, BarrageInput, useLiveListState, useLiveAudienceState, useLoginState } from 'tuikit-atomicx-vue3';
119
-
122
+ import { onMounted, ref, watch, computed, h, defineComponent } from 'vue';
123
+ import { TUIErrorCode } from '@tencentcloud/tuiroom-engine-js';
124
+ import {
125
+ UIKitProvider, TUIButton, TUIIcon, TUISlider, TUIDialog, TUIToast, TOAST_TYPE, useUIKit,
126
+ IconSpeakerOn, IconSpeakerOff, IconAudioOpen, IconAudioClose, IconPortrait, IconHorizontalMode,
127
+ IconCoGuest, IconLayoutTemplate
128
+ } from '@tencentcloud/uikit-base-component-vue3';
129
+ import {
130
+ LiveScenePanel, StreamMixer, LiveAudienceList, BarrageList, BarrageInput, CoGuestPanel,
131
+ CoHostStatus, LiveOrientation, useLiveListState, useLiveAudienceState, useLoginState,
132
+ useDeviceState, useCoGuestState, useCoHostState
133
+ } from 'tuikit-atomicx-vue3';
134
+
135
+ // ================= 全局定义与基础状态 =================
136
+ const { t } = useUIKit();
120
137
  const { login, setSelfInfo } = useLoginState();
121
- const { createLive, currentLive, endLive } = useLiveListState();
138
+ const { createLive, currentLive, endLive, updateLiveInfo } = useLiveListState();
122
139
  const { audienceCount } = useLiveAudienceState();
140
+ const { coHostStatus } = useCoHostState();
141
+
123
142
  const liveName = '我的直播间';
124
143
 
144
+ enum TUISeatLayoutTemplate {
145
+ LandscapeDynamic_1v3 = 200,
146
+ PortraitDynamic_Grid9 = 600,
147
+ PortraitDynamic_1v6 = 601,
148
+ PortraitFixed_Grid9 = 800,
149
+ PortraitFixed_1v6 = 801,
150
+ PortraitFixed_6v6 = 802,
151
+ }
152
+
153
+ // 基础开播控制
125
154
  const handleStartLive = async () => {
126
- // 创建直播间
127
- await createLive({
128
- liveId: 'my-live-room', // 直播间 ID
129
- liveName: liveName, // 直播间名称
130
- coverUrl: '', // 直播间封面 URL
131
- isPublicVisible: true, // 是否公开可见
132
- seatLayoutTemplateId: 600, // 麦位布局模板 ID
133
- });
134
- // 设置个人信息
135
- await setSelfInfo({
136
- userName: '我的名字/昵称', // 用户名
137
- avatarUrl: '', // 头像 URL 地址
155
+ await startLive({
156
+ liveId: 'my-live-room',
157
+ liveName: liveName,
158
+ coverUrl: '',
159
+ isPublicVisible: true,
160
+ seatLayoutTemplateId: TUISeatLayoutTemplate.PortraitDynamic_Grid9,
138
161
  });
162
+ await setSelfInfo({ userName: '我的名字/昵称', avatarUrl: '' });
139
163
  };
140
164
 
141
165
  const handleStopLive = async () => {
142
166
  await endLive();
143
167
  };
144
168
 
169
+ // 如果您已参考准备工作实现过登陆,则可跳过本部分
145
170
  async function initLogin() {
146
171
  try {
147
- await login({
148
- sdkAppId: 0, // SDKAppID, 可以参考步骤 1 获取
149
- userId: '', // UserID, 可以参考步骤 1 获取
150
- userSig: '', // userSig, 可以参考步骤 1 获取
151
- });
172
+ // 请确保在项目启动时替换为您服务端的真实 SDKAppID, UserId 和 UserSig
173
+ await login({ sdkAppId: 0, userId: '', userSig: '' });
152
174
  } catch (error) {
153
175
  console.error('登录失败:', error);
154
176
  }
@@ -158,101 +180,8 @@ onMounted(async () => {
158
180
  await initLogin();
159
181
  });
160
182
 
161
- </script>
162
-
163
- <style>html,body,#app{height:100%;width:100%;margin:0;padding:0}</style>
164
- <style scoped>.custom-live-pusher,.left-panel{flex-direction:column;display:flex}.custom-live-pusher,.live-title{color:var(--text-color-primary)}.live-controls,.tools-section,.top-controls{backdrop-filter:blur(10px)}*{box-sizing:border-box;margin:0;padding:0}:global(::before){box-sizing:border-box;margin:0;padding:0}.layout-label,.template-options{margin-bottom:16px}:global(body){line-height:1.6;color:var(--text-color-primary);background:var(--bg-color-default)}.custom-live-pusher{height:100vh;width:100vw;background:linear-gradient(135deg,var(--bg-color-default) 0,var(--bg-color-function) 100%);overflow:hidden}.top-controls{display:flex;justify-content:space-between;align-items:center;padding:12px 20px;background:var(--bg-color-operate);border-bottom:1px solid var(--stroke-color-primary);z-index:100;min-height:60px}.live-title{font-size:18px;font-weight:600;text-shadow:0 2px 4px var(--shadow-color)}.audience-count{font-size:14px;color:var(--text-color-error);background:var(--uikit-color-red-1);padding:6px 12px;border-radius:20px;border:1px solid var(--uikit-color-red-3)}.live-controls,.tools-section{background:var(--bg-color-operate)}.main-content{display:flex;flex:1;height:calc(100vh - 60px);gap:16px;padding:16px;overflow:hidden}.left-panel{width:320px;gap:16px;flex-shrink:0}.panel-title{font-size:16px;font-weight:600;color:var(--text-color-primary);margin-bottom:12px;text-align:left}.audience-section,.message-section,.scene-section{display:flex;flex-direction:column;background:var(--bg-color-operate);border-radius:12px;border:1px solid var(--stroke-color-primary);padding:16px;overflow:hidden}.scene-section{flex:1;min-height:0}.message-section{flex:1;min-height:0}.message-section :deep(input),.message-section :deep(textarea){text-align:left}.tools-section{border-radius:12px;padding:16px;border:1px solid var(--stroke-color-primary)}.center-panel{display:flex;flex-direction:column;flex:1;gap:16px;min-width:0}.stream-section{display:flex;flex-direction:column;flex:1;min-height:0;background:var(--bg-color-operate);border-radius:12px;border:1px solid var(--stroke-color-primary);overflow:hidden}.stream-header{display:flex;justify-content:space-between;align-items:center;padding:22px;border-bottom:1px solid var(--stroke-color-primary)}.stream-title{display:flex;align-items:center;gap:8px;font-size:18px;font-weight:500;color:var(--text-color-primary)}.stream-audience{font-size:14px;color:var(--text-color-primary)}.live-controls{display:flex;justify-content:space-between;align-items:center;padding:16px;border-radius:12px;border:1px solid var(--stroke-color-primary);gap:16px}.live-controls button{padding:18px 20px}.right-panel{display:flex;flex-direction:column;width:320px;gap:16px;flex-shrink:0}.center-panel>.live-controls,.left-panel>*,.right-panel>*{background:var(--bg-color-operate);border-radius:12px;border:1px solid var(--stroke-color-primary);overflow:hidden}.left-panel>*{padding:16px}.left-panel>.panel-title,.scene-section>.panel-title,.audience-section>.panel-title,.message-section>.panel-title{padding:0;background:transparent;border:none;border-radius:0}.custom-icon-container,.device-setting{padding:8px 12px;background:var(--bg-color-function)}.stream-section :deep(>*:last-child){flex:1;min-height:300px}.bottom-panel,.device-setting{align-items:center;display:flex}.custom-icon-container:hover,.option-card:hover{border-color:var(--stroke-color-primary);background:var(--list-color-hover)}.bottom-panel{gap:16px;flex:1}.device-setting{gap:8px;border-radius:8px;border:1px solid var(--stroke-color-secondary)}.device-icon{cursor:pointer;color:var(--text-color-primary);transition:color .2s}.device-icon:hover{color:var(--text-color-link)}.device-slider{width:80px}.custom-icon-container{display:flex;align-items:center;gap:6px;border-radius:8px;border:1px solid var(--stroke-color-secondary);cursor:pointer;transition:.2s;position:relative}.custom-icon-container.disabled{opacity:.5;cursor:not-allowed}.custom-icon-container.disabled:hover{background:var(--bg-color-function);border-color:var(--stroke-color-secondary)}.custom-icon{width:16px;height:16px;display:inline-block;background-size:contain;background-repeat:no-repeat;background-position:center}.custom-text{font-size:12px;color:var(--text-color-secondary);white-space:nowrap}.unread-count{position:absolute;top:-4px;right:-4px;background:var(--text-color-error);color:var(--text-color-button);border-radius:10px;padding:2px 6px;font-size:10px;font-weight:600;min-width:16px;text-align:center;line-height:1}.layout-label,.option-info h4{color:var(--text-color-primary)}.layout-dialog{max-width:600px}.layout-label{font-size:16px;font-weight:600}.options-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:12px}.option-card{padding:16px;background:var(--bg-color-function);border:2px solid var(--stroke-color-secondary);border-radius:8px;cursor:pointer;transition:.2s;text-align:center}.option-card.active{border-color:var(--text-color-link);background:var(--bg-color-operate)}.option-info h4{margin:8px 0 0;font-size:12px}.option-icon{width:32px;height:32px;margin:0 auto;color:var(--text-color-secondary)}.co-guest-dialog{max-width:500px}.co-guest-panel{min-height:300px}</style>
165
- ```
166
-
167
- #### 核心 API 参数说明
168
-
169
- ##### **createLive**
170
-
171
- 创建一个新的直播间,并设置直播间的基础信息。
172
- | 参数 | 类型 | 必填 | 说明 |
173
- | --- | --- | --- | --- |
174
- | liveId | String | 是 | 直播间 ID,需保证全局唯一。 |
175
- | liveName | String | 是 | 直播间名称,用于界面展示。 |
176
- | coverUrl | String | 否 | 直播间封面图片的 URL 地址。 |
177
- | isPublicVisible | Boolean | 否 | 是否公开可见。默认为 true,表示公开。 |
178
- | seatLayoutTemplateId | Number | 否 | 麦位布局模板 ID。600 代表竖屏动态宫格布局,更多模板 ID 请参考高级功能章节。 |
179
-
180
- ##### setSelfInfo
181
-
182
- 设置用户信息。
183
- | 参数 | 类型 | 必填 | 说明 |
184
- | --- | --- | --- | --- |
185
- | userName | String | 是 | 用户昵称,将在直播间及聊天区域显示。 |
186
- | avatarUrl | String | 否 | 用户头像的 URL 地址。 |
187
-
188
- ### 步骤4:开启直播
189
-
190
- 开启您的第一场直播。
191
- ``` bash
192
- npm run dev
193
- ```
194
-
195
- > **说明:**
196
- >
197
-
198
- > 上述命令执行成功后,请在浏览器地址栏输入本地访问地址(您可以根据项目参考,例如` http://localhost:5173/live-pusher`,具体端口号可能因您的项目配置而有所不同),即可看到开播页面。
199
- >
200
-
201
- ### 步骤5:观看直播
202
- - **方式一:(推荐)**
203
-
204
- 通过我们提供的 [在线观看网站](https://web.sdk.qcloud.com/trtc/livekit/player/index.html#/),立刻观看您开启的直播。
205
-
206
- - **方式二:**
207
-
208
- 集成我们提供的 观众观看(Web 桌面浏览器)或者 观众观看(H5 移动端浏览器) 页面,观看直播。
209
-
210
- > **重要提示:**
211
- >
212
-
213
- > 请使用不同的**用户 ID** 登录观看: 开播端和观看端必须使用**不同**的用户 ID,否则后登录的设备会强制先登录的设备下线(即“被踢下线”)。
214
- >
215
-
216
- ## 高级功能集成
217
-
218
- > **注意:**
219
- >
220
-
221
- > 以下高级功能均是基于 步骤 3 中创建的 `live-pusher.vue` 示例文件进行的扩展。请根据您的业务需求,将下方的代码片段集成到 `live-pusher.vue` 的对应位置(`template` 区域或 `script` 逻辑中),以启用相应的能力。
222
- >
223
-
224
- 【支持媒体设置能力】
225
-
226
- 若您需要支持媒体设置能力,包括设置扬声器、麦克风音量大小等内容,请参考如下代码示例复制到 `live-pusher.vue` 文件中即可。
227
- ``` typescript
228
- <!-- MediaDeviceSetting 媒体设备设置 -->
229
- <template>
230
- <div class="media-device-container">
231
- <!-- MicVolumeSetting 麦克风设置 -->
232
- <div class="device-setting">
233
- <TUIIcon class="device-icon" :icon="microphoneIsOn ? IconAudioOpen : IconAudioClose" :size="20" @click="switchMicrophoneStatus" />
234
- <TUISlider v-model="microphoneVolume" class="device-slider" :min="0" :max="100" :disabled="!microphoneIsOn" @change="handleMicrophoneVolumeChange" />
235
- </div>
236
- <!-- SpeakerVolumeSetting 扬声器设置 -->
237
- <div class="device-setting">
238
- <TUIIcon class="device-icon" :icon="speakerIsOn ? IconSpeakerOn : IconSpeakerOff" :size="20" @click="switchSpeaker(!speakerIsOn)" />
239
- <TUISlider v-model="speakerVolume" class="device-slider" :min="0" :max="100" :disabled="!speakerIsOn" @change="handleSpeakerVolumeChange" />
240
- </div>
241
- </div>
242
- </template>
243
-
244
- <script lang="ts" setup>
245
- import { ref, watch } from 'vue';
246
- import { TUIIcon, TUISlider, IconSpeakerOn, IconSpeakerOff, IconAudioOpen, IconAudioClose } from '@tencentcloud/uikit-base-component-vue3';
247
- import { useDeviceState } from 'tuikit-atomicx-vue3';
248
-
249
- const {
250
- captureVolume,
251
- setCaptureVolume,
252
- openLocalMicrophone,
253
- closeLocalMicrophone,
254
- } = useDeviceState();
255
- const { outputVolume, setOutputVolume } = useDeviceState();
183
+ // ================= 高级功能:媒体设备控制 =================
184
+ const { captureVolume, setCaptureVolume, openLocalMicrophone, closeLocalMicrophone, outputVolume, setOutputVolume } = useDeviceState();
256
185
  const microphoneVolume = ref(captureVolume.value);
257
186
  const speakerVolume = ref(outputVolume.value);
258
187
  const microphoneIsOn = ref(true);
@@ -261,11 +190,8 @@ const templateSpeakerVolume = ref(outputVolume.value);
261
190
  const templateMicrophoneVolume = ref(captureVolume.value);
262
191
 
263
192
  const handleMicrophoneVolumeChange = (value: number) => {
264
- if (value !== captureVolume.value) {
265
- setCaptureVolume(value);
266
- }
193
+ if (value !== captureVolume.value) setCaptureVolume(value);
267
194
  };
268
-
269
195
  const switchMicrophoneStatus = () => {
270
196
  microphoneIsOn.value = !microphoneIsOn.value;
271
197
  if (!microphoneIsOn.value) {
@@ -276,7 +202,6 @@ const switchMicrophoneStatus = () => {
276
202
  setCaptureVolume(templateMicrophoneVolume.value);
277
203
  }
278
204
  };
279
-
280
205
  const switchSpeaker = (open: boolean) => {
281
206
  speakerIsOn.value = open;
282
207
  if (!open) {
@@ -286,70 +211,15 @@ const switchSpeaker = (open: boolean) => {
286
211
  setOutputVolume(templateSpeakerVolume.value);
287
212
  }
288
213
  };
289
-
290
214
  const handleSpeakerVolumeChange = (value: number) => {
291
- if (value !== outputVolume.value) {
292
- setOutputVolume(value);
293
- }
215
+ if (value !== outputVolume.value) setOutputVolume(value);
294
216
  };
295
217
 
296
- watch(captureVolume, (newVal) => {
297
- microphoneVolume.value = newVal;
298
- });
299
-
300
- watch(outputVolume, (newVal) => {
301
- speakerVolume.value = newVal;
302
- });
303
- </script>
304
-
305
- <style scoped>.media-device-container{display:flex;align-items:center;gap:12px}.device-setting{display:flex;align-items:center;gap:8px;padding:12px 16px;background:var(--bg-color-function);border-radius:8px;border:1px solid var(--stroke-color-secondary)}.device-slider{width:100px}.device-icon{cursor:pointer;color:var(--text-color-primary);transition:color .2s}.device-icon:hover{color:var(--text-color-link)}</style>
306
-
307
- ```
308
-
309
- 【支持横竖屏推流能力】
310
-
311
- 若您需要支持横竖屏推流能力,包括设置切换横竖屏等内容,请参考如下代码示例复制到 `live-pusher.vue` 文件中即可。
312
- ``` typescript
313
- <!-- LayoutSwitch 横竖屏推流设置 -->
314
- <template>
315
- <div
316
- class="custom-icon-container"
317
- :class="{ disabled: currentLive?.liveId }"
318
- @click="handleOrientationSwitch"
319
- >
320
- <IconHorizontalMode
321
- v-if="currentOrientation === LiveOrientation.Landscape"
322
- class="custom-icon"
323
- />
324
- <IconPortrait
325
- v-else
326
- class="custom-icon"
327
- />
328
- <span class="custom-text co-guest-text">{{
329
- currentOrientation === LiveOrientation.Portrait ? t('Portrait') : t('Landscape')
330
- }}</span>
331
- </div>
332
- </template>
333
-
334
- <script setup lang="ts">
335
- import { ref, watch } from 'vue';
336
- import { useUIKit, TUIToast, TOAST_TYPE, IconPortrait, IconHorizontalMode } from '@tencentcloud/uikit-base-component-vue3';
337
- import { useLiveListState, LiveOrientation } from 'tuikit-atomicx-vue3';
338
-
339
- const { t } = useUIKit();
218
+ watch(captureVolume, (newVal) => { microphoneVolume.value = newVal; });
219
+ watch(outputVolume, (newVal) => { speakerVolume.value = newVal; });
340
220
 
341
- enum TUISeatLayoutTemplate {
342
- LandscapeDynamic_1v3 = 200,
343
- PortraitDynamic_Grid9 = 600,
344
- PortraitDynamic_1v6 = 601,
345
- PortraitFixed_Grid9 = 800,
346
- PortraitFixed_1v6 = 801,
347
- PortraitFixed_6v6 = 802,
348
- }
349
-
350
- const { currentLive, updateLiveInfo } = useLiveListState();
221
+ // ================= 高级功能:横竖屏切换 =================
351
222
  const currentOrientation = ref(LiveOrientation.Portrait);
352
-
353
223
  watch(
354
224
  () => currentLive.value?.layoutTemplate,
355
225
  newVal => {
@@ -364,10 +234,7 @@ watch(
364
234
 
365
235
  const handleOrientationSwitch = () => {
366
236
  if (currentLive.value?.liveId) {
367
- TUIToast({
368
- message: t('Cannot switch orientation during live streaming'),
369
- type: TOAST_TYPE.ERROR,
370
- });
237
+ TUIToast({ message: t('Cannot switch orientation during live streaming'), type: TOAST_TYPE.ERROR });
371
238
  return;
372
239
  }
373
240
  if (currentOrientation.value === LiveOrientation.Portrait) {
@@ -376,45 +243,14 @@ const handleOrientationSwitch = () => {
376
243
  updateLiveInfo({ layoutTemplate: TUISeatLayoutTemplate.PortraitDynamic_Grid9 });
377
244
  }
378
245
  };
379
- </script>
380
-
381
- <style scoped>.custom-icon-container{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;width:56px;height:56px;cursor:pointer;color:var(--text-color-primary);border-radius:12px;position:relative}.custom-icon{width:24px;height:24px;background:transparent}.custom-text{font-size:12px}.custom-icon-container:not(.disabled):hover{box-shadow:0 0 10px 0 var(--bg-color-mask)}.custom-icon-container:not(.disabled):hover .custom-icon,.custom-icon-container:not(.disabled):hover .custom-text{color:var(--text-color-link)}.custom-icon-container.disabled{cursor:not-allowed;opacity:.5;color:var(--text-color-secondary)}.custom-icon-container.disabled .custom-icon,.custom-icon-container.disabled .custom-text{color:var(--text-color-secondary);cursor:not-allowed}</style>
382
- ```
383
-
384
- 【支持连观众能力】
385
246
 
386
- 若您需要支持观众连麦能力,包括设置连麦申请、连麦管理等内容,请参考如下代码示例复制到 `live-pusher.vue` 文件中即可。
387
- ``` typescript
388
- <!-- CoGuestButton 观众连麦设置 -->
389
- <template>
390
- <div class="custom-icon-container" :class="{ disabled: disabled }" @click="handleCoGuest">
391
- <span v-if="applicants.length > 0" class="unread-count">{{ applicants.length }}</span>
392
- <IconCoGuest class="custom-icon" />
393
- <span class="custom-text co-guest-text">{{ t('CoGuest') }}</span>
394
- </div>
395
- <TUIDialog :title="t('CoGuest')" :visible="coGuestPanelVisible" :custom-classes="['co-guest-dialog']" @close="coGuestPanelVisible = false" @confirm="coGuestPanelVisible = false" @cancel="coGuestPanelVisible = false">
396
- <CoGuestPanel class="co-guest-panel" />
397
- <template #footer>
398
- <div />
399
- </template>
400
- </TUIDialog>
401
- </template>
402
-
403
- <script lang="ts" setup>
404
- import { computed, ref, watch } from 'vue';
405
- import { useUIKit, TUIDialog, TUIToast, TOAST_TYPE, IconCoGuest } from '@tencentcloud/uikit-base-component-vue3';
406
- import { CoGuestPanel, CoHostStatus, useCoGuestState, useCoHostState, useLiveListState } from 'tuikit-atomicx-vue3';
407
-
408
- const { t } = useUIKit();
247
+ // ================= 高级功能:连麦观众控制 =================
409
248
  const { applicants } = useCoGuestState();
410
- const { currentLive } = useLiveListState();
411
- const { coHostStatus } = useCoHostState();
412
- const disabled = computed(() => !currentLive.value?.liveId || coHostStatus.value !== CoHostStatus.Disconnected);
413
-
249
+ const coGuestDisabled = computed(() => !currentLive.value?.liveId || coHostStatus.value !== CoHostStatus.Disconnected);
414
250
  const coGuestPanelVisible = ref(false);
415
251
 
416
252
  const handleCoGuest = () => {
417
- if (disabled.value) {
253
+ if (coGuestDisabled.value) {
418
254
  const message = !currentLive.value?.liveId
419
255
  ? t('Cannot use co-guest before live starts')
420
256
  : t('Cannot enable audience co-hosting while co-hosting with other hosts');
@@ -423,176 +259,45 @@ const handleCoGuest = () => {
423
259
  }
424
260
  coGuestPanelVisible.value = true;
425
261
  };
262
+ watch(coGuestDisabled, () => { if (coGuestDisabled.value) coGuestPanelVisible.value = false; });
426
263
 
427
- watch(disabled, () => {
428
- if (disabled.value) {
429
- coGuestPanelVisible.value = false;
430
- }
431
- });
432
- </script>
433
-
434
- <style scoped>.custom-icon-container{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;width:56px;height:56px;cursor:pointer;color:var(--text-color-primary);border-radius:12px;position:relative}.unread-count{position:absolute;top:0;right:0;background-color:var(--text-color-error);border-radius:50%;width:16px;height:16px;display:flex;align-items:center;justify-content:center;font-size:12px}.custom-icon{width:24px;height:24px;background:transparent}.custom-text{font-size:12px}.custom-icon-container:not(.disabled):hover{box-shadow:0 0 10px 0 var(--bg-color-mask)}.custom-icon-container:not(.disabled):hover .custom-icon,.custom-icon-container:not(.disabled):hover .custom-text{color:var(--text-color-link)}.custom-icon-container.disabled{cursor:not-allowed;opacity:.5;color:var(--text-color-secondary)}.custom-icon-container.disabled .custom-icon{cursor:not-allowed}.custom-icon-container.disabled .custom-text{color:var(--text-color-secondary)}.co-guest-panel{height:560px}:deep(.co-guest-dialog){width:520px}</style>
435
- ```
436
-
437
- 【支持布局设置能力】
438
-
439
- 若您需要支持视频流切换布局能力,包括设置**动态宫格布局、静态宫格布局、静态小窗布局、浮动小窗布局**等内容,请参考如下代码示例复制到 `live-pusher.vue` 文件中即可。
440
- ``` typescript
441
- <!-- OrientationSwitch 布局设置 -->
442
- <template>
443
- <div
444
- class="custom-icon-container"
445
- :class="{ 'disabled': disabled }"
446
- @click="handleSwitchLayout"
447
- >
448
- <IconLayoutTemplate class="custom-icon" />
449
- <span class="custom-text setting-text">{{ t('Layout Settings') }}</span>
450
- </div>
451
- <TUIDialog
452
- :customClasses="['layout-dialog']"
453
- :title="t('Layout Settings')"
454
- :visible="layoutSwitchVisible"
455
- @close="handleCancel"
456
- @confirm="handleConfirm"
457
- @cancel="handleCancel"
458
- appendTo="body"
459
- >
460
- <div class="layout-label">
461
- {{ t('Audience Layout') }}
462
- </div>
463
- <div class="template-options">
464
- <div class="options-grid">
465
- <template
466
- v-for="template in layoutOptions"
467
- :key="template.id"
468
- >
469
- <div
470
- class="option-card"
471
- :class="{ active: selectedTemplate === template.templateId }"
472
- @click="selectTemplate(template.templateId)"
473
- >
474
- <div class="option-info">
475
- <component
476
- :is="template.icon"
477
- v-if="template.icon"
478
- class="option-icon"
479
- />
480
- <h4>{{ template.label }}</h4>
481
- </div>
482
- </div>
483
- </template>
484
- </div>
485
- </div>
486
- </TUIDialog>
487
- </template>
488
-
489
- <script lang="ts" setup>
490
- import { ref, computed, watch, h, defineComponent } from 'vue';
491
- import { TUIErrorCode } from '@tencentcloud/tuiroom-engine-js';
492
- import { useUIKit, TUIDialog, TUIToast, TOAST_TYPE, IconLayoutTemplate } from '@tencentcloud/uikit-base-component-vue3';
493
- import { useLiveListState, useCoHostState, CoHostStatus } from 'tuikit-atomicx-vue3';
494
-
495
- /**
496
- * 直播间麦位排版模板
497
- */
498
- enum TUISeatLayoutTemplate {
499
- LandscapeDynamic_1v3 = 200,
500
- PortraitDynamic_Grid9 = 600,
501
- PortraitDynamic_1v6 = 601,
502
- PortraitFixed_Grid9 = 800,
503
- PortraitFixed_1v6 = 801,
504
- PortraitFixed_6v6 = 802,
505
- }
264
+ // ================= 高级功能:布局设置控制 =================
265
+ const layoutSwitchDisabled = computed(() => coHostStatus.value === CoHostStatus.Connected);
266
+ const layoutSwitchVisible = ref(false);
267
+ const selectedTemplate = ref<TUISeatLayoutTemplate | null>(currentLive.value?.layoutTemplate ?? null);
506
268
 
507
269
  const createSvgIcon = (pathD: string) => defineComponent({
508
270
  render: () => h('svg', { xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 24 24', fill: 'currentColor', width: '24', height: '24' }, [h('path', { d: pathD })])
509
271
  });
510
-
511
272
  const Dynamic1v6 = createSvgIcon('M3 3h7v7H3V3zm11 0h7v4h-7V3zm0 6h7v4h-7V9zm0 6h7v6h-7v-6zM3 12h7v9H3v-9z');
512
273
  const DynamicGrid9 = createSvgIcon('M3 3h5v5H3V3zm7 0h4v5h-4V3zm6 0h5v5h-5V3zM3 10h5v4H3v-4zm7 0h4v4h-4v-4zm6 0h5v4h-5v-4zM3 16h5v5H3v-5zm7 0h4v5h-4v-5zm6 0h5v5h-5v-5z');
513
274
  const Fixed1v6 = createSvgIcon('M2 2h9v9H2V2zm11 0h9v4h-9V2zm0 5h9v4h-9V7zm0 5h9v4h-9v-4zm0 5h9v5h-9v-5zM2 13h9v9H2v-9z');
514
275
  const FixedGrid9 = createSvgIcon('M2 2h6v6H2V2zm7 0h6v6H9V2zm7 0h6v6h-6V2zM2 9h6v6H2V9zm7 0h6v6H9V9zm7 0h6v6h-6V9zM2 16h6v6H2v-6zm7 0h6v6H9v-6zm7 0h6v6h-6v-6z');
515
276
  const HorizontalFloat = createSvgIcon('M2 4h20v12H2V4zm3 14h4v2H5v-2zm6 0h4v2h-4v-2zm6 0h4v2h-4v-2z');
516
277
 
517
- const { t } = useUIKit();
518
- const { currentLive, updateLiveInfo } = useLiveListState();
519
- const { coHostStatus } = useCoHostState();
520
- const disabled = computed(() => coHostStatus.value === CoHostStatus.Connected);
521
-
522
- watch(
523
- () => currentLive.value?.liveId,
524
- (liveId) => {
525
- if (!liveId) {
526
- updateLiveInfo({ layoutTemplate: TUISeatLayoutTemplate.PortraitDynamic_Grid9 });
527
- }
528
- },
529
- { immediate: true },
530
- );
531
-
532
- const layoutSwitchVisible = ref(false);
533
-
534
- const handleSwitchLayout = () => {
535
- if (disabled.value) {
536
- TUIToast({ type: TOAST_TYPE.ERROR, message: t('Layout switching is not available during co-hosting') });
537
- return;
538
- }
539
- layoutSwitchVisible.value = true;
540
- };
541
-
542
278
  const portraitLayoutOptions = computed(() => [
543
- {
544
- id: 'PortraitDynamic_Grid9',
545
- icon: DynamicGrid9,
546
- templateId: TUISeatLayoutTemplate.PortraitDynamic_Grid9,
547
- label: t('Dynamic Grid9 Layout'),
548
- },
549
- {
550
- id: 'PortraitFixed_1v6',
551
- icon: Fixed1v6,
552
- templateId: TUISeatLayoutTemplate.PortraitFixed_1v6,
553
- label: t('Fixed 1v6 Layout'),
554
- },
555
- {
556
- id: 'PortraitFixed_Grid9',
557
- icon: FixedGrid9,
558
- templateId: TUISeatLayoutTemplate.PortraitFixed_Grid9,
559
- label: t('Fixed Grid9 Layout'),
560
- },
561
- {
562
- id: 'PortraitDynamic_1v6',
563
- icon: Dynamic1v6,
564
- templateId: TUISeatLayoutTemplate.PortraitDynamic_1v6,
565
- label: t('Dynamic 1v6 Layout'),
566
- },
279
+ { id: 'PortraitDynamic_Grid9', icon: DynamicGrid9, templateId: TUISeatLayoutTemplate.PortraitDynamic_Grid9, label: t('Dynamic Grid9 Layout') },
280
+ { id: 'PortraitFixed_1v6', icon: Fixed1v6, templateId: TUISeatLayoutTemplate.PortraitFixed_1v6, label: t('Fixed 1v6 Layout') },
281
+ { id: 'PortraitFixed_Grid9', icon: FixedGrid9, templateId: TUISeatLayoutTemplate.PortraitFixed_Grid9, label: t('Fixed Grid9 Layout') },
282
+ { id: 'PortraitDynamic_1v6', icon: Dynamic1v6, templateId: TUISeatLayoutTemplate.PortraitDynamic_1v6, label: t('Dynamic 1v6 Layout') },
567
283
  ]);
568
-
569
284
  const horizontalLayoutOptions = computed(() => [
570
- {
571
- id: 'LandscapeDynamic_1v3',
572
- icon: HorizontalFloat,
573
- templateId: TUISeatLayoutTemplate.LandscapeDynamic_1v3,
574
- label: t('Landscape Template'),
575
- },
285
+ { id: 'LandscapeDynamic_1v3', icon: HorizontalFloat, templateId: TUISeatLayoutTemplate.LandscapeDynamic_1v3, label: t('Landscape Template') },
576
286
  ]);
577
-
578
287
  const layoutOptions = computed(() => {
579
- if (currentLive.value && currentLive.value?.layoutTemplate >= 200 && currentLive.value?.layoutTemplate <= 599) {
580
- return horizontalLayoutOptions.value;
581
- }
288
+ if (currentLive.value && currentLive.value?.layoutTemplate >= 200 && currentLive.value?.layoutTemplate <= 599) return horizontalLayoutOptions.value;
582
289
  return portraitLayoutOptions.value;
583
290
  });
584
291
 
585
- const selectedTemplate = ref<TUISeatLayoutTemplate | null>(currentLive.value?.layoutTemplate ?? null);
586
-
587
- function selectTemplate(template: TUISeatLayoutTemplate) {
588
- selectedTemplate.value = template;
589
- }
590
-
591
- watch(() => currentLive.value?.layoutTemplate, (newVal) => {
592
- if (newVal) {
593
- selectedTemplate.value = newVal;
292
+ const handleSwitchLayout = () => {
293
+ if (layoutSwitchDisabled.value) {
294
+ TUIToast({ type: TOAST_TYPE.ERROR, message: t('Layout switching is not available during co-hosting') });
295
+ return;
594
296
  }
595
- });
297
+ layoutSwitchVisible.value = true;
298
+ };
299
+ function selectTemplate(template: TUISeatLayoutTemplate) { selectedTemplate.value = template; }
300
+ watch(() => currentLive.value?.layoutTemplate, (newVal) => { if (newVal) selectedTemplate.value = newVal; });
596
301
 
597
302
  async function handleConfirm() {
598
303
  if (selectedTemplate.value) {
@@ -601,34 +306,108 @@ async function handleConfirm() {
601
306
  layoutSwitchVisible.value = false;
602
307
  } catch (error: any) {
603
308
  let errorMessage = t('Layout switch failed');
604
- if (error.code === TUIErrorCode.ERR_FREQ_LIMIT) {
605
- errorMessage = t('Operation too frequent, please try again later');
606
- }
309
+ if (error.code === TUIErrorCode.ERR_FREQ_LIMIT) errorMessage = t('Operation too frequent, please try again later');
607
310
  TUIToast({ type: TOAST_TYPE.ERROR, message: errorMessage });
608
311
  }
609
312
  } else {
610
313
  layoutSwitchVisible.value = false;
611
314
  }
612
315
  }
613
-
614
316
  function handleCancel() {
615
317
  selectedTemplate.value = currentLive.value?.layoutTemplate ?? null;
616
318
  layoutSwitchVisible.value = false;
617
319
  }
320
+ watch(
321
+ () => currentLive.value?.liveId,
322
+ (liveId) => { if (!liveId) updateLiveInfo({ layoutTemplate: TUISeatLayoutTemplate.PortraitDynamic_Grid9 }); },
323
+ { immediate: true },
324
+ );
618
325
  </script>
619
326
 
327
+ <style>
328
+ /* 全局样式 */
329
+ html, body, #app { height: 100%; width: 100%; margin: 0; padding: 0; }
330
+ body { line-height: 1.6; color: var(--text-color-primary); background: var(--bg-color-default); }
331
+ :global(::before), * { box-sizing: border-box; margin: 0; padding: 0; }
332
+ </style>
333
+
620
334
  <style scoped>
621
- .custom-icon-container { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; width: 56px; height: 56px; cursor: pointer; color: var(--text-color-primary); border-radius: 12px; position: relative; } .custom-icon-container .custom-icon { display: inline-block; width: 24px; height: 24px; background: transparent; } .custom-icon-container .custom-text { font-size: 12px; font-weight: 400; } .custom-icon-container:not(.disabled):hover { box-shadow: 0 0 10px 0 var(--bg-color-mask); } .custom-icon-container:not(.disabled):hover .custom-icon { color: var(--text-color-link); } .custom-icon-container:not(.disabled):hover .custom-text { color: var(--text-color-link); } .custom-icon-container.disabled { cursor: not-allowed; opacity: 0.5; color: var(--text-color-tertiary); } .custom-icon-container.disabled .custom-icon { color: var(--text-color-tertiary); cursor: not-allowed; } .custom-icon-container.disabled .custom-text { color: var(--text-color-tertiary); } :deep(.layout-dialog) { padding: 24px; width: 480px; } :deep(.layout-dialog) .dialog-body { flex-wrap: wrap; } :deep(.layout-dialog) .dialog-footer { padding-top: 32px; } .layout-label { font-size: 14px; font-weight: 400; color: var(--text-color-primary, #ffffff); margin: 4px 0px 16px 0px; } .template-options { width: 100%; height: 100%; overflow: auto; } .template-options .options-grid { display: flex; flex-wrap: wrap; gap: 16px; justify-content: flex-start; } .template-options .options-grid .option-card { box-sizing: border-box; padding: 12px 13px; width: 208px; background: #3a3a3a; border: 2px solid transparent; border-radius: 12px; cursor: pointer; transition: all 0.2s ease; text-align: center; } .template-options .options-grid .option-card:hover { background: #4a4a4a; border-color: #5a5a5a; } .template-options .options-grid .option-card.active { border: 2px solid var(--text-color-link-hover, #2B6AD6); background: var(--list-color-focused, #243047); } .template-options .options-grid .option-card.active .option-info h4 { color: #ffffff; } .template-options .options-grid .option-card .option-info { display: flex; align-items: center; justify-content: flex-start; gap: 8px; } .template-options .options-grid .option-card .option-info .option-icon { width: 24px; height: 24px; } .template-options .options-grid .option-card .option-info h4 { margin: 0; font-size: 14px; font-weight: 600; color: #ffffff; transition: color 0.2s ease; }
335
+ /* 核心布局结构 */
336
+ .custom-live-pusher { height: 100vh; width: 100vw; background: linear-gradient(135deg, var(--bg-color-default) 0, var(--bg-color-function) 100%); overflow: hidden; display: flex; flex-direction: column; color: var(--text-color-primary); }
337
+ .main-content { display: flex; flex: 1; height: calc(100vh - 60px); gap: 16px; padding: 16px; overflow: hidden; }
338
+
339
+ /* 左右面板通用 */
340
+ .left-panel, .right-panel { display: flex; flex-direction: column; width: 320px; gap: 16px; flex-shrink: 0; }
341
+ .left-panel > *, .right-panel > * { background: var(--bg-color-operate); border-radius: 12px; border: 1px solid var(--stroke-color-primary); overflow: hidden; }
342
+ .scene-section, .audience-section, .message-section { display: flex; flex-direction: column; padding: 16px; overflow: hidden; }
343
+ .scene-section, .message-section { flex: 1; min-height: 0; }
344
+ .panel-title { font-size: 16px; font-weight: 600; color: var(--text-color-primary); margin-bottom: 12px; text-align: left; }
345
+ .message-section :deep(input), .message-section :deep(textarea) { text-align: left; }
346
+
347
+ /* 中央面板结构 */
348
+ .center-panel { display: flex; flex-direction: column; flex: 1; gap: 16px; min-width: 0; }
349
+ .stream-section { display: flex; flex-direction: column; flex: 1; min-height: 0; background: var(--bg-color-operate); border-radius: 12px; border: 1px solid var(--stroke-color-primary); overflow: hidden; }
350
+ .stream-header { display: flex; justify-content: space-between; align-items: center; padding: 22px; border-bottom: 1px solid var(--stroke-color-primary); }
351
+ .stream-title { display: flex; align-items: center; gap: 8px; font-size: 18px; font-weight: 500; color: var(--text-color-primary); }
352
+ .stream-audience { font-size: 14px; color: var(--text-color-primary); }
353
+ .stream-section :deep(>*:last-child) { flex: 1; min-height: 300px; }
354
+
355
+ /* 底部操作区集成 */
356
+ .live-controls { display: flex; justify-content: space-between; align-items: center; padding: 16px; border-radius: 12px; border: 1px solid var(--stroke-color-primary); gap: 16px; background: var(--bg-color-operate); backdrop-filter: blur(10px); }
357
+ .live-controls button { padding: 18px 20px; }
358
+ .bottom-panel { display: flex; align-items: center; gap: 16px; flex: 1; }
359
+
360
+ /* 高级功能:媒体设备设置 */
361
+ .media-device-container { display: flex; align-items: center; gap: 12px; }
362
+ .device-setting { display: flex; align-items: center; gap: 8px; padding: 8px 12px; background: var(--bg-color-function); border-radius: 8px; border: 1px solid var(--stroke-color-secondary); }
363
+ .device-slider { width: 80px; }
364
+ .device-icon { cursor: pointer; color: var(--text-color-primary); transition: color .2s; }
365
+ .device-icon:hover { color: var(--text-color-link); }
366
+
367
+ /* 高级功能:图标操作按钮 (横竖屏、连麦、布局通用) */
368
+ .custom-icon-container { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; width: 56px; height: 56px; cursor: pointer; color: var(--text-color-primary); border-radius: 12px; position: relative; border: 1px solid transparent; transition: 0.2s; background: var(--bg-color-function); }
369
+ .custom-icon { display: inline-block; width: 24px; height: 24px; background: transparent; }
370
+ .custom-text { font-size: 12px; font-weight: 400; color: var(--text-color-secondary); white-space: nowrap; }
371
+ .custom-icon-container:not(.disabled):hover { box-shadow: 0 0 10px 0 var(--bg-color-mask); border-color: var(--stroke-color-primary); background: var(--list-color-hover); }
372
+ .custom-icon-container:not(.disabled):hover .custom-icon, .custom-icon-container:not(.disabled):hover .custom-text { color: var(--text-color-link); }
373
+ .custom-icon-container.disabled { cursor: not-allowed; opacity: 0.5; }
374
+ .custom-icon-container.disabled:hover { background: var(--bg-color-function); border-color: transparent; }
375
+ .custom-icon-container.disabled .custom-icon, .custom-icon-container.disabled .custom-text { color: var(--text-color-secondary); cursor: not-allowed; }
376
+ .unread-count { position: absolute; top: 0px; right: 0px; background: var(--text-color-error); color: var(--text-color-button); border-radius: 10px; padding: 2px 6px; font-size: 10px; font-weight: 600; min-width: 16px; text-align: center; line-height: 1; }
377
+
378
+ /* 弹窗:连麦面板 */
379
+ :deep(.co-guest-dialog) { width: 520px; }
380
+ .co-guest-panel { height: 560px; min-height: 300px; }
381
+
382
+ /* 弹窗:布局面板 */
383
+ :deep(.layout-dialog) { padding: 24px; width: 480px; max-width: 600px; }
384
+ :deep(.layout-dialog) .dialog-body { flex-wrap: wrap; }
385
+ :deep(.layout-dialog) .dialog-footer { padding-top: 32px; }
386
+ .layout-label { font-size: 16px; font-weight: 600; color: var(--text-color-primary); margin-bottom: 16px; }
387
+ .template-options { width: 100%; height: 100%; overflow: auto; margin-bottom: 16px; }
388
+ .options-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 12px; }
389
+ .option-card { padding: 16px; background: var(--bg-color-function); border: 2px solid var(--stroke-color-secondary); border-radius: 8px; cursor: pointer; transition: 0.2s; text-align: center; }
390
+ .option-card:hover { border-color: var(--stroke-color-primary); background: var(--list-color-hover); }
391
+ .option-card.active { border-color: var(--text-color-link); background: var(--bg-color-operate); }
392
+ .option-info { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; }
393
+ .option-icon { width: 32px; height: 32px; margin: 0 auto; color: var(--text-color-secondary); }
394
+ .option-info h4 { margin: 8px 0 0; font-size: 12px; color: var(--text-color-primary); transition: color 0.2s; }
395
+ .option-card.active .option-info h4 { color: var(--text-color-link); }
622
396
  </style>
623
397
  ```
624
398
 
625
- ## 自定义您的界面布局
399
+ ## 运行示例
400
+
401
+ 执行 `npm run dev` 成功后,在浏览器地址栏输入本地访问地址(例如`http://localhost:5173/live-pusher`,具体端口号可能因项目配置不同而有所差异),即可看到开播页面,开启您的第一场直播,效果如图所示。
402
+ ``` bash
403
+ npm run dev
404
+ ```
626
405
 
627
- `TUILiveKit` 支持灵活定制开播页与直播页的功能和样式,您可根据业务需求调整布局、隐藏 / 显示功能模块。
406
+ ## 开播核心功能配置
628
407
 
629
408
  ### 横竖屏推流设置
630
409
 
631
- `TUILiveKit` 支持**横屏**和**竖屏**两种推流模式,您可根据直播场景选择合适的推流方向:
410
+ TUILiveKit 支持横屏和竖屏两种推流模式,您可根据直播场景选择合适的推流方向:
632
411
  | <strong>推流模式</strong> | <strong>适用场景</strong> | <strong>说明</strong> |
633
412
  | --- | --- | --- |
634
413
  | <strong>竖屏推流</strong> | 秀场直播、电商带货、聊天互动 | 默认模式,适合移动端观看,画面比例为 9:16。 |
@@ -636,18 +415,17 @@ function handleCancel() {
636
415
 
637
416
  > **注意:**
638
417
  >
639
-
640
- > 横竖屏切换必须在**开播前**进行设置,直播过程中无法切换推流方向。
418
+ > 横竖屏切换必须在开播前进行设置,直播过程中无法切换推流方向。
641
419
  >
642
420
 
643
- #### 通过 UI 交互切换
421
+ #### 通过 UI 交互切换横竖屏
644
422
 
645
- 在主播开播页的底部控制栏,点击**横屏 / 竖屏**按钮即可切换推流方向:
646
- - 显示**竖屏**时,当前为**竖屏推流模式**。
423
+ 在主播开播页的底部控制栏,点击横屏 / 竖屏按钮即可切换推流方向:
424
+ - 显示竖屏时,当前为竖屏推流模式;
647
425
 
648
- - 显示**横屏**时,当前为**横屏推流模式**
426
+ - 显示横屏时,当前为横屏推流模式。
649
427
 
650
- #### 通过代码设置
428
+ #### 通过代码设置横竖屏
651
429
 
652
430
  您也可以通过调用 `updateLiveInfo` 方法,在代码中设置推流方向:
653
431
  ``` typescript
@@ -668,32 +446,35 @@ updateLiveInfo({ layoutTemplate: 600 });
668
446
  > - 竖屏模式对应的布局模板 ID 范围为 600-899,默认使用 600(动态宫格布局)。
669
447
  > - 切换横竖屏时,系统会自动切换到对应方向的默认布局模板。
670
448
 
671
- ### 直播布局模板选择
449
+ ### 直播布局模板
450
+
451
+ `TUILiveKit` 在横屏布局和竖屏布局下分别提供多种直播布局模板,用于控制主播与连麦嘉宾的画面排列方式。您可在开播页的布局设置中选择合适模板。
672
452
 
673
- `TUILiveKit` 提供多种直播布局模板,用于控制主播与连麦嘉宾的画面排列方式。您可在主播开播页的**布局设置**选择合适样式:
453
+ #### 布局模板介绍
674
454
 
675
- #### 竖屏模式布局模板
455
+ (1)竖屏模式布局模板
676
456
 
677
- 竖屏模式下提供 **4 种布局模板**,适用于秀场直播、电商带货等场景:
457
+ 竖屏模式下提供 **4** 种布局模板,较适用于**秀场直播、电商带货**等场景:
678
458
  | <strong>名称</strong> | <strong>动态宫格布局</strong> | <strong>动态 1V6 布局</strong> | <strong>静态宫格布局</strong> | <strong>静态小窗布局</strong> |
679
459
  | --- | --- | --- | --- | --- |
680
460
  | <strong>模板 ID</strong> | 600 | 601 | 800 | 801 |
681
- | <strong>描述</strong> | <strong>默认布局</strong>,根据连麦人数动态调整宫格大小,画面自适应填充。 | 主播画面居中大窗显示,连麦嘉宾以<strong>浮动小窗</strong>形式环绕在主播周围。 | 固定 9 宫格布局,每个嘉宾占据一个<strong>固定大小</strong>的宫格位置。 | 主播画面全屏显示,连麦嘉宾以<strong>固定小窗</strong>形式显示在画面边缘。 |
461
+ | <strong>描述</strong> | 默认布局,根据连麦人数动态调整宫格大小,画面自适应填充。 | 主播画面居中大窗显示,连麦嘉宾以浮动小窗形式环绕在主播周围。 | 固定 9 宫格布局,每个嘉宾占据一个固定大小的宫格位置。 | 主播画面全屏显示,连麦嘉宾以固定小窗形式显示在画面边缘。 |
682
462
  | <strong>适用场景</strong> | 通用场景,连麦人数不固定。 | 主播为主、嘉宾为辅的互动场景。 | 多人连麦、语音聊天室等固定人数场景。 | 主播全屏展示、嘉宾辅助的场景。 |
683
463
 
684
- #### 横屏模式布局模板
464
+ (2)横屏模式布局模板
685
465
 
686
- 横屏模式下提供 **1 种布局模板**,适用于游戏直播、在线教育等场景:
687
- | <strong>名称</strong> | <strong>横屏浮动布局</strong> |
688
- | --- | --- |
689
- | <strong>模板 ID</strong> | 200 |
690
- | <strong>描述</strong> | 主播画面全屏显示,连麦嘉宾以<strong>浮动小窗</strong>形式显示在画面底部。 |
691
- | <strong>适用场景</strong> | 游戏直播、屏幕分享、在线教育等需要横屏展示的场景。 |
466
+ 横屏模式下提供 **2** 种布局模板,适用于**游戏直播、在线教育**等场景:
467
+ | <strong>名称</strong> | <strong>横屏浮动布局</strong> | <strong>横屏1v1 连麦布局</strong> |
468
+ | --- | --- | --- |
469
+ | <strong>模板 ID</strong> | 200 | 400 |
470
+ | <strong>描述</strong> | 主播画面全屏显示,连麦嘉宾以浮动小窗形式显示在画面底部 | 主播与 1 位连线/PK 嘉宾以固定位置、左右各占一半的形式并排显示在横屏画面中,麦位位置固定 |
471
+ | <strong>适用场景</strong> | 游戏直播、屏幕分享、在线教育等需要横屏展示的场景 | 横屏方向下的双人连线与主播 PK 对战场景 |
692
472
 
693
473
  #### 通过代码设置布局模板
694
474
 
695
- 您可以通过调用 `updateLiveInfo` 方法,在代码中设置布局模板:
475
+ 您可以通过调用 `updateLiveInfo` 方法,在代码中设置布局模板。
696
476
  ``` typescript
477
+
697
478
  import { useLiveListState } from 'tuikit-atomicx-vue3';
698
479
 
699
480
  const { updateLiveInfo } = useLiveListState();
@@ -712,23 +493,24 @@ updateLiveInfo({ layoutTemplate: 801 });
712
493
 
713
494
  // 设置横屏浮动布局
714
495
  updateLiveInfo({ layoutTemplate: 200 });
496
+
497
+ // 设置横屏 1v1 布局
498
+ updateLiveInfo({ layoutTemplate: 400 });
715
499
  ```
716
500
 
717
- > **注意:**
718
- >
719
- > - 布局模板可以在**开播前**和**直播中**进行切换。
720
- > - 在主播 PK 连线期间,**无法切换**布局模板。
721
- > - 切换横竖屏推流方向时,布局模板会自动切换为对应方向的默认模板。
501
+ ### 添加媒体源素材
722
502
 
723
- ## 自由定制
503
+ ## xxxx
724
504
 
725
- ### 颜色主题及语言
505
+ ## UI 自定义定制
726
506
 
727
- 通过配置 `App.vue` 中 `UIKitProvider` 的入参,修改主题及语言的默认值。
507
+ ### 配置主题及语言
508
+
509
+ 通过配置`App.vue`中 `UIKitProvider` 的入参,修改主题及语言的默认值。
728
510
  | <strong>UIKitProvider 参数</strong> | <strong>可选值</strong> | <strong>默认值</strong> |
729
511
  | --- | --- | --- |
730
- | theme | "light" \\| "dark" | "light" |
731
- | language | "zh-CN" \\| "en-US" | "en-US" |
512
+ | <strong>theme</strong> | "light" \\| "dark" | "light" |
513
+ | <strong>language</strong> | "zh-CN" \\| "en-US" | "en-US" |
732
514
 
733
515
  ``` typescript
734
516
  <UIKitProvider theme="light">
@@ -737,23 +519,9 @@ updateLiveInfo({ layoutTemplate: 200 });
737
519
 
738
520
  <script setup lang="ts">
739
521
  import { UIKitProvider } from '@tencentcloud/uikit-base-component-vue3';
522
+ </script>
740
523
  ```
741
524
 
742
- ### 按钮 Button 和图标 Icon
743
-
744
- 若您需要对按钮 Button 或图标 Icon 等其他控件进行新增或替换等 UI 定制,您可以通过如下方式实现,以 `live-player.vue` 文件中的按钮和图标为例,您可以参考下图找到对应按钮或图标的指定位置源码,对当前部分的控件进行**增加、删除、替换**等 UI 定制操作。
745
-
746
- 根据上述示例,我们同样支持您根据项目需求对**观众观看页面**进行 UI 定制的能力。除了页面 UI 布局调整,我们也支持您对**颜色主题、字体、圆角、按钮、图标、输入框、弹框等**内容进行**增加、删除、修改**等操作,满足您的 UI 定制需要。
747
- | <strong>类别</strong> | <strong>功能</strong> | <strong>描述</strong> | <strong>组件详细定制指引</strong> |
748
- | --- | --- | --- | --- |
749
- | <strong>素材管理</strong> | 自定义素材管理区域展示 | <strong>支持:</strong><br>- <strong>调整展示 Icon 的大小、颜色或对 Icon 进行替换。</strong> | <a href="https://cloud.tencent.com/document/product/647/123838">媒体源配置面板</a> |
750
- | <strong>在线观众</strong> | 自定义观众信息展示 | <strong>支持:</strong><br>- <strong>展示/隐藏观众等级。</strong><br>- <strong>观众信息字体、颜色 UI 自定义设置。</strong><br>- <strong>替换为您需要的 Icon 风格。</strong> | <a href="https://cloud.tencent.com/document/product/647/123834">视频源编辑画板</a> |
751
- | <strong>消息列表</strong> | 自定义消息弹幕区域展示 | <strong>支持:</strong><br>- <strong>展示/隐藏聊天输入区域。</strong><br>- <strong>支持 UI 定制聊天气泡风格、定制观众等级等内容。</strong> | <a href="https://cloud.tencent.com/document/product/647/123836">聊天弹幕组件</a> |
752
-
753
- ## 下一步
754
-
755
- 恭喜您,现在您已经成功集成了**主播开播页面 **。接下来,您可以实现**观众观看页**、**直播列表页**和 **UI 自定义**等内容,可参考下表:
756
- | <strong>功能</strong> | <strong>描述</strong> | <strong>集成指引</strong> |
757
- | --- | --- | --- |
758
- | <strong>观众观看</strong> | 实现观众进入主播的直播间后观看直播,实现观众连麦 、直播间信息、在线观众、弹幕显示等功能。 | 观众观看 |
759
- | <strong>直播列表</strong> | 展示直播列表界面和功能,包含直播列表,房间信息展示功能。 | 直播列表 |
525
+ |**深色主题**|**浅色主题**|
526
+ |---------|---------|
527
+ |||