@xmov/avatar 2.0.0-alpha.38

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 (160) hide show
  1. package/README.md +139 -0
  2. package/dist/agent/__tests__/agent.test.d.ts +1 -0
  3. package/dist/agent/audio-debug.d.ts +3 -0
  4. package/dist/agent/audio-uplink.d.ts +62 -0
  5. package/dist/agent/avatar.cjs +2 -0
  6. package/dist/agent/avatar.cjs.map +1 -0
  7. package/dist/agent/avatar.modern.js +2 -0
  8. package/dist/agent/avatar.modern.js.map +1 -0
  9. package/dist/agent/avatar.module.js +2 -0
  10. package/dist/agent/avatar.module.js.map +1 -0
  11. package/dist/agent/avatar.umd.js +2 -0
  12. package/dist/agent/avatar.umd.js.map +1 -0
  13. package/dist/agent/e2e-client.d.ts +32 -0
  14. package/dist/agent/fixed-audio-track.d.ts +48 -0
  15. package/dist/agent/index.cjs +5 -0
  16. package/dist/agent/index.d.ts +104 -0
  17. package/dist/agent/index.umd.js +10 -0
  18. package/dist/agent/microphone.d.ts +49 -0
  19. package/dist/agent/types.d.ts +153 -0
  20. package/dist/baseRender/AudioRenderer.d.ts +46 -0
  21. package/dist/baseRender/AudioWorklet.d.ts +78 -0
  22. package/dist/baseRender/AvatarRenderer.d.ts +226 -0
  23. package/dist/baseRender/MSEAudioPlayer.d.ts +51 -0
  24. package/dist/baseRender/UIRenderer.d.ts +39 -0
  25. package/dist/baseRender/pcm-audio-processor.d.ts +63 -0
  26. package/dist/control/APIForwarder.d.ts +23 -0
  27. package/dist/control/DataCacheQueue.d.ts +69 -0
  28. package/dist/control/EventDispatcher.d.ts +35 -0
  29. package/dist/control/RenderScheduler.d.ts +162 -0
  30. package/dist/control/SaveAndDownload.d.ts +14 -0
  31. package/dist/control/StreamingClient.d.ts +33 -0
  32. package/dist/control/VideoPlayer.d.ts +47 -0
  33. package/dist/control/ttsa.d.ts +111 -0
  34. package/dist/encoding/media-recorder-encoder.d.ts +33 -0
  35. package/dist/encoding/pcm-webm-encoder.d.ts +13 -0
  36. package/dist/encoding/webcodec-opus-encoder.d.ts +41 -0
  37. package/dist/encoding/webm-muxer.d.ts +90 -0
  38. package/dist/index.cjs +2 -0
  39. package/dist/index.cjs.map +1 -0
  40. package/dist/index.d.ts +231 -0
  41. package/dist/index.modern.js +2 -0
  42. package/dist/index.modern.js.map +1 -0
  43. package/dist/index.module.js +2 -0
  44. package/dist/index.module.js.map +1 -0
  45. package/dist/index.umd.js +2 -0
  46. package/dist/index.umd.js.map +1 -0
  47. package/dist/modules/Composition.d.ts +28 -0
  48. package/dist/modules/ResourceManager.d.ts +295 -0
  49. package/dist/modules/TrackRenderer/base-track.d.ts +4 -0
  50. package/dist/modules/TrackRenderer/index.d.ts +12 -0
  51. package/dist/modules/TrackRenderer/render-implements.d.ts +19 -0
  52. package/dist/modules/TrackRenderer/track-pic.d.ts +8 -0
  53. package/dist/modules/TrackRenderer/track-subtitle.d.ts +8 -0
  54. package/dist/modules/cache-manager.d.ts +5 -0
  55. package/dist/modules/decoder.d.ts +84 -0
  56. package/dist/modules/error-handle.d.ts +17 -0
  57. package/dist/modules/network.d.ts +21 -0
  58. package/dist/proto/face_data_pb.d.ts +0 -0
  59. package/dist/types/capability.d.ts +15 -0
  60. package/dist/types/error.d.ts +70 -0
  61. package/dist/types/event.d.ts +25 -0
  62. package/dist/types/frame-data.d.ts +107 -0
  63. package/dist/types/index.d.ts +187 -0
  64. package/dist/types/render.d.ts +18 -0
  65. package/dist/utils/DataInterface.d.ts +113 -0
  66. package/dist/utils/GLDevice.d.ts +46 -0
  67. package/dist/utils/GLPipeline.d.ts +84 -0
  68. package/dist/utils/GLPipelineDebugTools.d.ts +5 -0
  69. package/dist/utils/Math.d.ts +21 -0
  70. package/dist/utils/__tests__/capability-checker.test.d.ts +1 -0
  71. package/dist/utils/audio-session.d.ts +11 -0
  72. package/dist/utils/audio.d.ts +1 -0
  73. package/dist/utils/capability-checker.d.ts +23 -0
  74. package/dist/utils/encodeToken.d.ts +7 -0
  75. package/dist/utils/face.d.ts +1 -0
  76. package/dist/utils/float32-decoder.d.ts +26 -0
  77. package/dist/utils/fpsTracker.d.ts +27 -0
  78. package/dist/utils/index.d.ts +22 -0
  79. package/dist/utils/logger.d.ts +9 -0
  80. package/dist/utils/media-recorder-timestamp.d.ts +15 -0
  81. package/dist/utils/pcmAnalyzer.d.ts +40 -0
  82. package/dist/utils/perfermance.d.ts +15 -0
  83. package/dist/utils/request.d.ts +19 -0
  84. package/dist/utils/requestAnimateFrames.d.ts +31 -0
  85. package/dist/utils/time.d.ts +9 -0
  86. package/dist/view/DebugOverlay.d.ts +54 -0
  87. package/dist/worker/streaming-video.d.ts +1 -0
  88. package/package.json +82 -0
  89. package/src/agent/__tests__/agent.test.ts +3787 -0
  90. package/src/agent/audio-debug.ts +36 -0
  91. package/src/agent/audio-uplink.ts +392 -0
  92. package/src/agent/e2e-client.ts +215 -0
  93. package/src/agent/fixed-audio-track.ts +547 -0
  94. package/src/agent/index.ts +1393 -0
  95. package/src/agent/microphone.ts +534 -0
  96. package/src/agent/types.ts +197 -0
  97. package/src/baseRender/AudioRenderer.ts +317 -0
  98. package/src/baseRender/AudioWorklet.ts +776 -0
  99. package/src/baseRender/AvatarRenderer.ts +1559 -0
  100. package/src/baseRender/MSEAudioPlayer.ts +243 -0
  101. package/src/baseRender/UIRenderer.ts +195 -0
  102. package/src/baseRender/pcm-audio-processor.js +267 -0
  103. package/src/control/APIForwarder.ts +67 -0
  104. package/src/control/DataCacheQueue.ts +372 -0
  105. package/src/control/EventDispatcher.ts +106 -0
  106. package/src/control/RenderScheduler.ts +945 -0
  107. package/src/control/SaveAndDownload.js +77 -0
  108. package/src/control/StreamingClient.ts +138 -0
  109. package/src/control/VideoPlayer.ts +306 -0
  110. package/src/control/ttsa.ts +676 -0
  111. package/src/encoding/media-recorder-encoder.ts +175 -0
  112. package/src/encoding/pcm-webm-encoder.ts +72 -0
  113. package/src/encoding/webcodec-opus-encoder.ts +258 -0
  114. package/src/encoding/webm-muxer.ts +337 -0
  115. package/src/global.d.ts +105 -0
  116. package/src/index.ts +1920 -0
  117. package/src/modules/Composition.ts +79 -0
  118. package/src/modules/ResourceManager.ts +899 -0
  119. package/src/modules/TrackRenderer/base-track.ts +7 -0
  120. package/src/modules/TrackRenderer/index.ts +40 -0
  121. package/src/modules/TrackRenderer/render-implements.ts +269 -0
  122. package/src/modules/TrackRenderer/track-pic.ts +19 -0
  123. package/src/modules/TrackRenderer/track-subtitle.ts +16 -0
  124. package/src/modules/cache-manager.ts +10 -0
  125. package/src/modules/decoder.ts +515 -0
  126. package/src/modules/error-handle.ts +20 -0
  127. package/src/modules/network.ts +71 -0
  128. package/src/proto/face_data.proto +45 -0
  129. package/src/proto/face_data_pb.js +1297 -0
  130. package/src/proto/protobuf.min.js +8 -0
  131. package/src/types/capability.ts +23 -0
  132. package/src/types/error.ts +211 -0
  133. package/src/types/event.ts +38 -0
  134. package/src/types/frame-data.ts +121 -0
  135. package/src/types/index.ts +207 -0
  136. package/src/types/render.ts +18 -0
  137. package/src/utils/DataInterface.ts +746 -0
  138. package/src/utils/GLDevice.ts +286 -0
  139. package/src/utils/GLPipeline.ts +1293 -0
  140. package/src/utils/GLPipelineDebugTools.ts +174 -0
  141. package/src/utils/Math.ts +266 -0
  142. package/src/utils/__tests__/capability-checker.test.ts +159 -0
  143. package/src/utils/audio-session.ts +144 -0
  144. package/src/utils/audio.ts +44 -0
  145. package/src/utils/blueimp-md5.d.ts +3 -0
  146. package/src/utils/capability-checker.ts +379 -0
  147. package/src/utils/encodeToken.ts +100 -0
  148. package/src/utils/face.ts +29 -0
  149. package/src/utils/float32-decoder.js +130 -0
  150. package/src/utils/fpsTracker.ts +100 -0
  151. package/src/utils/index.ts +182 -0
  152. package/src/utils/logger.js +36 -0
  153. package/src/utils/media-recorder-timestamp.ts +79 -0
  154. package/src/utils/pcmAnalyzer.ts +154 -0
  155. package/src/utils/perfermance.ts +141 -0
  156. package/src/utils/request.ts +95 -0
  157. package/src/utils/requestAnimateFrames.ts +195 -0
  158. package/src/utils/time.ts +32 -0
  159. package/src/view/DebugOverlay.ts +404 -0
  160. package/src/worker/streaming-video.ts +4647 -0
@@ -0,0 +1,337 @@
1
+ /**
2
+ * WebM EBML 封装器
3
+ * 将 Opus 帧封装为 WebM 容器格式,产出与 MSE 模式一致的 WebM/Opus 数据
4
+ *
5
+ * WebM 结构:
6
+ * EBML Header → Segment → SegmentInfo → Tracks → Cluster(s) → SimpleBlock(s)
7
+ */
8
+
9
+ // EBML Element IDs
10
+ const EBML_ID = {
11
+ EBML: 0x1A45DFA3,
12
+ EBMLVersion: 0x4286,
13
+ EBMLReadVersion: 0x42F7,
14
+ EBMLMaxIDLength: 0x42F2,
15
+ EBMLMaxSizeLength: 0x42F3,
16
+ DocType: 0x4282,
17
+ DocTypeVersion: 0x4287,
18
+ DocTypeReadVersion: 0x4285,
19
+
20
+ Segment: 0x18538067,
21
+ SegmentInfo: 0x1549A966,
22
+ TimecodeScale: 0x2AD7B1,
23
+ MuxingApp: 0x4D80,
24
+ WritingApp: 0x5741,
25
+
26
+ Tracks: 0x1654AE6B,
27
+ TrackEntry: 0xAE,
28
+ TrackNumber: 0xD7,
29
+ TrackUID: 0x73C5,
30
+ TrackType: 0x83,
31
+ FlagLacing: 0x9C,
32
+ Language: 0x22B59C,
33
+ CodecID: 0x86,
34
+ CodecPrivate: 0x63A2,
35
+ CodecDelay: 0x56AA,
36
+ SeekPreRoll: 0x56BB,
37
+ Audio: 0xE1,
38
+ SamplingFrequency: 0xB5,
39
+ Channels: 0x9F,
40
+
41
+ Cluster: 0x1F43B675,
42
+ Timecode: 0xE7,
43
+ SimpleBlock: 0xA3,
44
+ };
45
+
46
+ export class WebMMuxer {
47
+ private chunks: Uint8Array[] = [];
48
+ private hasHeader = false;
49
+ private clusterTimestamp: number = 0; // 单位:毫秒
50
+ private sampleRate: number;
51
+ private frameDuration: number = 100; // 100ms per frame
52
+
53
+ constructor(sampleRate: number = 16000) {
54
+ this.sampleRate = sampleRate;
55
+ }
56
+
57
+ /**
58
+ * 写入 WebM 文件头(EBML Header + Segment Info + Track)
59
+ */
60
+ writeHeader(): void {
61
+ if (this.hasHeader) return;
62
+
63
+ const header = this.buildEBMLHeader();
64
+ const segmentInfo = this.buildSegmentInfo();
65
+ const tracks = this.buildOpusTracks();
66
+
67
+ // EBML Header
68
+ this.chunks.push(header);
69
+ // Segment (open-ended, use unknown size)
70
+ this.chunks.push(new Uint8Array([0x18, 0x53, 0x80, 0x67, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]));
71
+ // SegmentInfo
72
+ this.chunks.push(segmentInfo);
73
+ // Tracks
74
+ this.chunks.push(tracks);
75
+
76
+ this.hasHeader = true;
77
+ this.clusterTimestamp = 0;
78
+ }
79
+
80
+ /**
81
+ * 写入 Opus 帧
82
+ * @param opusFrame Opus 编码后的数据
83
+ * @param durationMs 帧时长 (默认 100ms)
84
+ */
85
+ feedOpusFrame(opusFrame: Uint8Array, durationMs: number = this.frameDuration): void {
86
+ if (!this.hasHeader) {
87
+ this.writeHeader();
88
+ }
89
+
90
+ // 每帧都创建一个新 Cluster(与 MediaRecorder 行为一致)
91
+ const cluster = this.buildCluster(Math.round(this.clusterTimestamp), opusFrame);
92
+ this.chunks.push(cluster);
93
+ this.clusterTimestamp += durationMs;
94
+ }
95
+
96
+ /**
97
+ * 获取新增的 WebM 数据(自上次 flush 以来的数据)
98
+ * 返回后清空已返回的数据,避免重复发送
99
+ */
100
+ flush(): ArrayBuffer {
101
+ if (this.chunks.length === 0) {
102
+ return new ArrayBuffer(0);
103
+ }
104
+
105
+ const totalLength = this.chunks.reduce((sum, chunk) => sum + chunk.length, 0);
106
+ const result = new Uint8Array(totalLength);
107
+ let offset = 0;
108
+ for (const chunk of this.chunks) {
109
+ result.set(chunk, offset);
110
+ offset += chunk.length;
111
+ }
112
+
113
+ // 关键:清空已返回的数据,避免下次 flush 重复发送
114
+ this.chunks = [];
115
+
116
+ return result.buffer;
117
+ }
118
+
119
+ /**
120
+ * 重置(新 speak 段开始时调用)
121
+ */
122
+ reset(): void {
123
+ this.chunks = [];
124
+ this.hasHeader = false;
125
+ this.clusterTimestamp = 0;
126
+ }
127
+
128
+ // ── EBML 编码辅助方法 ──
129
+
130
+ /**
131
+ * 编码 VINT(Variable-length Integer)
132
+ */
133
+ private encodeVINT(value: number, width?: number): Uint8Array {
134
+ if (width !== undefined) {
135
+ const bytes = new Uint8Array(width);
136
+ for (let i = width - 1; i >= 0; i--) {
137
+ bytes[i] = value & 0xFF;
138
+ value >>>= 8;
139
+ }
140
+ bytes[0] |= (1 << (8 - width));
141
+ return bytes;
142
+ }
143
+
144
+ // 自动选择最小宽度
145
+ if (value < 0x7F) {
146
+ return new Uint8Array([0x80 | value]);
147
+ } else if (value < 0x3FFF) {
148
+ return new Uint8Array([0x40 | (value >> 8), value & 0xFF]);
149
+ } else if (value < 0x1FFFFF) {
150
+ return new Uint8Array([0x20 | (value >> 16), (value >> 8) & 0xFF, value & 0xFF]);
151
+ } else if (value < 0x0FFFFFFF) {
152
+ return new Uint8Array([0x10 | (value >> 24), (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF]);
153
+ }
154
+ throw new Error(`VINT value too large: ${value}`);
155
+ }
156
+
157
+ /**
158
+ * 编码 EBML Element ID
159
+ */
160
+ private encodeID(id: number): Uint8Array {
161
+ if (id <= 0xFF) return new Uint8Array([id]);
162
+ if (id <= 0xFFFF) return new Uint8Array([id >> 8, id & 0xFF]);
163
+ if (id <= 0xFFFFFF) return new Uint8Array([id >> 16, (id >> 8) & 0xFF, id & 0xFF]);
164
+ return new Uint8Array([id >>> 24, (id >> 16) & 0xFF, (id >> 8) & 0xFF, id & 0xFF]);
165
+ }
166
+
167
+ /**
168
+ * 编码无符号整数
169
+ */
170
+ private encodeUint(value: number): Uint8Array {
171
+ if (value === 0) return new Uint8Array([0]);
172
+ const bytes: number[] = [];
173
+ let v = value;
174
+ while (v > 0) {
175
+ bytes.unshift(v & 0xFF);
176
+ v = Math.floor(v / 256);
177
+ }
178
+ return new Uint8Array(bytes);
179
+ }
180
+
181
+ /**
182
+ * 编码字符串
183
+ */
184
+ private encodeString(str: string): Uint8Array {
185
+ return new TextEncoder().encode(str);
186
+ }
187
+
188
+ /**
189
+ * 编码浮点数(32-bit IEEE 754)
190
+ */
191
+ private encodeFloat32(value: number): Uint8Array {
192
+ const buf = new ArrayBuffer(4);
193
+ new DataView(buf).setFloat32(0, value, false); // big-endian
194
+ return new Uint8Array(buf);
195
+ }
196
+
197
+ /**
198
+ * 编码 EBML Element = ID + Size + Data
199
+ */
200
+ private encodeElement(id: number, data: Uint8Array): Uint8Array {
201
+ const idBytes = this.encodeID(id);
202
+ const sizeBytes = this.encodeVINT(data.length);
203
+ const result = new Uint8Array(idBytes.length + sizeBytes.length + data.length);
204
+ result.set(idBytes, 0);
205
+ result.set(sizeBytes, idBytes.length);
206
+ result.set(data, idBytes.length + sizeBytes.length);
207
+ return result;
208
+ }
209
+
210
+ /**
211
+ * 编码 unsigned integer Element
212
+ */
213
+ private encodeUintElement(id: number, value: number): Uint8Array {
214
+ return this.encodeElement(id, this.encodeUint(value));
215
+ }
216
+
217
+ /**
218
+ * 编码 string Element
219
+ */
220
+ private encodeStringElement(id: number, value: string): Uint8Array {
221
+ return this.encodeElement(id, this.encodeString(value));
222
+ }
223
+
224
+ /**
225
+ * 编码 float32 Element
226
+ */
227
+ private encodeFloat32Element(id: number, value: number): Uint8Array {
228
+ return this.encodeElement(id, this.encodeFloat32(value));
229
+ }
230
+
231
+ /**
232
+ * 合并多个 Uint8Array
233
+ */
234
+ private concatArrays(arrays: Uint8Array[]): Uint8Array {
235
+ const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);
236
+ const result = new Uint8Array(totalLength);
237
+ let offset = 0;
238
+ for (const arr of arrays) {
239
+ result.set(arr, offset);
240
+ offset += arr.length;
241
+ }
242
+ return result;
243
+ }
244
+
245
+ /**
246
+ * 构建 EBML Header
247
+ */
248
+ private buildEBMLHeader(): Uint8Array {
249
+ const children = this.concatArrays([
250
+ this.encodeUintElement(EBML_ID.EBMLVersion, 1),
251
+ this.encodeUintElement(EBML_ID.EBMLReadVersion, 1),
252
+ this.encodeUintElement(EBML_ID.EBMLMaxIDLength, 4),
253
+ this.encodeUintElement(EBML_ID.EBMLMaxSizeLength, 8),
254
+ this.encodeStringElement(EBML_ID.DocType, 'webm'),
255
+ // Opus tracks use CodecDelay and SeekPreRoll, which require WebM v4.
256
+ this.encodeUintElement(EBML_ID.DocTypeVersion, 4),
257
+ this.encodeUintElement(EBML_ID.DocTypeReadVersion, 2),
258
+ ]);
259
+ return this.encodeElement(EBML_ID.EBML, children);
260
+ }
261
+
262
+ /**
263
+ * 构建 SegmentInfo
264
+ */
265
+ private buildSegmentInfo(): Uint8Array {
266
+ const children = this.concatArrays([
267
+ this.encodeUintElement(EBML_ID.TimecodeScale, 1000000), // 1ms precision
268
+ this.encodeStringElement(EBML_ID.MuxingApp, 'xmov-avatar-sdk'),
269
+ this.encodeStringElement(EBML_ID.WritingApp, 'xmov-avatar-sdk'),
270
+ ]);
271
+ return this.encodeElement(EBML_ID.SegmentInfo, children);
272
+ }
273
+
274
+ /**
275
+ * 构建 Opus Audio Track
276
+ */
277
+ private buildOpusTracks(): Uint8Array {
278
+ // Opus CodecPrivate data (OpusHead)
279
+ // Version(1) + Channels(1) + PreSkip(2) + InputSampleRate(4) + OutputGain(2) + ChannelMappingFamily(1)
280
+ const opusHead = new Uint8Array([
281
+ 0x4F, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64, // "OpusHead"
282
+ 0x01, // Version
283
+ 0x01, // Channel count (mono)
284
+ 0x00, 0x00, // Pre-skip (0)
285
+ 0x80, 0x3E, 0x00, 0x00, // Input sample rate (16000, little-endian)
286
+ 0x00, 0x00, // Output gain (0)
287
+ 0x00, // Channel mapping family (0)
288
+ ]);
289
+
290
+ const audioChildren = this.concatArrays([
291
+ this.encodeFloat32Element(EBML_ID.SamplingFrequency, this.sampleRate),
292
+ this.encodeUintElement(EBML_ID.Channels, 1),
293
+ ]);
294
+
295
+ const trackEntryChildren = this.concatArrays([
296
+ this.encodeUintElement(EBML_ID.TrackNumber, 1),
297
+ this.encodeUintElement(EBML_ID.TrackUID, 1),
298
+ this.encodeUintElement(EBML_ID.TrackType, 2), // Audio
299
+ this.encodeUintElement(EBML_ID.FlagLacing, 0),
300
+ this.encodeStringElement(EBML_ID.Language, 'und'),
301
+ this.encodeStringElement(EBML_ID.CodecID, 'A_OPUS'),
302
+ this.encodeElement(EBML_ID.CodecPrivate, opusHead),
303
+ this.encodeUintElement(EBML_ID.CodecDelay, 0),
304
+ this.encodeUintElement(EBML_ID.SeekPreRoll, 80000000), // 80ms in ns
305
+ this.encodeElement(EBML_ID.Audio, audioChildren),
306
+ ]);
307
+
308
+ const trackEntry = this.encodeElement(EBML_ID.TrackEntry, trackEntryChildren);
309
+ return this.encodeElement(EBML_ID.Tracks, trackEntry);
310
+ }
311
+
312
+ /**
313
+ * 构建 Cluster + SimpleBlock
314
+ */
315
+ private buildCluster(timecodeMs: number, opusData: Uint8Array): Uint8Array {
316
+ // Timecode element
317
+ const timecode = this.encodeUintElement(EBML_ID.Timecode, timecodeMs);
318
+
319
+ // SimpleBlock: TrackNumber(VINT) + Timecode(2 bytes, signed, relative to cluster) + Flags(1 byte) + Data
320
+ const trackNumber = this.encodeVINT(1); // Track 1
321
+ const relativeTimecode = new Uint8Array([0x00, 0x00]); // 0ms relative
322
+ // WebCodecs Opus EncodedAudioChunk values are always key chunks.
323
+ const flags = new Uint8Array([0x80]);
324
+
325
+ const simpleBlockData = this.concatArrays([
326
+ trackNumber,
327
+ relativeTimecode,
328
+ flags,
329
+ opusData,
330
+ ]);
331
+ const simpleBlock = this.encodeElement(EBML_ID.SimpleBlock, simpleBlockData);
332
+
333
+ // Cluster = Timecode + SimpleBlock
334
+ const clusterChildren = this.concatArrays([timecode, simpleBlock]);
335
+ return this.encodeElement(EBML_ID.Cluster, clusterChildren);
336
+ }
337
+ }
@@ -0,0 +1,105 @@
1
+ // src/global.d.ts
2
+ // 1. 声明全局 protobuf 对象(适配 protobufjs UMD 格式)
3
+ declare namespace globalThis {
4
+ const protobuf: {
5
+ roots: {
6
+ default: {
7
+ MeshData: {
8
+ create: (props?: any) => any;
9
+ encode: (msg: any, writer?: any) => any;
10
+ decode: (buf: Uint8Array | any, length?: number) => any;
11
+ verify: (msg: any) => string | null;
12
+ fromObject: (obj: any) => any;
13
+ toObject: (inst: any, options?: any) => any;
14
+ // 其他需要的方法可按需补充(参考你的 proto 编译文件)
15
+ };
16
+ JointData: typeof MeshData;
17
+ FaceFrameData: typeof MeshData;
18
+ FaceFrameDataList: typeof MeshData;
19
+ };
20
+ };
21
+ };
22
+ }
23
+
24
+ // 2. 扩展 Window 接口,添加 proxyProtobuf 属性
25
+ interface Window {
26
+ proxyProtobuf: typeof protobuf.roots.default;
27
+ }
28
+
29
+ declare const VideoDecoder: any;
30
+
31
+ // 或者,提供一个更具体的、虽然不完整的声明
32
+ // 这可以提供一定的类型提示,比 'any' 要好
33
+ declare class VideoDecoder {
34
+ constructor(options: {
35
+ output: (frame: any) => void;
36
+ error: (error: Error) => void;
37
+ });
38
+ configure(config: any): void;
39
+ decode(chunk: any): void;
40
+ close(): void;
41
+ static isConfigSupported(config: any): Promise<{ supported: boolean }>;
42
+ }
43
+
44
+ // WebCodecs Audio API 类型声明(用于 PCM 模式音频捕获)
45
+ declare class AudioEncoder {
46
+ constructor(options: {
47
+ output: (chunk: EncodedAudioChunk, metadata?: any) => void;
48
+ error: (error: DOMException) => void;
49
+ });
50
+ configure(config: {
51
+ codec: string;
52
+ sampleRate: number;
53
+ numberOfChannels: number;
54
+ bitrate?: number;
55
+ opus?: {
56
+ format?: "opus" | "ogg";
57
+ frameDuration?: number;
58
+ };
59
+ }): void;
60
+ encode(data: AudioData): void;
61
+ flush(): Promise<void>;
62
+ close(): void;
63
+ static isConfigSupported(config: {
64
+ codec: string;
65
+ sampleRate: number;
66
+ numberOfChannels: number;
67
+ bitrate?: number;
68
+ opus?: {
69
+ format?: "opus" | "ogg";
70
+ frameDuration?: number;
71
+ };
72
+ }): Promise<{
73
+ supported: boolean;
74
+ config?: {
75
+ codec: string;
76
+ sampleRate: number;
77
+ numberOfChannels: number;
78
+ bitrate?: number;
79
+ opus?: {
80
+ format?: "opus" | "ogg";
81
+ frameDuration?: number;
82
+ };
83
+ };
84
+ }>;
85
+ }
86
+
87
+ declare class AudioData {
88
+ constructor(init: {
89
+ format: string;
90
+ sampleRate: number;
91
+ numberOfFrames: number;
92
+ numberOfChannels: number;
93
+ timestamp: number;
94
+ data: BufferSource;
95
+ });
96
+ close(): void;
97
+ }
98
+
99
+ declare class EncodedAudioChunk {
100
+ readonly type: string;
101
+ readonly timestamp: number;
102
+ readonly duration: number | null;
103
+ readonly byteLength: number;
104
+ copyTo(destination: BufferSource): void;
105
+ }