@tencent-rtc/mcp 1.3.5 → 1.3.7

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 (33) hide show
  1. package/index.js +4 -4
  2. package/index.js.map +1 -1
  3. package/package.json +1 -1
  4. package/resource/doc/livekit/live/flutter/live-audience-list.md +339 -0
  5. package/resource/doc/livekit/live/flutter/live-audio-effect.md +742 -0
  6. package/resource/doc/livekit/live/flutter/live-barrage.md +581 -0
  7. package/resource/doc/livekit/live/flutter/live-base-beauty.md +486 -0
  8. package/resource/doc/livekit/live/flutter/live-co-guest-interaction.md +608 -0
  9. package/resource/doc/livekit/live/flutter/live-gift.md +800 -0
  10. package/resource/doc/livekit/live/flutter/live-host-interaction.md +1113 -0
  11. package/resource/doc/livekit/live/flutter/live-integration.md +1041 -0
  12. package/resource/doc/livekit/live/flutter/live-live-list.md +865 -0
  13. package/resource/doc/livekit/live/flutter/workflow.md +353 -0
  14. package/resource/doc/tuicallkit/flutter/workflow.md +331 -0
  15. package/tools/call/get-native-call-integration.js +27 -11
  16. package/tools/call/get-native-call-integration.js.map +1 -1
  17. package/tools/definitions/get_native_call_uikit_integration_def.js +17 -7
  18. package/tools/definitions/get_native_call_uikit_integration_def.js.map +1 -1
  19. package/utils/report-cls-client.js +1 -1
  20. package/utils/report-es-client.js +1 -1
  21. package/resource/doc/tuicallkit/flutter/how_to_run_flutter_callkit_demo.md +0 -101
  22. package/resource/doc/tuicallkit/iOS/how_to_run_iOS_callkit_demo.md +0 -98
  23. /package/resource/doc/tuicallkit/android/{how_to_integrated_android_callkit.md → integration.md} +0 -0
  24. /package/resource/doc/tuicallkit/android/{.gitkeep → workflow.md} +0 -0
  25. /package/resource/doc/tuicallkit/{android/api_TUICallObserver.md → faq/android_sdk/call-observer-api.md} +0 -0
  26. /package/resource/doc/tuicallkit/{android/api_TUICallKit.md → faq/android_sdk/callkit-api.md} +0 -0
  27. /package/resource/doc/tuicallkit/{flutter/api_TUICallDefine.md → faq/flutter_sdk/call-define-api.md} +0 -0
  28. /package/resource/doc/tuicallkit/{flutter/api_TUICallObserver.md → faq/flutter_sdk/call-observer-api.md} +0 -0
  29. /package/resource/doc/tuicallkit/{flutter/api_TUICallKit.md → faq/flutter_sdk/callkit-api.md} +0 -0
  30. /package/resource/doc/tuicallkit/{iOS/api_TUICallObserver.md → faq/ios_sdk/call-observer-api.md} +0 -0
  31. /package/resource/doc/tuicallkit/{iOS/api_TUICallKit.md → faq/ios_sdk/callkit-api.md} +0 -0
  32. /package/resource/doc/tuicallkit/flutter/{how_to_integrated_flutter_callkit.md → integration.md} +0 -0
  33. /package/resource/doc/tuicallkit/iOS/{how_to_integrated_iOS_callkit.md → integration.md} +0 -0
package/index.js CHANGED
@@ -5,10 +5,10 @@ import { ServerConfig } from './server-config.js';
5
5
  // 启动服务器
6
6
  async function main() {
7
7
  ServerConfig.getInstance();
8
- const { SDKAppID } = ServerConfig.getInstance().getConfig();
9
- if (isNaN(SDKAppID)) {
10
- throw new Error('You have not configured the SDKAppID, or the configured SDKAppID is invalid. Please configure the correct SDKAppID through the `env` parameter in MCP.');
11
- }
8
+ // const { SDKAppID } = ServerConfig.getInstance().getConfig();
9
+ // if (isNaN(SDKAppID)) {
10
+ // throw new Error('You have not configured the SDKAppID, or the configured SDKAppID is invalid. Please configure the correct SDKAppID through the `env` parameter in MCP.');
11
+ // }
12
12
  const server = createServer();
13
13
  const transport = new StdioServerTransport();
14
14
  await server.connect(transport);
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,QAAQ;AACR,KAAK,UAAU,IAAI;IACjB,YAAY,CAAC,WAAW,EAAE,CAAC;IAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC;IAC5D,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,wJAAwJ,CAAC,CAAC;IAC5K,CAAC;IACD,MAAM,MAAM,GAAc,YAAY,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC5D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,QAAQ;AACR,KAAK,UAAU,IAAI;IACjB,YAAY,CAAC,WAAW,EAAE,CAAC;IAC3B,+DAA+D;IAC/D,yBAAyB;IACzB,+KAA+K;IAC/K,IAAI;IACJ,MAAM,MAAM,GAAc,YAAY,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC5D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tencent-rtc/mcp",
3
- "version": "1.3.5",
3
+ "version": "1.3.7",
4
4
  "description": "Tencent Cloud MCP Server for SDK",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -0,0 +1,339 @@
1
+ `LiveAudienceStore` is a module in `AtomicXCore` specialized in managing live streaming room audience information. With `LiveAudienceStore`, you can build a complete audience list and management system for your live stream application.
2
+
3
+ ![](https://write-document-release-1258344699.cos.ap-guangzhou.tencentcos.cn/100032457995/3c4c7159f6dd11f0831c52540073fd3b.png)
4
+
5
+
6
+ ## Core Features
7
+ - **Real-time Audience List**: Get and show ALL audience information currently in the live streaming room.
8
+
9
+ - **Audience Statistics**: Get the accurate total number of audience in the live streaming room in real time.
10
+
11
+ - **Audience Dynamics Monitoring**: Perceive audience join and leave in real time through event subscription.
12
+
13
+ - **Administrator Permissions**: The Anchor can set a general audience as administrator or revoke their administrator privileges.
14
+
15
+ - **Room Management**: The Anchor or admin can kick out any general audience from the live streaming room.
16
+
17
+
18
+ ## Core Concepts
19
+
20
+ The following table introduces the core concepts of `LiveAudienceStore`:
21
+ <table>
22
+ <tr>
23
+ <td rowspan="1" colSpan="1" >**Core Concepts**</td>
24
+
25
+ <td rowspan="1" colSpan="1" >**Type**</td>
26
+
27
+ <td rowspan="1" colSpan="1" >**Core Responsibilities and Description**</td>
28
+ </tr>
29
+
30
+ <tr>
31
+ <td rowspan="1" colSpan="1" >[LiveUserInfo](https://tencent-rtc.github.io/TUIKit_Flutter/api_live_live_audience_store/LiveUserInfo-class.html)</td>
32
+
33
+ <td rowspan="1" colSpan="1" >`class`</td>
34
+
35
+ <td rowspan="1" colSpan="1" >Represents a foundation Information Model for an audience (user). It contains the user's unique identifier (`userID`), Nickname (`userName`) and profile photo url (`avatarURL`).</td>
36
+ </tr>
37
+
38
+ <tr>
39
+ <td rowspan="1" colSpan="1" >[LiveAudienceState](https://tencent-rtc.github.io/TUIKit_Flutter/api_live_live_audience_store/LiveAudienceState-class.html)</td>
40
+
41
+ <td rowspan="1" colSpan="1" >`class`</td>
42
+
43
+ <td rowspan="1" colSpan="1" >Represents the current status of the audience module. Its core attribute `audienceList` is a `ValueListenable<List<LiveUserInfo>>`, storing a snapshot of the audience list; `audienceCount` signifies the total number of current audience.</td>
44
+ </tr>
45
+
46
+ <tr>
47
+ <td rowspan="1" colSpan="1" >[LiveAudienceListener](https://tencent-rtc.github.io/TUIKit_Flutter/api_live_live_audience_store/LiveAudienceListener-class.html)</td>
48
+
49
+ <td rowspan="1" colSpan="1" >`class`</td>
50
+
51
+ <td rowspan="1" colSpan="1" >Represents a real-time event listener for audience dynamics. It includes two callbacks, `onAudienceJoined` (audience joined) and `onAudienceLeft` (audience left), used to incrementally update the audience list.</td>
52
+ </tr>
53
+
54
+ <tr>
55
+ <td rowspan="1" colSpan="1" >[LiveAudienceStore](https://tencent-rtc.github.io/TUIKit_Flutter/api_live_live_audience_store/LiveAudienceStore-class.html)</td>
56
+
57
+ <td rowspan="1" colSpan="1" >`class`</td>
58
+
59
+ <td rowspan="1" colSpan="1" >This is the core management class for interacting with the audience list function. Through it, you can obtain audience list snapshots, perform operation management, and receive real-time updates via `addLiveAudienceListener`.</td>
60
+ </tr>
61
+ </table>
62
+
63
+
64
+ ## Implementation Steps
65
+
66
+ ### Step 1: Component Integration
67
+ - **Live streaming**: Refer to [Quick Access](https://write.woa.com/document/200455640177692672) for seamless integration with **AtomicXCore** and service access.
68
+
69
+ - **Voice chat room**: Refer to [Quick Access](https://write.woa.com/document/200555778169073664) for integration with **AtomicXCore** and access completed.
70
+
71
+
72
+ ### Step 2: Initialize and Obtain Audience List
73
+
74
+ Retrieve a `LiveAudienceStore` instance bound to the current live streaming room liveId, actively pull the current audience list once for first-time show.
75
+
76
+ When exiting the live streaming room, you can reclaim resources by calling the `AudienceManager`'s `dispose` method.
77
+ ``` java
78
+ import 'package:atomic_x_core/atomicxcore.dart';
79
+
80
+ class AudienceManager {
81
+ final String liveId;
82
+ late final LiveAudienceStore audienceStore;
83
+ late LiveAudienceListener _audienceListener;
84
+ late final VoidCallback _audienceListChangedListener = _onAudienceListChanged;
85
+ late final VoidCallback _audienceCountChangedListener = _onAudienceCountChanged;
86
+
87
+ // Externally exposed [full] audience list
88
+ List<LiveUserInfo> audienceList = [];
89
+ // Externally exposed total audience count
90
+ int audienceCount = 0;
91
+
92
+ // Status change callback
93
+ Function()? onStateChanged;
94
+
95
+ AudienceManager({required this.liveId}) {
96
+ // 1. Retrieve an instance of LiveAudienceStore by liveId
97
+ audienceStore = LiveAudienceStore.create(liveId);
98
+
99
+ // 2. Subscribe to status and events
100
+ _subscribeToAudienceState();
101
+ _subscribeToAudienceEvents();
102
+
103
+ // 3. Actively pull first screen data
104
+ fetchInitialAudienceList();
105
+ }
106
+
107
+ /// Proactively retrieve an audience list snapshot once
108
+ Future<void> fetchInitialAudienceList() async {
109
+ final result = await audienceStore.fetchAudienceList();
110
+ if (result.isSuccess) {
111
+ print("First pull audience list successfully");
112
+ // Upon success, data will be auto-updated via the state subscription channel below
113
+ } else {
114
+ print("First pull audience list failed: ${result.errorMessage}");
115
+ }
116
+ }
117
+
118
+ void dispose() {
119
+ audienceStore.liveAudienceState.audienceList.removeListener(_audienceListChangedListener);
120
+ audienceStore.liveAudienceState.audienceCount.removeListener(_audienceCountChangedListener);
121
+ audienceStore.removeLiveAudienceListener(_audienceListener);
122
+ }
123
+ }
124
+ ```
125
+
126
+ The audience list and other `state` subscriptions will be explained in detail in the next step.
127
+
128
+ ### Step 3: Monitoring the Audience List Status and Real-Time Updates
129
+
130
+ Subscribe to `audienceStore`'s `liveAudienceState` and `LiveAudienceListener` to receive full list snapshots and real-time audience Enter/Exit Events, thereby driving UI updates.
131
+ ``` java
132
+ extension AudienceManagerSubscription on AudienceManager {
133
+ /// Subscribe to state to obtain the total count of audience and list snapshots
134
+ void _subscribeToAudienceState() {
135
+ // Listen to audience list adjustments
136
+ audienceStore.liveAudienceState.audienceList.addListener(_audienceListChangedListener);
137
+ // Listen to audience change rate
138
+ audienceStore.liveAudienceState.audienceCount.addListener(_audienceCountChangedListener);
139
+ }
140
+
141
+ void _onAudienceListChanged() {
142
+ // audienceList is a full snapshot
143
+ audienceList = audienceStore.liveAudienceState.audienceList.value;
144
+ onStateChanged?.call();
145
+ }
146
+
147
+ void _onAudienceCountChanged() {
148
+ // audienceCount is the real-time total count
149
+ audienceCount = audienceStore.liveAudienceState.audienceCount.value;
150
+ onStateChanged?.call();
151
+ }
152
+
153
+ /// Subscribe to events for processing real-time audience entry and exit
154
+ void _subscribeToAudienceEvents() {
155
+ _audienceListener = LiveAudienceListener(
156
+ onAudienceJoined: (audience) {
157
+ print("Audience ${audience.userName} joined the live streaming room");
158
+ // Incremental update: Add new audience at the end of the current list
159
+ if (!audienceList.any((a) => a.userID == audience.userID)) {
160
+ audienceList.add(audience);
161
+ onStateChanged?.call();
162
+ }
163
+ },
164
+ onAudienceLeft: (audience) {
165
+ print("Audience ${audience.userName} left the live streaming room");
166
+ // Incremental update: Remove leaving audience from the current list
167
+ audienceList.removeWhere((a) => a.userID == audience.userID);
168
+ onStateChanged?.call();
169
+ },
170
+ );
171
+ audienceStore.addLiveAudienceListener(_audienceListener);
172
+ }
173
+ }
174
+ ```
175
+
176
+ ### Step 4: Manage Audience (Remove User and Set Administrator)
177
+
178
+ As an Anchor or admin, perform management operations on the audience in the live streaming room.
179
+
180
+ #### 4.1 Kick Out Audience From Live Streaming Room
181
+
182
+ Call the `kickUserOutOfRoom` API to remove designated users from the live streaming room.
183
+ ``` java
184
+ extension AudienceManagerActions on AudienceManager {
185
+ Future<void> kick(String userId) async {
186
+ final result = await audienceStore.kickUserOutOfRoom(userId);
187
+ if (result.isSuccess) {
188
+ print("Successfully kicked user $userId out of room");
189
+ // Upon success, you will receive the onAudienceLeft event
190
+ } else {
191
+ print("Failed to kick out user $userId: ${result.errorMessage}");
192
+ }
193
+ }
194
+ }
195
+ ```
196
+
197
+ #### 4.2 Set/Revoke Admin
198
+
199
+ Use the `setAdministrator` and `revokeAdministrator` APIs to manage user administrator privileges.
200
+ ``` java
201
+ extension AudienceManagerAdmin on AudienceManager {
202
+ /// Set the user as administrator
203
+ Future<void> promoteToAdmin(String userId) async {
204
+ final result = await audienceStore.setAdministrator(userId);
205
+ if (result.isSuccess) {
206
+ print("Successfully set user $userId as administrator");
207
+ }
208
+ }
209
+
210
+ /// Revoke the user's administrator privileges
211
+ Future<void> revokeAdmin(String userId) async {
212
+ final result = await audienceStore.revokeAdministrator(userId);
213
+ if (result.isSuccess) {
214
+ print("Successfully revoked user $userId's administrator privileges");
215
+ }
216
+ }
217
+ }
218
+ ```
219
+
220
+ ## Advanced Features
221
+
222
+ ### Show the Welcome Message in the Bullet Screen Area
223
+
224
+ When a new audience enters the live room, the bullet screen/chat area will automatically display a welcome message locally, such as "Welcome [user nickname] to the live room."
225
+
226
+ #### Implementation Method
227
+
228
+ We subscribe to the audience join event (`onAudienceJoined`) of `LiveAudienceStore` to get real-time notifications of new audience joins. Once the event is triggered, we extract the nickname information of the new audience, then immediately call the local insert API `appendLocalTip` of `BarrageStore`.
229
+
230
+ When exiting the live streaming room, you can reclaim resources by calling the `LiveRoomManager`'s `dispose` method.
231
+ ``` java
232
+ import 'package:atomic_x_core/atomicxcore.dart';
233
+
234
+ class LiveRoomManager {
235
+ final String liveId;
236
+ late LiveAudienceListener _welcomeListener;
237
+
238
+ LiveRoomManager({required this.liveId}) {
239
+ _setupWelcomeMessageFlow();
240
+ }
241
+
242
+ void _setupWelcomeMessageFlow() {
243
+ // 1. Retrieve an instance of LiveAudienceStore
244
+ final audienceStore = LiveAudienceStore.create(liveId);
245
+
246
+ // 2. Retrieve an instance of BarrageStore (thanks to the internal mechanism, this will be the same instance)
247
+ final barrageStore = BarrageStore.create(liveId);
248
+
249
+ // 3. Subscribe to audience events
250
+ _welcomeListener = LiveAudienceListener(
251
+ onAudienceJoined: (audience) {
252
+ // 4. Create a local Prompt message
253
+ final welcomeTip = Barrage(
254
+ messageType: BarrageType.text,
255
+ textContent: "Welcome ${audience.userName} to the live streaming room."
256
+ );
257
+
258
+ // 5. Call the BarrageStore API to insert it into the bullet screen list
259
+ barrageStore.appendLocalTip(welcomeTip);
260
+ },
261
+ );
262
+ audienceStore.addLiveAudienceListener(_welcomeListener);
263
+ }
264
+
265
+ void dispose() {
266
+ final audienceStore = LiveAudienceStore.create(liveId);
267
+ audienceStore.removeLiveAudienceListener(_welcomeListener);
268
+ }
269
+ }
270
+ ```
271
+
272
+ ## API documentation
273
+
274
+ For details about ALL public interfaces, properties, and methods of [LiveAudienceStore](https://tencent-rtc.github.io/TUIKit_Flutter/api_live_live_audience_store/LiveAudienceStore-class.html) and its related classes, refer to the official API documentation of the [AtomicXCore](https://tencent-rtc.github.io/TUIKit_Flutter/index.html) framework. The related Store used in this document is as follows:
275
+ <table>
276
+ <tr>
277
+ <td rowspan="1" colSpan="1" >**Store/Component**</td>
278
+
279
+ <td rowspan="1" colSpan="1" >**Feature Description**</td>
280
+
281
+ <td rowspan="1" colSpan="1" >**API Reference**</td>
282
+ </tr>
283
+
284
+ <tr>
285
+ <td rowspan="1" colSpan="1" >**LiveCoreWidget**</td>
286
+
287
+ <td rowspan="1" colSpan="1" >The core view component for live video stream display and interaction: responsible for stream rendering and view widget processing, supporting live streaming, audience co-broadcasting, cross-room connection with other anchors, and other scenarios.</td>
288
+
289
+ <td rowspan="1" colSpan="1" >[API documentation](https://tencent-rtc.github.io/TUIKit_Flutter/api_view_live_live_core_widget/LiveCoreWidget-class.html)</td>
290
+ </tr>
291
+
292
+ <tr>
293
+ <td rowspan="1" colSpan="1" >**LiveCoreController**</td>
294
+
295
+ <td rowspan="1" colSpan="1" >LiveCoreWidget controller: used to set up live streaming ID, control preview, and perform other operations.</td>
296
+
297
+ <td rowspan="1" colSpan="1" >[API documentation](https://tencent-rtc.github.io/TUIKit_Flutter/api_view_live_live_core_widget/LiveCoreController-class.html)</td>
298
+ </tr>
299
+
300
+ <tr>
301
+ <td rowspan="1" colSpan="1" >**LiveAudienceStore**</td>
302
+
303
+ <td rowspan="1" colSpan="1" >Audience management: get real-time audience list (ID/name/avatar), check audience size, listen to Enter/Exit Event.</td>
304
+
305
+ <td rowspan="1" colSpan="1" >[API documentation](https://tencent-rtc.github.io/TUIKit_Flutter/api_live_live_audience_store/LiveAudienceStore-class.html)</td>
306
+ </tr>
307
+
308
+ <tr>
309
+ <td rowspan="1" colSpan="1" >**BarrageStore**</td>
310
+
311
+ <td rowspan="1" colSpan="1" >Danmaku function: send text/custom barrage item, maintain bullet screen list, monitor in real time.</td>
312
+
313
+ <td rowspan="1" colSpan="1" >[API documentation](https://tencent-rtc.github.io/TUIKit_Flutter/api_barrage_barrage_store/api_barrage_barrage_store-library.html)</td>
314
+ </tr>
315
+ </table>
316
+
317
+
318
+ ## FAQs
319
+
320
+ ### `LiveAudienceState` How Is the Number of Online Users (`AudienceCount`) Updated? What Is the Timing and How Often?
321
+
322
+ `audienceCount` update is not always real-time. The mechanism is as follows:
323
+ - **Proactive enter and exit rooms**: When users proactively join or normally exit live streaming room, the change notification of number of online users will immediate trigger. You will soon observe the changes of `audienceCount` in `LiveAudienceState`.
324
+
325
+ - **Unexpected disconnection**: When a user unexpectedly disconnects due to network issue, application crash, etc., the system needs to determine their actual status through heartbeat mechanism. Only when the user has no heartbeat for 90 consecutive seconds will the system deem them offline and trigger the change notification of number of users.
326
+
327
+ - **Update mechanism and frequency control:**
328
+
329
+ - Whether it is immediate trigger or delay trigger, all change notifications of number of users are broadcast in the room in the form of messages.
330
+
331
+ - The message total inside the room has a capacity limit per second, with a single room message frequency control of **40 messages per second**.
332
+
333
+ - **Key points:** In scenarios with extremely high message traffic such as "bullet screen storm" or gift spam, if the message rate inside the room exceeds the threshold of 40 messages per second, to ensure the delivery of core messages (for example, bullet screen), **messages of number of users change may be dropped by the frequency control policy**.
334
+
335
+
336
+ **What does this mean for developers?**
337
+
338
+
339
+ `audienceCount` is a **high-precision estimate** very close to real time, but under extreme high concurrency scenarios, it may have brief delay or data loss. Therefore, we recommend that you use it for **UI display** and should not take it as the only basis for scenarios requiring absolute accuracy such as billing or statistics.