@tencentcloud/sdk-mcp 1.6.8 → 1.7.0

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 (98) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +54 -35
  3. package/knowledge/build-index.js +28 -4
  4. package/knowledge/chunker.js +82 -14
  5. package/knowledge/chunking-policy.js +100 -0
  6. package/knowledge/frontmatter-meta.js +167 -0
  7. package/knowledge/path-meta.js +28 -6
  8. package/knowledge/search/exact-lookup.js +26 -123
  9. package/knowledge/search/filter-pool.js +12 -29
  10. package/knowledge/search/framework-fallback.js +22 -0
  11. package/knowledge/search/intent-router.js +13 -0
  12. package/knowledge/search/query-normalizer.js +56 -3
  13. package/knowledge/search/search-core.js +391 -0
  14. package/knowledge/search/search-knowledge.js +290 -361
  15. package/knowledge/search/search-message.js +87 -0
  16. package/knowledge/search/search-pass.js +428 -0
  17. package/knowledge/search/search-types.js +1 -0
  18. package/knowledge/search/url-row-scorer.js +258 -0
  19. package/package.json +1 -1
  20. package/resource/index/manifest.json +1 -1
  21. package/resource/integration/callkit/preset/ios/integration.md +1 -0
  22. package/resource/integration/chat/preset/flutter/integration.md +1 -0
  23. package/resource/integration/livekit/preset/live/vue/live-player-desk-integration.md +11 -9
  24. package/resource/integration/livekit/preset/live/vue/live-pusher-integration.md +11 -11
  25. package/resource/knowledge/callkit/best-practice/callkit-miniprogram/uniapp-shrink.md +64 -0
  26. package/resource/knowledge/callkit/best-practice/common/call-autoplay-blocked.md +81 -0
  27. package/resource/knowledge/callkit/best-practice/common/call-message-in-chat.md +84 -0
  28. package/resource/knowledge/callkit/best-practice/common/call-vs-calls.md +114 -0
  29. package/resource/knowledge/callkit/best-practice/common/callengine-call-flow.md +128 -0
  30. package/resource/knowledge/callkit/best-practice/common/callengine-log-level.md +72 -0
  31. package/resource/knowledge/callkit/best-practice/common/callkit-get-engine-instance.md +87 -0
  32. package/resource/knowledge/callkit/best-practice/common/callkit-get-roomid.md +83 -0
  33. package/resource/knowledge/callkit/best-practice/common/callkit-limitations.md +37 -0
  34. package/resource/knowledge/callkit/best-practice/common/callkit-user-register-and-kicked.md +103 -0
  35. package/resource/knowledge/callkit/preset/react/api.md +1 -150
  36. package/resource/knowledge/callkit/preset/vue/api.md +1 -38
  37. package/resource/knowledge/chat/best-practice/common/avchatroom-message-loss-diagnosis.md +71 -0
  38. package/resource/knowledge/chat/best-practice/common/group-conversation-cleanup-on-system-notice.md +67 -0
  39. package/resource/knowledge/chat/best-practice/common/image-message-url-lifecycle.md +63 -0
  40. package/resource/knowledge/chat/best-practice/common/login-repeat-2025-diagnosis.md +65 -0
  41. package/resource/knowledge/chat/best-practice/common/message-read-report-and-receipt.md +72 -0
  42. package/resource/knowledge/chat/best-practice/common/message-receive-event.md +70 -0
  43. package/resource/knowledge/chat/best-practice/common/message-risk-error-and-render.md +69 -0
  44. package/resource/knowledge/chat/best-practice/common/message-unread-count.md +71 -0
  45. package/resource/knowledge/chat/best-practice/miniprogram/audio-message-send.md +118 -0
  46. package/resource/knowledge/chat/best-practice/miniprogram/login-timeout-2801-diagnosis.md +67 -0
  47. package/resource/knowledge/chat/best-practice/miniprogram/media-upload-fail-diagnosis.md +68 -0
  48. package/resource/knowledge/chat/best-practice/web/audio-message-send.md +123 -0
  49. package/resource/knowledge/chat/preset/android/features/conversation-list.md +1 -0
  50. package/resource/knowledge/chat/preset/android/features/language.md +1 -0
  51. package/resource/knowledge/chat/preset/android/features/message-input.md +1 -0
  52. package/resource/knowledge/chat/preset/android/features/message-list.md +1 -0
  53. package/resource/knowledge/chat/preset/flutter/features/conversation-list.md +1 -0
  54. package/resource/knowledge/chat/preset/flutter/features/message-input.md +1 -0
  55. package/resource/knowledge/chat/preset/flutter/features/message-list.md +1 -0
  56. package/resource/knowledge/chat/preset/ios/features/conversation-list.md +1 -0
  57. package/resource/knowledge/chat/preset/ios/features/message-input.md +1 -0
  58. package/resource/knowledge/chat/preset/ios/features/message-list.md +1 -0
  59. package/resource/knowledge/chat/preset/react/features/conversation-preview.md +1 -0
  60. package/resource/knowledge/chat/urls/sdk/web.md +1 -1
  61. package/resource/knowledge/livekit/best-practice/android/voice-room-anchor-start.md +124 -0
  62. package/resource/knowledge/livekit/best-practice/common/admin-take-seat.md +73 -0
  63. package/resource/knowledge/livekit/best-practice/common/audience-leave-live.md +81 -0
  64. package/resource/knowledge/livekit/best-practice/common/voice-room-no-audio-troubleshoot.md +100 -0
  65. package/resource/knowledge/livekit/best-practice/common/voice-room-seat-list-change.md +65 -0
  66. package/resource/knowledge/livekit/best-practice/flutter/voice-room-anchor-start.md +126 -0
  67. package/resource/knowledge/livekit/best-practice/ios/voice-room-anchor-start.md +130 -0
  68. package/resource/knowledge/push/config/react-native.md +1 -0
  69. package/resource/knowledge/push/config/unity.md +1 -0
  70. package/resource/knowledge/push/config/unreal-engine.md +1 -0
  71. package/resource/knowledge/push/integration/android.md +16 -16
  72. package/resource/knowledge/push/integration/flutter.md +3 -3
  73. package/resource/knowledge/push/integration/ios.md +3 -3
  74. package/resource/knowledge/push/integration/react-native.md +1 -1
  75. package/resource/knowledge/roomkit/best-practice/common/room-ghost-member.md +75 -0
  76. package/resource/knowledge/roomkit/best-practice/common/room-limit-and-multi.md +88 -0
  77. package/resource/knowledge/roomkit/best-practice/common/room-screen-share-preview.md +87 -0
  78. package/resource/knowledge/roomkit/best-practice/common/room-status-after-all-leave.md +73 -0
  79. package/resource/knowledge/roomkit/best-practice/vue/room-uikit-vs-atomicx.md +115 -0
  80. package/resource/knowledge/rtcengine/web/plugin/30-advanced-cross-room-link.md +2 -0
  81. package/resource/knowledge/rtcengine/web/plugin/39-advanced-video-decoder.md +2 -0
  82. package/server.js +8 -3
  83. package/tools/common/finalize_answer.js +9 -1
  84. package/tools/common/search_trtc_knowledge.js +1 -1
  85. package/tools/definitions/finalize_answer_def.js +2 -2
  86. package/tools/definitions/integration-boundary.js +2 -1
  87. package/tools/definitions/search_trtc_knowledge_def.js +1 -1
  88. package/utils/report-cls-client.js +1 -1
  89. package/utils/report-es-client.js +1 -1
  90. package/cursor-setting.png +0 -0
  91. package/mcp-server-prompt.png +0 -0
  92. package/resource/knowledge/callkit/best-practice/web/callengine-invitation.md +0 -80
  93. package/resource/knowledge/callkit/best-practice/web/callengine-log-control.md +0 -20
  94. package/resource/knowledge/callkit/best-practice/web/callkit-call-vs-calls.md +0 -116
  95. package/resource/knowledge/callkit/preset/react/uikit-api-reference.md +0 -469
  96. package/resource/knowledge/callkit/preset/vue/uikit-api-reference.md +0 -581
  97. package/resource/knowledge/callkit/preset/web/api.md +0 -79
  98. package/resource/knowledge/chat/best-practice/web/image-message-url-handling.md +0 -16
@@ -0,0 +1,118 @@
1
+ ---
2
+ title: 小程序集成 IM SDK 发送语音消息标准方案
3
+ product: chat
4
+ frameworks: [miniprogram]
5
+ scope: platform_specific
6
+ tags: [audio, voice, recorderManager, createAudioMessage, sendMessage, aac, miniprogram]
7
+ version_range: ">=3.0.0"
8
+ ---
9
+
10
+ # 小程序集成 IM SDK 发送语音消息标准方案
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 小程序侧应使用微信官方 `RecorderManager` 进行录音,再在 `onStop` 回调中调用 `createAudioMessage` 创建语音消息。
15
+ - 消息创建后通过 `sendMessage` 发送,发送结果以 Promise 成功/失败回调为准。
16
+ - 音频格式使用 `aac` 可实现 IM 全平台(Android、iOS、小程序、Web)互通。
17
+ - 录音参数需显式配置 `duration`、`sampleRate`、`numberOfChannels`、`encodeBitRate`、`format`,并监听 `onError` 处理录音异常。
18
+
19
+ ## 2. 字段语义对照
20
+
21
+ | 字段/能力 | 作用 | 说明 |
22
+ |---|---|---|
23
+ | `wx.getRecorderManager()` | 录音入口 | 获取全局唯一录音管理器实例 |
24
+ | `recordOptions.format` | 音频格式控制 | 设置为 `aac` 可满足跨平台互通 |
25
+ | `recorderManager.onStop(res)` | 录音结果回调 | 在回调中使用 `res` 创建语音消息 |
26
+ | `chat.createAudioMessage({...})` | 创建消息实例 | 生成可上屏、可发送的语音消息对象 |
27
+ | `chat.sendMessage(message)` | 发送消息 | 返回 Promise,`then` 成功、`catch` 失败 |
28
+
29
+ ## 3. 机制/时序
30
+
31
+ 初始化 `RecorderManager` -> 配置录音参数 -> 开始录音 -> 监听 `onStop` 获取录音结果 -> 调用 `createAudioMessage` 创建语音消息 -> 调用 `sendMessage` 发送 -> 根据发送结果更新 UI 与日志。
32
+
33
+ ## 4. 标准用法
34
+
35
+ 1. 获取录音管理器并配置录音参数,`format` 使用 `aac`。
36
+ 2. 注册 `onError` 和 `onStop` 回调;在 `onStop` 中基于录音结果创建语音消息。
37
+ 3. 调用 `sendMessage` 发送语音消息并处理成功/失败回调。
38
+ 4. 将消息实例上屏,并在失败时提示重试。
39
+
40
+ ```javascript
41
+ // 示例:使用微信官方的 RecorderManager 进行录音
42
+ // 参考 https://developers.weixin.qq.com/minigame/dev/api/media/recorder/RecorderManager.start.html
43
+ // 1. 获取全局唯一的录音管理器 RecorderManager
44
+ const recorderManager = wx.getRecorderManager();
45
+
46
+ // 录音部分参数
47
+ const recordOptions = {
48
+ duration: 60000, // 录音的时长,单位 ms,最大值 600000(10 分钟)
49
+ sampleRate: 44100, // 采样率
50
+ numberOfChannels: 1, // 录音通道数
51
+ encodeBitRate: 192000, // 编码码率
52
+ format: 'aac' // 音频格式,选择此格式创建的音频消息可以在 IM 全平台互通
53
+ };
54
+
55
+ // 2.1 监听录音错误事件
56
+ recorderManager.onError(function(errMsg) {
57
+ console.warn('recorder error:', errMsg);
58
+ });
59
+
60
+ // 2.2 监听录音结束事件,录音结束后创建并发送音频消息
61
+ recorderManager.onStop(function(res) {
62
+ console.log('recorder stop', res);
63
+
64
+ // 4. 创建消息实例,接口返回的实例可以上屏
65
+ const message = chat.createAudioMessage({
66
+ to: 'user1',
67
+ conversationType: TencentCloudChat.TYPES.CONV_C2C,
68
+ // 消息优先级,用于群聊
69
+ // priority: TencentCloudChat.TYPES.MSG_PRIORITY_NORMAL,
70
+ payload: {
71
+ file: res
72
+ },
73
+ // 消息自定义数据(云端保存,会发送到对端,程序卸载重装后还能拉取到)
74
+ // cloudCustomData: 'your cloud custom data'
75
+ });
76
+
77
+ // 5. 发送消息
78
+ chat.sendMessage(message).then(function(imResponse) {
79
+ // 发送成功
80
+ console.log(imResponse);
81
+ }).catch(function(imError) {
82
+ // 发送失败
83
+ console.warn('sendMessage error:', imError);
84
+ });
85
+ });
86
+
87
+ // 3. 开始录音
88
+ recorderManager.start(recordOptions);
89
+ ```
90
+
91
+ ## 5. 结果判定
92
+
93
+ - 录音结束后能稳定触发 `onStop`,并成功创建语音消息实例。
94
+ - 发送成功时,`sendMessage` Promise 进入 `then`,消息可正常上屏。
95
+ - Android、iOS、小程序、Web 端均可播放该语音消息(`aac` 格式)。
96
+ - 录音异常时,`onError` 有明确日志,且不出现静默失败。
97
+
98
+ ## 6. 常见误区
99
+
100
+ - 误区 1:未在 `onStop` 回调中创建消息,导致发送时没有有效语音文件。
101
+ - 误区 2:音频格式未使用 `aac`,导致跨平台互通受限。
102
+ - 误区 3:只调用 `createAudioMessage` 不调用 `sendMessage`,误以为消息已发送。
103
+
104
+ ## 7. 问题定义(检索辅助,极简)
105
+
106
+ 小程序集成 IM SDK 时,如何完成语音录制、创建语音消息并发送,且保证跨端可互通。
107
+
108
+ ## 8. 同义问法覆盖(检索召回,极简)
109
+
110
+ - 小程序 IM SDK 怎么发送语音消息?
111
+ - 小程序录音后如何用 `createAudioMessage` 发消息?
112
+ - `RecorderManager` 录音结果怎么接入 IM 发送?
113
+ - 语音消息用什么格式可以和 Android/iOS/Web 互通?
114
+
115
+ ## 9. 参考来源(可选)
116
+
117
+ - 微信小程序录音能力(RecorderManager.start):`https://developers.weixin.qq.com/minigame/dev/api/media/recorder/RecorderManager.start.html`
118
+ - Chat SDK 音频消息文档:`https://web.sdk.qcloud.com/im/doc/v3/zh-cn/SDK.html#createAudioMessage`
@@ -0,0 +1,67 @@
1
+ ---
2
+ title: 小程序集成 IM SDK 登录超时 2801 排查与修复
3
+ product: chat
4
+ frameworks: [miniprogram]
5
+ scope: platform_specific
6
+ tags: [login, timeout, 2801, websocket, 域名白名单, 调试模式, ipv6]
7
+ version_range: ">=3.0.0"
8
+ ---
9
+
10
+ # 小程序集成 IM SDK 登录超时 2801 排查与修复
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 该场景的首要排查项是小程序管理后台 `websocket` 域名白名单配置是否完整。
15
+ - 开发版与体验版/正式版校验策略不同,开发版登录正常不等于白名单配置正确。
16
+ - 体验版可开启调试模式验证:调试模式会绕过域名白名单校验,可用于快速定位问题是否由白名单导致。
17
+ - 独立域名 `wss://${SDKAppID}w4c.my-imcloud.com` 需要 SDK `v3.4.6` 及以上版本支持。
18
+ - IPv6 域名 `wss://wssv6.im.qcloud.com` 需要 SDK `v3.4.9` 及以上版本支持。
19
+
20
+ ## 2. 字段语义对照
21
+
22
+ | 字段/能力 | 作用 | 说明 |
23
+ |---|---|---|
24
+ | 错误码 `2801` | 登录超时信号 | 在体验版/正式版出现时,优先排查网络连通与域名白名单 |
25
+ | `websocket` 域名白名单 | 连接准入控制 | 未完整加白会导致非开发版连接失败或超时 |
26
+ | 体验版调试模式 | 定位手段 | 可绕过域名白名单校验,用于验证是否白名单导致 |
27
+ | `wss://${SDKAppID}w4c.my-imcloud.com` | 独立域名 | SDK `v3.4.6+` 支持 |
28
+ | `wss://wssv6.im.qcloud.com` | IPv6 域名 | SDK `v3.4.9+` 支持 |
29
+
30
+ ## 3. 机制/时序
31
+
32
+ 开发版可登录 -> 体验版/正式版登录超时(2801)-> 检查小程序管理后台 `websocket` 域名白名单 -> 开启体验版调试模式复测 -> 若调试模式恢复正常,则确认为白名单配置问题。
33
+
34
+ ## 4. 标准用法
35
+
36
+ 1. 登录小程序管理后台,检查 `websocket` 域名白名单是否已完整配置。参考文档:`https://cloud.tencent.com/document/product/269/117335`。
37
+ 2. 在体验版开启调试模式并复测登录。
38
+ 3. 若开启调试模式后登录恢复正常,按白名单规范补齐/修正 `websocket` 域名配置。
39
+ 4. 使用体验版与正式版再次验证登录链路,确认 2801 消失。
40
+
41
+ ## 5. 结果判定
42
+
43
+ - 体验版关闭调试模式后,仍可稳定登录。
44
+ - 正式版登录不再出现 2801 超时。
45
+ - 小程序后台 `websocket` 域名白名单与当前接入域名完全一致。
46
+ - 若使用独立域名或 IPv6 域名,SDK 版本分别满足 `v3.4.6+` / `v3.4.9+`。
47
+
48
+ ## 6. 常见误区
49
+
50
+ - 误区 1:开发版登录正常,就认为域名白名单已经配置正确。
51
+ - 误区 2:只在调试模式下验证通过,就直接发布正式版。
52
+ - 误区 3:使用独立域名或 IPv6 域名时忽略 SDK 最低版本要求。
53
+
54
+ ## 7. 问题定义(检索辅助,极简)
55
+
56
+ 小程序集成 IM SDK 时,开发版登录正常,但体验版和正式版登录超时(2801)。
57
+
58
+ ## 8. 同义问法覆盖(检索召回,极简)
59
+
60
+ - 体验版小程序 IM 登录 2801 怎么处理?
61
+ - 为什么开发版能登,体验版和正式版超时?
62
+ - 体验版登录超时是否和 websocket 域名白名单有关?
63
+ - 小程序后台 websocket 没加白会导致 IM 登录失败吗?
64
+
65
+ ## 9. 参考来源(可选)
66
+
67
+ - 小程序 websocket 域名配置说明:`https://cloud.tencent.com/document/product/269/117335`
@@ -0,0 +1,68 @@
1
+ ---
2
+ title: 小程序集成 IM SDK 富媒体消息上传失败排查与修复(图片/视频/语音/文件)
3
+ product: chat
4
+ frameworks: [miniprogram]
5
+ scope: platform_specific
6
+ tags: [upload, media, image, video, audio, file, uploadFile, 域名白名单, 调试模式, COS 独立域名]
7
+ version_range: ">=3.0.0"
8
+ ---
9
+
10
+ # 小程序集成 IM SDK 媒体上传失败排查与修复(图片/视频/语音/文件)
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 该场景的首要排查项是小程序管理后台 `uploadFile` 域名白名单配置是否完整。
15
+ - 开发版与体验版/正式版校验策略不同,开发版上传正常不等于白名单配置正确。
16
+ - 体验版可开启调试模式验证:调试模式会绕过域名白名单校验,可用于快速定位问题是否由 `uploadFile` 域名配置导致。
17
+ - 从 2024-09-10 起,新增应用默认分配 COS 独立域名 `https://${SDKAppID}-cn.rich.my-imcloud.com`。
18
+ - 使用 COS 独立域名时,必须将对应域名加入小程序 `uploadFile` 合法域名白名单。
19
+
20
+ ## 2. 字段语义对照
21
+
22
+ | 字段/能力 | 作用 | 说明 |
23
+ |---|---|---|
24
+ | `uploadFile` 域名白名单 | 上传通道准入控制 | 未完整加白会导致体验版/正式版上传失败 |
25
+ | 体验版调试模式 | 定位手段 | 可绕过域名白名单校验,用于验证是否白名单导致 |
26
+ | `https://${SDKAppID}-cn.rich.my-imcloud.com` | COS 独立域名 | 新增应用默认分配,需加入 `uploadFile` 白名单 |
27
+ | 媒体消息类型(图片/视频/语音/文件) | 影响范围 | 上传能力共用 `uploadFile` 链路,均受白名单配置影响 |
28
+
29
+ ## 3. 机制/时序
30
+
31
+ 开发版上传正常 -> 体验版/正式版上传失败 -> 检查小程序管理后台 `uploadFile` 域名白名单 -> 开启体验版调试模式复测 -> 若调试模式恢复正常,则确认为白名单配置问题。
32
+
33
+ ## 4. 标准用法
34
+
35
+ 1. 登录小程序管理后台,检查 `uploadFile` 合法域名是否已完整配置。参考文档:`https://cloud.tencent.com/document/product/269/117335`。
36
+ 2. 核对并加入当前应用实际使用的上传域名,重点确认 COS 独立域名 `https://${SDKAppID}-cn.rich.my-imcloud.com` 是否已加白。
37
+ 3. 在体验版开启调试模式并复测图片/视频/语音/文件上传。
38
+ 4. 若开启调试模式后上传恢复正常,按白名单规范补齐/修正 `uploadFile` 域名配置。
39
+ 5. 关闭调试模式后,使用体验版与正式版再次验证上传链路。
40
+
41
+ ## 5. 结果判定
42
+
43
+ - 体验版关闭调试模式后,图片/视频/语音/文件上传均成功。
44
+ - 正式版上传链路稳定,无上传失败。
45
+ - 小程序后台 `uploadFile` 域名白名单与当前接入域名完全一致。
46
+ - COS 独立域名 `https://${SDKAppID}-cn.rich.my-imcloud.com` 已加入白名单(适用新增应用)。
47
+
48
+ ## 6. 常见误区
49
+
50
+ - 误区 1:开发版上传正常,就认为域名白名单已经配置正确。
51
+ - 误区 2:只在调试模式下验证通过,就直接发布正式版。
52
+ - 误区 3:只检查 `request` 或 `websocket` 白名单,忽略 `uploadFile` 白名单。
53
+ - 误区 4:新增应用启用 COS 独立域名后,未同步更新 `uploadFile` 白名单。
54
+
55
+ ## 7. 问题定义(检索辅助,极简)
56
+
57
+ 小程序集成 IM SDK 时,开发版图片/视频/语音/文件上传正常,但体验版和正式版上传失败。
58
+
59
+ ## 8. 同义问法覆盖(检索召回,极简)
60
+
61
+ - 小程序 IM 上传图片在体验版失败怎么处理?
62
+ - 为什么开发版能上传,体验版和正式版上传失败?
63
+ - 小程序 `uploadFile` 域名白名单没配置会导致 IM 上传失败吗?
64
+ - 体验版开启调试模式后上传恢复正常,说明什么问题?
65
+
66
+ ## 9. 参考来源(可选)
67
+
68
+ - 小程序合法域名配置说明:`https://cloud.tencent.com/document/product/269/117335`
@@ -0,0 +1,123 @@
1
+ ---
2
+ title: Web(PC/H5)集成 IM SDK 发送语音消息标准方案
3
+ product: chat
4
+ frameworks: [web]
5
+ scope: platform_specific
6
+ tags: [audio, voice, createAudioMessage, sendMessage, Recorder, js-audio-recorder, h5, pc]
7
+ version_range: ">=3.0.0"
8
+ ---
9
+
10
+ # Web(PC/H5)集成 IM SDK 发送语音消息标准方案
11
+
12
+ ## 1. 核心结论
13
+
14
+ - Web 端可使用第三方录音库(如 `js-audio-recorder`)完成录音,再将录音结果转换为 `File` 后调用 `createAudioMessage`。
15
+ - `audioFile` 必须带上 `uri` 字段(`audioFile.uri = window.URL.createObjectURL(audioFile)`),否则语音消息创建与发送链路不完整。
16
+ - 消息创建后通过 `sendMessage` 发送,发送结果以 Promise 成功/失败回调为准。
17
+ - 建议在 `createAudioMessage` 中传入 `onProgress` 回调,实时观测音频上传进度。
18
+
19
+ ## 2. 字段语义对照
20
+
21
+ | 字段/能力 | 作用 | 说明 |
22
+ |---|---|---|
23
+ | `Recorder` | 录音能力 | 在浏览器侧采集语音数据 |
24
+ | `recorder.getWAVBlob()` | 导出录音数据 | 获取 WAV 二进制数据用于后续构造 `File` |
25
+ | `audioFile.uri` | 本地可访问地址 | 必填字段,使用 `window.URL.createObjectURL(audioFile)` 生成 |
26
+ | `chat.createAudioMessage({...})` | 创建语音消息实例 | 生成可上屏、可发送的语音消息对象 |
27
+ | `chat.sendMessage(message)` | 发送消息 | 返回 Promise,`then` 成功、`catch` 失败 |
28
+ | `onProgress` | 上传进度回调 | 观测语音文件上传过程 |
29
+
30
+ ## 3. 机制/时序
31
+
32
+ 开始录音 -> 停止录音 -> 计算时长并获取 WAV Blob -> 转换为 `File` 并补充 `uri` 与 `duration` -> 调用 `createAudioMessage` 创建语音消息 -> 调用 `sendMessage` 发送 -> 根据发送结果更新 UI 与日志。
33
+
34
+ ## 4. 标准用法
35
+
36
+ 1. 使用录音器开始录音并记录起始时间。
37
+ 2. 结束录音后计算时长,获取 `WAV Blob`。
38
+ 3. 将 `Blob` 转为 `File`,并补齐 `audioFile.uri`、`audioFile.duration`。
39
+ 4. 调用 `createAudioMessage` 创建语音消息,传入 `onProgress` 回调。
40
+ 5. 调用 `sendMessage` 发送语音消息,处理成功与失败分支。
41
+
42
+ ```javascript
43
+ // 在 Web 端创建语音消息并发送
44
+ // 示例:使用第三方库 js-audio-recorder 录制音频
45
+
46
+ // 1. 开始录制
47
+ let recorder = new Recorder({
48
+ sampleBits: 16, // 采样位数,支持 8 或 16,默认 16
49
+ sampleRate: 16000, // 采样率
50
+ numChannels: 1 // 声道,支持 1 或 2,默认 1
51
+ });
52
+
53
+ let startTs;
54
+ recorder.start().then(() => {
55
+ // 开始录音,记录起始时间戳
56
+ startTs = Date.now();
57
+ }, (error) => {
58
+ // 出错了
59
+ console.log(`${error.name} : ${error.message}`);
60
+ });
61
+
62
+ // 2. 结束录制
63
+ recorder.stop();
64
+
65
+ // 3. 计算录音时长,获取 WAV 数据
66
+ let duration = Date.now() - startTs; // 单位:ms
67
+ let wavBlob = recorder.getWAVBlob();
68
+
69
+ // 4. blob 数据转成 File 对象
70
+ let audioFile = new File([wavBlob], 'hello.wav', { type: 'wav' });
71
+ audioFile.uri = window.URL.createObjectURL(audioFile);
72
+ audioFile.duration = duration;
73
+
74
+ // 5. 创建音频消息
75
+ let message = chat.createAudioMessage({
76
+ to: 'user1',
77
+ conversationType: 'C2C',
78
+ payload: {
79
+ file: audioFile
80
+ },
81
+ // 音频上传进度回调
82
+ onProgress: function(event) {
83
+ console.log('file uploading:', event);
84
+ }
85
+ });
86
+
87
+ // 6. 发送消息
88
+ chat.sendMessage(message).then(function(imResponse) {
89
+ // 发送成功
90
+ console.log(imResponse);
91
+ }).catch(function(imError) {
92
+ // 发送失败
93
+ console.warn('sendMessage error:', imError);
94
+ });
95
+ ```
96
+
97
+ ## 5. 结果判定
98
+
99
+ - 录音结束后可稳定获取 `wavBlob`,并成功构造 `audioFile`。
100
+ - `audioFile.uri` 已设置,`createAudioMessage` 可正常创建语音消息。
101
+ - `sendMessage` 成功进入 `then`,语音消息可上屏并可播放。
102
+ - 上传过程中能收到 `onProgress` 回调,失败时 `catch` 有明确错误日志。
103
+
104
+ ## 6. 常见误区
105
+
106
+ - 误区 1:未设置 `audioFile.uri`,直接发送导致消息链路异常。
107
+ - 误区 2:只创建消息不发送,误以为消息已投递。
108
+ - 误区 3:录音结束后未正确计算时长或封装文件,导致音频不可用。
109
+
110
+ ## 7. 问题定义(检索辅助,极简)
111
+
112
+ Web(PC/H5)集成 IM SDK 时,如何完成语音录制并稳定发送语音消息。
113
+
114
+ ## 8. 同义问法覆盖(检索召回,极简)
115
+
116
+ - Web IM SDK 怎么发送语音消息?
117
+ - PC/H5 录音后如何调用 `createAudioMessage`?
118
+ - `audioFile.uri` 为什么必须设置?
119
+
120
+ ## 9. 参考来源(可选)
121
+
122
+ - PC/H5 录音能力:`https://www.npmjs.com/package/js-audio-recorder`
123
+ - Chat SDK `createAudioMessage` 文档:`https://web.sdk.qcloud.com/im/doc/v3/zh-cn/SDK.html#createAudioMessage`
@@ -111,3 +111,4 @@ ConversationList() {
111
111
  > **注意:**
112
112
  > 局部配置的优先级大于全局配置。
113
113
  >
114
+
@@ -127,3 +127,4 @@ public class MyApplication extends Application {
127
127
  }
128
128
  }
129
129
  ```
130
+
@@ -129,3 +129,4 @@ MessageList(
129
129
  > **注意:**
130
130
  > 局部配置的优先级大于全局配置。
131
131
  >
132
+
@@ -117,3 +117,4 @@ Expanded(
117
117
  > **注意:**
118
118
  > 局部配置的优先级大于全局配置。
119
119
  >
120
+
@@ -44,3 +44,4 @@ MessageInput(
44
44
  ),
45
45
  ),
46
46
  ```
47
+
@@ -150,3 +150,4 @@ MessageList(
150
150
  > **注意:**
151
151
  > 局部配置的优先级大于全局配置。
152
152
  >
153
+
@@ -122,3 +122,4 @@ ConversationList(
122
122
  > **注意:**
123
123
  > 局部配置的优先级大于全局配置。
124
124
  >
125
+
@@ -59,3 +59,4 @@ MessageInput(
59
59
  )
60
60
  )
61
61
  ```
62
+
@@ -151,3 +151,4 @@ MessageList(
151
151
  > **注意:**
152
152
  > 局部配置的优先级大于全局配置。
153
153
  >
154
+
@@ -91,3 +91,4 @@ const App = () => {
91
91
  ```
92
92
 
93
93
  `ConversationListPreview` 定制后效果如下:
94
+
@@ -23,7 +23,7 @@
23
23
  | 文本消息(createTextMessage → sendMessage) | `https://cloud.tencent.com/document/product/269/75316` |
24
24
  | 群 @ 消息(createTextAtMessage → sendMessage) | `https://cloud.tencent.com/document/product/269/75316` |
25
25
  | 图片消息(createImageMessage → sendMessage) | `https://cloud.tencent.com/document/product/269/75316` |
26
- | 语音消息(createVoiceMessage → sendMessage) | `https://cloud.tencent.com/document/product/269/75316` |
26
+ | 语音消息(createAudioMessage → sendMessage) | `https://cloud.tencent.com/document/product/269/75316` |
27
27
  | 视频消息(createVideoMessage → sendMessage) | `https://cloud.tencent.com/document/product/269/75316` |
28
28
  | 文件消息(createFileMessage → sendMessage) | `https://cloud.tencent.com/document/product/269/75316` |
29
29
  | 自定义消息(createCustomMessage → sendMessage) | `https://cloud.tencent.com/document/product/269/75316` |
@@ -0,0 +1,124 @@
1
+ ---
2
+ title: 语聊房房主创建房间并开播推流(Android)
3
+ product: live
4
+ frameworks: [android]
5
+ scope: platform_specific
6
+ tags: [语聊房, 房主, 开播, 推流, createLive, openLocalMicrophone, muteMicrophone, unmuteMicrophone, LiveListStore, AudioSalon, keepOwnerOnSeat, seatMode, TakeSeatMode, Android]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # 语聊房房主创建房间并开播推流(Android)
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 语聊房开播流程:构造 `LiveInfo`(含 `liveID`、`seatTemplate`、`keepOwnerOnSeat`、`seatMode`),调用 `createLive` 创建房间;成功后调用 `openLocalMicrophone` 采集音频并发布推流,房间内用户即可听到主播声音。
15
+ - `liveID` 必填,直播间的唯一标识符。
16
+ - `keepOwnerOnSeat` 设为 `true` 时主播进房后自动上麦(上麦是推流的前提,只有上麦的用户才能在房间内推音频流)。
17
+ - `seatTemplate` 设为语聊房模板 `SeatLayoutTemplate.AudioSalon(n)`,n 为套餐支持的最大麦位数或小于该值的麦位数。
18
+ - `seatMode` 设置上麦模式(如 `TakeSeatMode.APPLY` 申请上麦)。
19
+ - `muteMicrophone` 暂停发布本机音频流;`unmuteMicrophone` 恢复发布本机音频流。
20
+
21
+ ## 2. 字段语义对照
22
+
23
+ | 字段/能力 | 作用 | 说明 |
24
+ |---|---|---|
25
+ | `LiveInfo` | 房间信息 | 包含 `liveID`、`liveName`、`seatTemplate`、`keepOwnerOnSeat`、`seatMode` 等参数 |
26
+ | `liveID` | 房间 ID | `createLive` 必填参数 |
27
+ | `liveName` | 房间名称 | 创建房间的展示名称 |
28
+ | `seatTemplate` | 麦位布局模板 | 语聊房使用 `SeatLayoutTemplate.AudioSalon(seatCount = n)`,n ≤ 套餐最大麦位数 |
29
+ | `keepOwnerOnSeat` | 房主自动上麦 | 设为 `true`,主播进房后自动上麦 |
30
+ | `seatMode` | 上麦模式 | 如 `TakeSeatMode.APPLY` 申请上麦 |
31
+ | `createLive(liveInfo, callback)` | 创建房间(开播) | 传入 `LiveInfo` 和 `LiveInfoCompletionHandler` 回调 |
32
+ | `openLocalMicrophone` | 采集音频并发布 | 打开本地麦克风,发布音频流到房间 |
33
+ | `muteMicrophone` | 暂停发布音频 | 已打开麦克风时,暂停发布本地音频流 |
34
+ | `unmuteMicrophone` | 恢复发布音频 | 已打开麦克风时,恢复发布本地音频流 |
35
+
36
+ ## 3. 机制/时序
37
+
38
+ 构造 `LiveInfo`(`liveID` 必填,`seatTemplate=AudioSalon(n)`,`keepOwnerOnSeat=true`,`seatMode` 按需设置) -> 调用 `createLive` 创建房间 -> `onSuccess` 回调触发,房主默认自动上麦 -> 调用 `openLocalMicrophone` 采集并发布音频 -> 房间内用户听到主播声音。
39
+
40
+ 上麦是推流的前提:`keepOwnerOnSeat=true` 保证房主上麦后才能推音频流。`muteMicrophone` / `unmuteMicrophone` 用于推流过程中的暂停/恢复。
41
+
42
+ ## 4. 标准用法
43
+
44
+ 1. 构造 `LiveInfo`:设置 `liveID`、`seatTemplate`、`keepOwnerOnSeat`、`seatMode`。
45
+ 2. 实现 `LiveInfoCompletionHandler`,调用 `createLive` 发起开播。
46
+ 3. `onSuccess` 回调后,调用 `openLocalMicrophone` 采集音频并发布推流。
47
+ 4. 需要暂停/恢复推流时调用 `muteMicrophone` / `unmuteMicrophone`。
48
+
49
+ ```kotlin
50
+ import android.util.Log
51
+ import androidx.appcompat.app.AppCompatActivity
52
+ import io.trtc.tuikit.atomicxcore.api.live.LiveInfo
53
+ import io.trtc.tuikit.atomicxcore.api.live.LiveInfoCompletionHandler
54
+ import io.trtc.tuikit.atomicxcore.api.live.TakeSeatMode
55
+
56
+ class YourAnchorActivity : AppCompatActivity() {
57
+ // ... 其他代码 ...
58
+
59
+ private fun startLive() {
60
+ val liveInfo = LiveInfo().apply {
61
+ // 1. 设置房间基础信息
62
+ liveID = this@YourAnchorActivity.liveID
63
+ liveName = "test 语聊房"
64
+
65
+ // 2. 设置语聊房麦位模板,seatCount 传入所需麦位数(≤ 套餐最大麦位数)
66
+ seatTemplate = SeatLayoutTemplate.AudioSalon(seatCount = 9)
67
+
68
+ // 3. 主播开播后自动上麦(上麦后才能推音频流)
69
+ keepOwnerOnSeat = true
70
+
71
+ // 4. 设置上麦模式(例如申请上麦)
72
+ seatMode = TakeSeatMode.APPLY
73
+ }
74
+
75
+ // 5. 调用 createLive 创建房间(开播)
76
+ liveListStore.createLive(liveInfo, object : LiveInfoCompletionHandler {
77
+ override fun onFailure(code: Int, desc: String) {
78
+ Log.e("Live", "Response startLive onError: $desc")
79
+ }
80
+
81
+ override fun onSuccess(liveInfo: LiveInfo) {
82
+ Log.d("Live", "Response startLive onSuccess")
83
+ // 6. 房主创建成功后默认自动上麦,此时调用 openLocalMicrophone 采集并发布音频
84
+ liveSeatStore.openLocalMicrophone(null)
85
+ }
86
+ })
87
+ }
88
+ }
89
+ ```
90
+
91
+ ## 5. 结果判定
92
+
93
+ - `onSuccess` 回调触发:房间创建成功,房主默认自动上麦。
94
+ - `openLocalMicrophone` 后:房间内用户能听到主播声音。
95
+ - `muteMicrophone` 后:本机音频暂停发布;`unmuteMicrophone` 后恢复。
96
+ - `keepOwnerOnSeat` 未设 `true`:主播未自动上麦,无法推流。
97
+ - `onFailure(code, desc)` 回调触发:开播失败,`code` 为错误码,`desc` 为错误描述。
98
+
99
+ ## 6. 常见误区
100
+
101
+ - 误区 1:跳过 `createLive` 直接调用 `openLocalMicrophone`(未创建房间无法推流)。
102
+ - 误区 2:`keepOwnerOnSeat` 未设 `true`,主播未上麦,推流不生效。
103
+ - 误区 3:`seatTemplate` 未设置或 `seatCount` 超过套餐最大麦位数。
104
+ - 误区 4:混淆 `muteMicrophone`(暂停发布音频流)与关闭麦克风(停止采集)。
105
+ - 误区 5:`liveID` 重复使用(必须全局唯一,否则创建失败)。
106
+ - 误区 6:混淆 `onSuccess` 和 `onFailure` 回调(两个分支都需防御性处理)。
107
+
108
+ ## 7. 问题定义(检索辅助,极简)
109
+
110
+ Android 语聊房房主需要按正确顺序创建房间并开播推流,了解 `createLive`、`openLocalMicrophone`、`muteMicrophone`、`unmuteMicrophone` 的调用时机与参数含义。
111
+
112
+ ## 8. 同义问法覆盖(检索召回,极简)
113
+
114
+ - Android 语聊房房主怎么开播?
115
+ - Android `createLive` 和 `openLocalMicrophone` 的调用顺序是什么?
116
+ - Android 主播怎么上麦推流?
117
+ - `keepOwnerOnSeat` 参数有什么作用?
118
+ - `seatTemplate` 怎么设置语聊房 `AudioSalon` 模板?
119
+ - Android `muteMicrophone` 和 `unmuteMicrophone` 区别是什么?
120
+ - 语聊房创建房间后如何推音频流?
121
+
122
+ ## 9. 参考来源(可选)
123
+
124
+ - LiveKit Android 文档:`https://cloud.tencent.com/document/product/647/124968`
@@ -0,0 +1,73 @@
1
+ ---
2
+ title: 语聊房管理员上麦与麦位锁定操作
3
+ product: live
4
+ frameworks: [android, ios, flutter]
5
+ scope: platform_common
6
+ tags: [语聊房, 管理员, 上麦, takeSeat, lockSeat, unlockSeat, seatMode, FREE, 麦位, 主持麦位, 房主同意, VoiceRoom]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # 语聊房管理员上麦与麦位锁定操作
11
+
12
+ ## 1. 核心结论
13
+
14
+ - 管理员上麦调用 `takeSeat` 并传入麦位序号,不需要调用 `applyForSeat`,**不受 `seatMode=APPLY` 限制**,也**不需要**房主同意。
15
+ - 管理员上麦**不受 `lockSeat` 锁定限制**,可直接 `takeSeat` 到任意麦位(含 0 号主持麦位)。
16
+ - 普通用户仅在 `seatMode` 为 `FREE` 时才能调用 `takeSeat` 上麦,且**受 `lockSeat` 锁定限制**。
17
+ - 三端(Android/iOS/Flutter)`LiveSeatStore` 的麦位操作 API 一致。
18
+
19
+ ## 2. 字段语义对照
20
+
21
+ | 字段/能力 | 作用 | 说明 |
22
+ |---|---|---|
23
+ | `takeSeat` | 上麦 | 传入麦位序号上麦;管理员不受 `seatMode`/`lockSeat` 限制;普通用户需 `seatMode=FREE` 且麦位未锁定 |
24
+ | `lockSeat` | 锁定麦位 | 锁定后普通用户无法 `takeSeat`,管理员不受影响 |
25
+ | `unlockSeat` | 解锁麦位 | 解锁后普通用户才能 `takeSeat` |
26
+ | `seatMode` | 上麦模式 | 普通用户仅在 `FREE` 模式下可 `takeSeat` |
27
+ | `LiveSeatStore` | 麦位管理 | 提供 `takeSeat`/`leaveSeat`/`lockSeat`/`unlockSeat` 等操作 |
28
+ | 房主 | 房间所有者 | 可锁定/解锁麦位 |
29
+
30
+ ## 3. 机制/时序
31
+
32
+ ### 管理员上麦
33
+
34
+ 管理员调用 `takeSeat(index)` 直接上麦(传入目标麦位序号)-> 不受 `seatMode` 限制 -> 无需房主同意 -> 不受 `lockSeat` 锁定限制,直接上麦成功。
35
+
36
+ ## 4. 标准用法
37
+
38
+ 1. **管理员上麦**:调用 `takeSeat(index)`,`index` 为目标麦位序号(如 0 号主持麦位),不受 `seatMode`/`lockSeat` 限制。
39
+ 2. **普通用户上麦**:确认 `seatMode=FREE`,且目标麦位未锁定,调用 `takeSeat(index)`。
40
+ 3. **锁麦位**:管理员/房主调用 `lockSeat(index)` 锁定,锁定后普通用户不可 `takeSeat`,管理员不受影响。
41
+ 4. **解锁后上麦**:先 `unlockSeat(index)` 解锁,普通用户再 `takeSeat(index)` 上麦。
42
+
43
+ ```javascript
44
+ // 三端 API 一致,仅语言风格略有差异(Android Kotlin / iOS Swift / Flutter Dart)
45
+ // 1. 管理员直接上麦(不受 seatMode / lockSeat 限制,无需房主同意)
46
+ liveSeatStore.takeSeat(0); // 上麦到 0 号主持麦位
47
+ ```
48
+
49
+ ## 5. 结果判定
50
+
51
+ - 管理员 `takeSeat(index)` 直接成功,不受 `seatMode` 限制,无房主同意。
52
+ - `lockSeat` 后管理员 `takeSeat` 同一麦位仍成功(管理员不受锁麦限制)。
53
+ - 普通用户仅 `seatMode=FREE` 时 `takeSeat` 成功;麦位被锁定则失败,需先 `unlockSeat`。
54
+
55
+ ## 6. 常见误区
56
+
57
+ - 误区 1:管理员上麦时调用 `applyForSeat` 申请(管理员直接 `takeSeat`,无需申请)。
58
+ - 误区 2:认为管理员 `takeSeat` 需要房主同意(管理员不受此限制)。
59
+ - 误区 3:认为 `lockSeat` 后管理员也不能 `takeSeat` 同一麦位(管理员不受锁麦限制,仅普通用户受限)。
60
+
61
+ ## 7. 问题定义(检索辅助,极简)
62
+
63
+ 语聊房管理员如何直接上麦到指定麦位(含 0 号主持麦位)、管理员是否受 `seatMode`/`lockSeat` 限制,以及普通用户上麦的 `seatMode` 与锁定条件。
64
+
65
+ ## 8. 同义问法覆盖(检索召回,极简)
66
+
67
+ - 语聊房管理员怎么上麦到 0 号麦位?
68
+ - 管理员 `takeSeat` 需要房主同意吗?
69
+ - 管理员上麦受 `seatMode` 限制吗?
70
+ - 锁麦后管理员能 `takeSeat` 吗?
71
+ - 普通用户什么时候能 `takeSeat`?
72
+ - `seatMode=FREE` 时普通用户能上麦吗?
73
+ - 锁定的麦位怎么解锁再上麦?