@xmaxai/web-sdk 1.0.9 → 1.0.10
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.
- package/README.md +8 -1
- package/dist/RecordingProcessor-4TP5NICO.cjs.map +1 -1
- package/dist/{TrajectoryEffectRendering-C7E2KJbV.d.cts → TrajectoryEffectRendering-BKKPO7Uk.d.cts} +2 -2
- package/dist/{TrajectoryEffectRendering-C7E2KJbV.d.ts → TrajectoryEffectRendering-BKKPO7Uk.d.ts} +2 -2
- package/dist/chunk-4DE2IREA.cjs.map +1 -1
- package/dist/{chunk-ILZL4W2G.js → chunk-LOYJFYQT.js} +461 -209
- package/dist/chunk-LOYJFYQT.js.map +1 -0
- package/dist/{chunk-KROY2O4A.cjs → chunk-UF2RD42G.cjs} +580 -328
- package/dist/chunk-UF2RD42G.cjs.map +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +42 -19
- package/dist/index.d.ts +42 -19
- package/dist/index.js +1 -1
- package/dist/react/index.cjs +3 -3
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +2 -1
- package/dist/react/index.d.ts +2 -1
- package/dist/react/index.js +1 -1
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-ILZL4W2G.js.map +0 -1
- package/dist/chunk-KROY2O4A.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -232,7 +232,7 @@ const client = new XmaxClient(
|
|
|
232
232
|
);
|
|
233
233
|
|
|
234
234
|
const realtime = client.createRealtimeManager(
|
|
235
|
-
new RealtimeConfiguration({ model: RealtimeModel.
|
|
235
|
+
new RealtimeConfiguration({ model: RealtimeModel.x2_1_1_preview_cn })
|
|
236
236
|
);
|
|
237
237
|
|
|
238
238
|
const localStream = await realtime.createLocalCameraStream({
|
|
@@ -433,6 +433,13 @@ For camera input, bind the returned video track to a preview view. The SDK enter
|
|
|
433
433
|
`ready` after it has received a valid frame and the preview view is bound; observe
|
|
434
434
|
this through `setStateListener`.
|
|
435
435
|
|
|
436
|
+
`startGeneration()` returns a remote stream for mounting; it does not wait for
|
|
437
|
+
the video view to finish preparing. Bind its track to an SDK video component.
|
|
438
|
+
The state remains `RealtimeConnectionState.starting` until the first frame and
|
|
439
|
+
the 1000 ms render warmup are complete, then becomes
|
|
440
|
+
`RealtimeConnectionState.generating` as the video fades in. Use this state to
|
|
441
|
+
dismiss your loading UI. Without an SDK video view, the state stays `starting`.
|
|
442
|
+
|
|
436
443
|
At generation start, the SDK sends `params.mirror: true` for the front camera
|
|
437
444
|
and `false` for the rear camera, local files, and network videos. The backend
|
|
438
445
|
mirrors the input; generated results are not automatically mirrored in the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-Zggzaq/source/packages/xmax-sdk/dist/RecordingProcessor-4TP5NICO.cjs","../src/Media/Recording/RecordingProcessor.ts","../src/Media/Recording/RecordingTimeline.ts"],"names":["duration"],"mappings":"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","file":"/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-Zggzaq/source/packages/xmax-sdk/dist/RecordingProcessor-4TP5NICO.cjs","sourcesContent":[null,"import {\n BlobSource, BufferTarget, EncodedAudioPacketSource, EncodedPacketSink,\n EncodedVideoPacketSource, Input, MP4, WEBM, Mp4OutputFormat, Output, WebMOutputFormat,\n type EncodedPacket, type InputTrack,\n} from \"mediabunny\";\nimport { RecordingTimeline } from \"./RecordingTimeline\";\n\n/**\n * 录制完成后裁掉长帧等待;音视频共用按音频包边界对齐的时间映射,不重新编码。\n */\nexport class RecordingProcessor {\n /**\n * 后处理资源上限,与实时连接的清理超时分离\n */\n private static readonly timeoutMs = 10_000;\n private static readonly maximumBytes = 64 * 1024 * 1024;\n private static readonly maximumPackets = 10_000;\n\n /**\n * 裁剪成功返回新文件,无需裁剪时返回原文件;失败交由调用方保留原始录像。\n */\n async process(blob: Blob): Promise<Blob> {\n if (blob.size > RecordingProcessor.maximumBytes) {\n throw new Error(\"Recording is too large to process\");\n }\n\n const input = new Input({ source: new BlobSource(blob), formats: [MP4, WEBM] });\n const controller = new AbortController();\n let output: Output | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error(\"Recording processing timed out\"));\n }, RecordingProcessor.timeoutMs);\n });\n\n try {\n return await Promise.race([\n this.rewrite(input, blob, controller.signal, value => { output = value; }),\n timeout,\n ]);\n } finally {\n controller.abort();\n clearTimeout(timer);\n input.dispose();\n if (output && output.state !== \"finalized\" && output.state !== \"canceled\") {\n void output.cancel().catch(() => {});\n }\n }\n }\n\n /**\n * 读取有限数量的编码包,维持原始解码顺序。\n */\n private async readPackets(track: InputTrack, signal: AbortSignal): Promise<EncodedPacket[]> {\n const packets: EncodedPacket[] = [];\n for await (const packet of new EncodedPacketSink(track).packets()) {\n signal.throwIfAborted();\n packets.push(packet);\n if (packets.length > RecordingProcessor.maximumPackets) {\n throw new Error(\"Recording has too many media packets\");\n }\n }\n return packets;\n }\n\n /**\n * 保留所有视频帧,删除等待区间内的完整音频包,并重新封装两条时间线。\n */\n private async rewrite(\n input: Input,\n original: Blob,\n signal: AbortSignal,\n registerOutput: (output: Output) => void,\n ): Promise<Blob> {\n const video = await input.getPrimaryVideoTrack();\n if (!video) {\n throw new Error(\"Recording has no video track\");\n }\n const videoPackets = await this.readPackets(video, signal);\n const audio = await input.getPrimaryAudioTrack();\n const audioPackets = audio ? await this.readPackets(audio, signal) : [];\n const duration = await input.computeDuration();\n const audioRanges = audioPackets.map((packet, index) => ({\n start: packet.timestamp,\n end: packet.duration > 0 ? packet.timestamp + packet.duration : audioPackets[index + 1]?.timestamp ?? duration,\n }));\n const timeline = new RecordingTimeline(videoPackets.map(packet => packet.timestamp), duration, audio ? audioRanges : undefined);\n if (timeline.cuts.length === 0) {\n return original;\n }\n\n const videoCodec = await video.getCodec();\n const videoConfig = await video.getDecoderConfig();\n const audioCodec = await audio?.getCodec();\n const audioConfig = await audio?.getDecoderConfig();\n if (!videoCodec || !videoConfig || (audio && (!audioCodec || !audioConfig))) {\n throw new Error(\"Unsupported recording codec\");\n }\n const isWebM = (await input.getFormat()).name === WEBM.name;\n const rotation = await video.getRotation();\n const flip = await video.getFlip();\n signal.throwIfAborted();\n\n const output = new Output({\n format: isWebM ? new WebMOutputFormat() : new Mp4OutputFormat(),\n target: new BufferTarget(),\n });\n registerOutput(output);\n const videoSource = new EncodedVideoPacketSource(videoCodec);\n output.addVideoTrack(videoSource, { rotation, flip });\n const audioSource = audioCodec ? new EncodedAudioPacketSource(audioCodec) : undefined;\n if (audioSource) {\n output.addAudioTrack(audioSource);\n }\n await output.start();\n\n // 不指定固定帧率,避免容器把原本不同的显示时间戳量化到同一帧。\n for (const packet of videoPackets) {\n signal.throwIfAborted();\n const timestamp = timeline.map(packet.timestamp);\n const duration = timeline.map(packet.timestamp + packet.duration) - timestamp;\n await videoSource.add(packet.clone({ timestamp, duration }), { decoderConfig: videoConfig });\n }\n videoSource.close();\n\n if (audioSource && audioConfig) {\n for (const [index, packet] of audioPackets.entries()) {\n signal.throwIfAborted();\n const range = audioRanges[index]!;\n if (timeline.removes(range.start, range.end)) {\n continue;\n }\n await audioSource.add(packet.clone({ timestamp: timeline.map(packet.timestamp) }), { decoderConfig: audioConfig });\n }\n audioSource.close();\n }\n signal.throwIfAborted();\n await output.finalize();\n if (!output.target.buffer || output.target.buffer.byteLength > RecordingProcessor.maximumBytes) {\n throw new Error(\"Processed recording exceeds the memory limit\");\n }\n return new Blob([output.target.buffer], { type: output.format.mimeType });\n }\n}\n","/**\n * 原始录制时间线上的区间,单位为秒。\n */\nexport interface RecordingTimeRange {\n start: number;\n end: number;\n}\n\n/**\n * 视频长帧裁剪计划。音视频共用同一映射,避免分别累计时间造成漂移。\n */\nexport class RecordingTimeline {\n /**\n * 长间隔判定与默认帧时长\n */\n private static readonly minimumGap = 0.12;\n private static readonly gapMultiplier = 3;\n private static readonly fallbackFrameDuration = 1 / 30;\n\n /**\n * 原始时长、正常帧时长与待删除区间\n */\n readonly frameDuration: number;\n readonly cuts: readonly RecordingTimeRange[];\n\n /**\n * 从显示时间戳估计正常帧间隔,只裁掉显著超长的等待部分。\n */\n constructor(timestamps: readonly number[], readonly duration: number, audioPackets?: readonly RecordingTimeRange[]) {\n if (!Number.isFinite(duration) || duration <= 0 || timestamps.length === 0 ||\n timestamps.some(value => !Number.isFinite(value) || value < 0 || value > duration)) {\n throw new Error(\"Invalid recording timeline\");\n }\n\n const sorted = [...timestamps].sort((a, b) => a - b);\n const intervals = sorted.slice(1).map((time, index) => time - sorted[index]!)\n .filter(value => value > 0).sort((a, b) => a - b);\n this.frameDuration = intervals[Math.floor(intervals.length / 2)] ?? RecordingTimeline.fallbackFrameDuration;\n const threshold = Math.max(RecordingTimeline.minimumGap, this.frameDuration * RecordingTimeline.gapMultiplier);\n\n const cuts = sorted.flatMap((start, index) => {\n const end = sorted[index + 1] ?? duration;\n return end - start > threshold + 1e-6 ? [{ start: start + this.frameDuration, end }] : [];\n });\n\n // 只删除完全落在等待区间内的音频包;同一裁剪边界同时用于视频,避免重编码延迟。\n this.cuts = audioPackets ? cuts.flatMap(cut => {\n const contained = audioPackets.filter(packet => packet.end > packet.start &&\n packet.start >= cut.start && packet.end <= cut.end);\n if (contained.length === 0) {\n return [];\n }\n return [{\n start: Math.min(...contained.map(packet => packet.start)),\n end: Math.max(...contained.map(packet => packet.end)),\n }];\n }) : cuts;\n }\n\n /**\n * 将原始时间映射到裁剪后的时间;删除区间内的时刻映射到同一接缝。\n */\n map(time: number): number {\n let removed = 0;\n for (const cut of this.cuts) {\n if (time <= cut.start) {\n break;\n }\n removed += Math.min(time, cut.end) - cut.start;\n }\n return time - removed;\n }\n\n /**\n * 判断一个音频包是否位于删除区间;区间已对齐包边界,不会切断压缩数据。\n */\n removes(start: number, end: number): boolean {\n return this.cuts.some(cut => start >= cut.start && end <= cut.end);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-ox16QE/source/packages/xmax-sdk/dist/RecordingProcessor-4TP5NICO.cjs","../src/Media/Recording/RecordingProcessor.ts","../src/Media/Recording/RecordingTimeline.ts"],"names":["duration"],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA;AACE;AAAY;AAAc;AAA0B;AACpD;AAA0B;AAAO;AAAK;AAAM;AAAiB;AAAQ;AAAA,wCAEhE;ADcP;AACA;AERO,IAAM,mBAAA,EAAN,MAAM,mBAAkB;AAAA;AAAA;AAAA;AAAA,EAiB7B,WAAA,CAAY,UAAA,EAAwC,QAAA,EAAkB,YAAA,EAA8C;AAAhE,IAAA,6CAAA,IAAA,EAAA,UAAA,EAAA,QAAA,CAAA;AANpD;AAAA;AAAA;AAAA,IAAA,6CAAA,IAAA,EAAS,eAAA,CAAA;AACT,IAAA,6CAAA,IAAA,EAAS,MAAA,CAAA;AAMP,IAAA,GAAA,CAAI,CAAC,MAAA,CAAO,QAAA,CAAS,QAAQ,EAAA,GAAK,SAAA,GAAY,EAAA,GAAK,UAAA,CAAW,OAAA,IAAW,EAAA,GACrE,UAAA,CAAW,IAAA,CAAK,CAAA,KAAA,EAAA,GAAS,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,EAAA,GAAK,MAAA,EAAQ,EAAA,GAAK,MAAA,EAAQ,QAAQ,CAAA,EAAG;AACtF,MAAA,MAAM,IAAI,KAAA,CAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,OAAA,EAAS,CAAC,GAAG,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,EAAA,GAAM,EAAA,EAAI,CAAC,CAAA;AACnD,IAAA,MAAM,UAAA,EAAY,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,EAAA,GAAU,KAAA,EAAO,MAAA,CAAO,KAAK,CAAE,CAAA,CACzE,MAAA,CAAO,CAAA,KAAA,EAAA,GAAS,MAAA,EAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,EAAA,GAAM,EAAA,EAAI,CAAC,CAAA;AAClD,IAAA,IAAA,CAAK,cAAA,mBAAgB,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,OAAA,EAAS,CAAC,CAAC,CAAA,UAAK,kBAAA,CAAkB,uBAAA;AACtF,IAAA,MAAM,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,kBAAA,CAAkB,UAAA,EAAY,IAAA,CAAK,cAAA,EAAgB,kBAAA,CAAkB,aAAa,CAAA;AAE7G,IAAA,MAAM,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,EAAA,GAAU;AAC5C,MAAA,MAAM,IAAA,mBAAM,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA,UAAK,UAAA;AACjC,MAAA,OAAO,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,aAAA,EAAe,IAAI,CAAC,EAAA,EAAI,CAAC,CAAA;AAAA,IAC1F,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,KAAA,EAAO,aAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,CAAA,GAAA,EAAA,GAAO;AAC7C,MAAA,MAAM,UAAA,EAAY,YAAA,CAAa,MAAA,CAAO,CAAA,MAAA,EAAA,GAAU,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,MAAA,GAClE,MAAA,CAAO,MAAA,GAAS,GAAA,CAAI,MAAA,GAAS,MAAA,CAAO,IAAA,GAAO,GAAA,CAAI,GAAG,CAAA;AACpD,MAAA,GAAA,CAAI,SAAA,CAAU,OAAA,IAAW,CAAA,EAAG;AAC1B,QAAA,OAAO,CAAC,CAAA;AAAA,MACV;AACA,MAAA,OAAO,CAAC;AAAA,QACN,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,GAAG,SAAA,CAAU,GAAA,CAAI,CAAA,MAAA,EAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACxD,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAG,SAAA,CAAU,GAAA,CAAI,CAAA,MAAA,EAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,MACtD,CAAC,CAAA;AAAA,IACH,CAAC,EAAA,EAAI,IAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,IAAA,EAAsB;AACxB,IAAA,IAAI,QAAA,EAAU,CAAA;AACd,IAAA,IAAA,CAAA,MAAW,IAAA,GAAO,IAAA,CAAK,IAAA,EAAM;AAC3B,MAAA,GAAA,CAAI,KAAA,GAAQ,GAAA,CAAI,KAAA,EAAO;AACrB,QAAA,KAAA;AAAA,MACF;AACA,MAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,GAAG,EAAA,EAAI,GAAA,CAAI,KAAA;AAAA,IAC3C;AACA,IAAA,OAAO,KAAA,EAAO,OAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,KAAA,EAAe,GAAA,EAAsB;AAC3C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAA,GAAA,EAAA,GAAO,MAAA,GAAS,GAAA,CAAI,MAAA,GAAS,IAAA,GAAO,GAAA,CAAI,GAAG,CAAA;AAAA,EACnE;AACF,CAAA;AAAA;AAAA;AAAA;AAhEE,6CAAA,kBAJW,EAIa,YAAA,EAAa,IAAA,CAAA;AACrC,6CAAA,kBALW,EAKa,eAAA,EAAgB,CAAA,CAAA;AACxC,6CAAA,kBANW,EAMa,uBAAA,EAAwB,EAAA,EAAI,EAAA,CAAA;AAN/C,IAAM,kBAAA,EAAN,kBAAA;AFqEP;AACA;ACvEO,IAAM,oBAAA,EAAN,MAAM,oBAAmB;AAAA;AAAA;AAAA;AAAA,EAW9B,MAAM,OAAA,CAAQ,IAAA,EAA2B;AACvC,IAAA,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,mBAAA,CAAmB,YAAA,EAAc;AAC/C,MAAA,MAAM,IAAI,KAAA,CAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,MAAA,EAAQ,IAAI,sBAAA,CAAM,EAAE,MAAA,EAAQ,IAAI,2BAAA,CAAW,IAAI,CAAA,EAAG,OAAA,EAAS,CAAC,eAAA,EAAK,gBAAI,EAAE,CAAC,CAAA;AAC9E,IAAA,MAAM,WAAA,EAAa,IAAI,eAAA,CAAgB,CAAA;AACvC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,KAAA;AACJ,IAAA,MAAM,QAAA,EAAU,IAAI,OAAA,CAAe,CAAC,CAAA,EAAG,MAAA,EAAA,GAAW;AAChD,MAAA,MAAA,EAAQ,UAAA,CAAW,CAAA,EAAA,GAAM;AACvB,QAAA,UAAA,CAAW,KAAA,CAAM,CAAA;AACjB,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,gCAAgC,CAAC,CAAA;AAAA,MACpD,CAAA,EAAG,mBAAA,CAAmB,SAAS,CAAA;AAAA,IACjC,CAAC,CAAA;AAED,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,QACxB,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,UAAA,CAAW,MAAA,EAAQ,CAAA,KAAA,EAAA,GAAS;AAAE,UAAA,OAAA,EAAS,KAAA;AAAA,QAAO,CAAC,CAAA;AAAA,QACzE;AAAA,MACF,CAAC,CAAA;AAAA,IACH,EAAA,QAAE;AACA,MAAA,UAAA,CAAW,KAAA,CAAM,CAAA;AACjB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAA;AACd,MAAA,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,MAAA,IAAU,YAAA,GAAe,MAAA,CAAO,MAAA,IAAU,UAAA,EAAY;AACzE,QAAA,KAAK,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAA,GAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CAAY,KAAA,EAAmB,MAAA,EAA+C;AAC1F,IAAA,MAAM,QAAA,EAA2B,CAAC,CAAA;AAClC,IAAA,IAAA,MAAA,CAAA,MAAiB,OAAA,GAAU,IAAI,kCAAA,CAAkB,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAA,EAAG;AACjE,MAAA,MAAA,CAAO,cAAA,CAAe,CAAA;AACtB,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AACnB,MAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,mBAAA,CAAmB,cAAA,EAAgB;AACtD,QAAA,MAAM,IAAI,KAAA,CAAM,sCAAsC,CAAA;AAAA,MACxD;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CACZ,KAAA,EACA,QAAA,EACA,MAAA,EACA,cAAA,EACe;AACf,IAAA,MAAM,MAAA,EAAQ,MAAM,KAAA,CAAM,oBAAA,CAAqB,CAAA;AAC/C,IAAA,GAAA,CAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,8BAA8B,CAAA;AAAA,IAChD;AACA,IAAA,MAAM,aAAA,EAAe,MAAM,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,MAAM,CAAA;AACzD,IAAA,MAAM,MAAA,EAAQ,MAAM,KAAA,CAAM,oBAAA,CAAqB,CAAA;AAC/C,IAAA,MAAM,aAAA,EAAe,MAAA,EAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,MAAM,EAAA,EAAI,CAAC,CAAA;AACtE,IAAA,MAAM,SAAA,EAAW,MAAM,KAAA,CAAM,eAAA,CAAgB,CAAA;AAC7C,IAAA,MAAM,YAAA,EAAc,YAAA,CAAa,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,EAAA,GAAA,CAAW;AAAA,MACvD,KAAA,EAAO,MAAA,CAAO,SAAA;AAAA,MACd,GAAA,EAAK,MAAA,CAAO,SAAA,EAAW,EAAA,EAAI,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,SAAA,mCAAW,YAAA,qBAAa,MAAA,EAAQ,CAAC,CAAA,6BAAG,WAAA,UAAa;AAAA,IACxG,CAAA,CAAE,CAAA;AACF,IAAA,MAAM,SAAA,EAAW,IAAI,iBAAA,CAAkB,YAAA,CAAa,GAAA,CAAI,CAAA,MAAA,EAAA,GAAU,MAAA,CAAO,SAAS,CAAA,EAAG,QAAA,EAAU,MAAA,EAAQ,YAAA,EAAc,KAAA,CAAS,CAAA;AAC9H,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,OAAA,IAAW,CAAA,EAAG;AAC9B,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,EAAa,MAAM,KAAA,CAAM,QAAA,CAAS,CAAA;AACxC,IAAA,MAAM,YAAA,EAAc,MAAM,KAAA,CAAM,gBAAA,CAAiB,CAAA;AACjD,IAAA,MAAM,WAAA,EAAa,sBAAM,KAAA,6BAAO,QAAA,mBAAS,GAAA;AACzC,IAAA,MAAM,YAAA,EAAc,sBAAM,KAAA,6BAAO,gBAAA,mBAAiB,GAAA;AAClD,IAAA,GAAA,CAAI,CAAC,WAAA,GAAc,CAAC,YAAA,GAAgB,MAAA,GAAA,CAAU,CAAC,WAAA,GAAc,CAAC,WAAA,CAAA,EAAe;AAC3E,MAAA,MAAM,IAAI,KAAA,CAAM,6BAA6B,CAAA;AAAA,IAC/C;AACA,IAAA,MAAM,OAAA,EAAA,CAAU,MAAM,KAAA,CAAM,SAAA,CAAU,CAAA,CAAA,CAAG,KAAA,IAAS,gBAAA,CAAK,IAAA;AACvD,IAAA,MAAM,SAAA,EAAW,MAAM,KAAA,CAAM,WAAA,CAAY,CAAA;AACzC,IAAA,MAAM,KAAA,EAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAA;AACjC,IAAA,MAAA,CAAO,cAAA,CAAe,CAAA;AAEtB,IAAA,MAAM,OAAA,EAAS,IAAI,uBAAA,CAAO;AAAA,MACxB,MAAA,EAAQ,OAAA,EAAS,IAAI,iCAAA,CAAiB,EAAA,EAAI,IAAI,gCAAA,CAAgB,CAAA;AAAA,MAC9D,MAAA,EAAQ,IAAI,6BAAA,CAAa;AAAA,IAC3B,CAAC,CAAA;AACD,IAAA,cAAA,CAAe,MAAM,CAAA;AACrB,IAAA,MAAM,YAAA,EAAc,IAAI,yCAAA,CAAyB,UAAU,CAAA;AAC3D,IAAA,MAAA,CAAO,aAAA,CAAc,WAAA,EAAa,EAAE,QAAA,EAAU,KAAK,CAAC,CAAA;AACpD,IAAA,MAAM,YAAA,EAAc,WAAA,EAAa,IAAI,yCAAA,CAAyB,UAAU,EAAA,EAAI,KAAA,CAAA;AAC5E,IAAA,GAAA,CAAI,WAAA,EAAa;AACf,MAAA,MAAA,CAAO,aAAA,CAAc,WAAW,CAAA;AAAA,IAClC;AACA,IAAA,MAAM,MAAA,CAAO,KAAA,CAAM,CAAA;AAGnB,IAAA,IAAA,CAAA,MAAW,OAAA,GAAU,YAAA,EAAc;AACjC,MAAA,MAAA,CAAO,cAAA,CAAe,CAAA;AACtB,MAAA,MAAM,UAAA,EAAY,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA;AAC/C,MAAA,MAAMA,UAAAA,EAAW,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,QAAQ,EAAA,EAAI,SAAA;AACpE,MAAA,MAAM,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,EAAE,SAAA,EAAW,QAAA,EAAAA,UAAS,CAAC,CAAA,EAAG,EAAE,aAAA,EAAe,YAAY,CAAC,CAAA;AAAA,IAC7F;AACA,IAAA,WAAA,CAAY,KAAA,CAAM,CAAA;AAElB,IAAA,GAAA,CAAI,YAAA,GAAe,WAAA,EAAa;AAC9B,MAAA,IAAA,CAAA,MAAW,CAAC,KAAA,EAAO,MAAM,EAAA,GAAK,YAAA,CAAa,OAAA,CAAQ,CAAA,EAAG;AACpD,QAAA,MAAA,CAAO,cAAA,CAAe,CAAA;AACtB,QAAA,MAAM,MAAA,EAAQ,WAAA,CAAY,KAAK,CAAA;AAC/B,QAAA,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AAC5C,UAAA,QAAA;AAAA,QACF;AACA,QAAA,MAAM,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,EAAE,SAAA,EAAW,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,SAAS,EAAE,CAAC,CAAA,EAAG,EAAE,aAAA,EAAe,YAAY,CAAC,CAAA;AAAA,MACnH;AACA,MAAA,WAAA,CAAY,KAAA,CAAM,CAAA;AAAA,IACpB;AACA,IAAA,MAAA,CAAO,cAAA,CAAe,CAAA;AACtB,IAAA,MAAM,MAAA,CAAO,QAAA,CAAS,CAAA;AACtB,IAAA,GAAA,CAAI,CAAC,MAAA,CAAO,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,mBAAA,CAAmB,YAAA,EAAc;AAC9F,MAAA,MAAM,IAAI,KAAA,CAAM,8CAA8C,CAAA;AAAA,IAChE;AACA,IAAA,OAAO,IAAI,IAAA,CAAK,CAAC,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,EAAG,EAAE,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,EAC1E;AACF,CAAA;AAAA;AAAA;AAAA;AAnIE,6CAAA,mBAJW,EAIa,WAAA,EAAY,GAAA,CAAA;AACpC,6CAAA,mBALW,EAKa,cAAA,EAAe,GAAA,EAAK,KAAA,EAAO,IAAA,CAAA;AACnD,6CAAA,mBANW,EAMa,gBAAA,EAAiB,GAAA,CAAA;AANpC,IAAM,mBAAA,EAAN,mBAAA;ADqMP;AACE;AACF,gDAAC","file":"/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-ox16QE/source/packages/xmax-sdk/dist/RecordingProcessor-4TP5NICO.cjs","sourcesContent":[null,"import {\n BlobSource, BufferTarget, EncodedAudioPacketSource, EncodedPacketSink,\n EncodedVideoPacketSource, Input, MP4, WEBM, Mp4OutputFormat, Output, WebMOutputFormat,\n type EncodedPacket, type InputTrack,\n} from \"mediabunny\";\nimport { RecordingTimeline } from \"./RecordingTimeline\";\n\n/**\n * 录制完成后裁掉长帧等待;音视频共用按音频包边界对齐的时间映射,不重新编码。\n */\nexport class RecordingProcessor {\n /**\n * 后处理资源上限,与实时连接的清理超时分离\n */\n private static readonly timeoutMs = 10_000;\n private static readonly maximumBytes = 64 * 1024 * 1024;\n private static readonly maximumPackets = 10_000;\n\n /**\n * 裁剪成功返回新文件,无需裁剪时返回原文件;失败交由调用方保留原始录像。\n */\n async process(blob: Blob): Promise<Blob> {\n if (blob.size > RecordingProcessor.maximumBytes) {\n throw new Error(\"Recording is too large to process\");\n }\n\n const input = new Input({ source: new BlobSource(blob), formats: [MP4, WEBM] });\n const controller = new AbortController();\n let output: Output | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error(\"Recording processing timed out\"));\n }, RecordingProcessor.timeoutMs);\n });\n\n try {\n return await Promise.race([\n this.rewrite(input, blob, controller.signal, value => { output = value; }),\n timeout,\n ]);\n } finally {\n controller.abort();\n clearTimeout(timer);\n input.dispose();\n if (output && output.state !== \"finalized\" && output.state !== \"canceled\") {\n void output.cancel().catch(() => {});\n }\n }\n }\n\n /**\n * 读取有限数量的编码包,维持原始解码顺序。\n */\n private async readPackets(track: InputTrack, signal: AbortSignal): Promise<EncodedPacket[]> {\n const packets: EncodedPacket[] = [];\n for await (const packet of new EncodedPacketSink(track).packets()) {\n signal.throwIfAborted();\n packets.push(packet);\n if (packets.length > RecordingProcessor.maximumPackets) {\n throw new Error(\"Recording has too many media packets\");\n }\n }\n return packets;\n }\n\n /**\n * 保留所有视频帧,删除等待区间内的完整音频包,并重新封装两条时间线。\n */\n private async rewrite(\n input: Input,\n original: Blob,\n signal: AbortSignal,\n registerOutput: (output: Output) => void,\n ): Promise<Blob> {\n const video = await input.getPrimaryVideoTrack();\n if (!video) {\n throw new Error(\"Recording has no video track\");\n }\n const videoPackets = await this.readPackets(video, signal);\n const audio = await input.getPrimaryAudioTrack();\n const audioPackets = audio ? await this.readPackets(audio, signal) : [];\n const duration = await input.computeDuration();\n const audioRanges = audioPackets.map((packet, index) => ({\n start: packet.timestamp,\n end: packet.duration > 0 ? packet.timestamp + packet.duration : audioPackets[index + 1]?.timestamp ?? duration,\n }));\n const timeline = new RecordingTimeline(videoPackets.map(packet => packet.timestamp), duration, audio ? audioRanges : undefined);\n if (timeline.cuts.length === 0) {\n return original;\n }\n\n const videoCodec = await video.getCodec();\n const videoConfig = await video.getDecoderConfig();\n const audioCodec = await audio?.getCodec();\n const audioConfig = await audio?.getDecoderConfig();\n if (!videoCodec || !videoConfig || (audio && (!audioCodec || !audioConfig))) {\n throw new Error(\"Unsupported recording codec\");\n }\n const isWebM = (await input.getFormat()).name === WEBM.name;\n const rotation = await video.getRotation();\n const flip = await video.getFlip();\n signal.throwIfAborted();\n\n const output = new Output({\n format: isWebM ? new WebMOutputFormat() : new Mp4OutputFormat(),\n target: new BufferTarget(),\n });\n registerOutput(output);\n const videoSource = new EncodedVideoPacketSource(videoCodec);\n output.addVideoTrack(videoSource, { rotation, flip });\n const audioSource = audioCodec ? new EncodedAudioPacketSource(audioCodec) : undefined;\n if (audioSource) {\n output.addAudioTrack(audioSource);\n }\n await output.start();\n\n // 不指定固定帧率,避免容器把原本不同的显示时间戳量化到同一帧。\n for (const packet of videoPackets) {\n signal.throwIfAborted();\n const timestamp = timeline.map(packet.timestamp);\n const duration = timeline.map(packet.timestamp + packet.duration) - timestamp;\n await videoSource.add(packet.clone({ timestamp, duration }), { decoderConfig: videoConfig });\n }\n videoSource.close();\n\n if (audioSource && audioConfig) {\n for (const [index, packet] of audioPackets.entries()) {\n signal.throwIfAborted();\n const range = audioRanges[index]!;\n if (timeline.removes(range.start, range.end)) {\n continue;\n }\n await audioSource.add(packet.clone({ timestamp: timeline.map(packet.timestamp) }), { decoderConfig: audioConfig });\n }\n audioSource.close();\n }\n signal.throwIfAborted();\n await output.finalize();\n if (!output.target.buffer || output.target.buffer.byteLength > RecordingProcessor.maximumBytes) {\n throw new Error(\"Processed recording exceeds the memory limit\");\n }\n return new Blob([output.target.buffer], { type: output.format.mimeType });\n }\n}\n","/**\n * 原始录制时间线上的区间,单位为秒。\n */\nexport interface RecordingTimeRange {\n start: number;\n end: number;\n}\n\n/**\n * 视频长帧裁剪计划。音视频共用同一映射,避免分别累计时间造成漂移。\n */\nexport class RecordingTimeline {\n /**\n * 长间隔判定与默认帧时长\n */\n private static readonly minimumGap = 0.12;\n private static readonly gapMultiplier = 3;\n private static readonly fallbackFrameDuration = 1 / 30;\n\n /**\n * 原始时长、正常帧时长与待删除区间\n */\n readonly frameDuration: number;\n readonly cuts: readonly RecordingTimeRange[];\n\n /**\n * 从显示时间戳估计正常帧间隔,只裁掉显著超长的等待部分。\n */\n constructor(timestamps: readonly number[], readonly duration: number, audioPackets?: readonly RecordingTimeRange[]) {\n if (!Number.isFinite(duration) || duration <= 0 || timestamps.length === 0 ||\n timestamps.some(value => !Number.isFinite(value) || value < 0 || value > duration)) {\n throw new Error(\"Invalid recording timeline\");\n }\n\n const sorted = [...timestamps].sort((a, b) => a - b);\n const intervals = sorted.slice(1).map((time, index) => time - sorted[index]!)\n .filter(value => value > 0).sort((a, b) => a - b);\n this.frameDuration = intervals[Math.floor(intervals.length / 2)] ?? RecordingTimeline.fallbackFrameDuration;\n const threshold = Math.max(RecordingTimeline.minimumGap, this.frameDuration * RecordingTimeline.gapMultiplier);\n\n const cuts = sorted.flatMap((start, index) => {\n const end = sorted[index + 1] ?? duration;\n return end - start > threshold + 1e-6 ? [{ start: start + this.frameDuration, end }] : [];\n });\n\n // 只删除完全落在等待区间内的音频包;同一裁剪边界同时用于视频,避免重编码延迟。\n this.cuts = audioPackets ? cuts.flatMap(cut => {\n const contained = audioPackets.filter(packet => packet.end > packet.start &&\n packet.start >= cut.start && packet.end <= cut.end);\n if (contained.length === 0) {\n return [];\n }\n return [{\n start: Math.min(...contained.map(packet => packet.start)),\n end: Math.max(...contained.map(packet => packet.end)),\n }];\n }) : cuts;\n }\n\n /**\n * 将原始时间映射到裁剪后的时间;删除区间内的时刻映射到同一接缝。\n */\n map(time: number): number {\n let removed = 0;\n for (const cut of this.cuts) {\n if (time <= cut.start) {\n break;\n }\n removed += Math.min(time, cut.end) - cut.start;\n }\n return time - removed;\n }\n\n /**\n * 判断一个音频包是否位于删除区间;区间已对齐包边界,不会切断压缩数据。\n */\n removes(start: number, end: number): boolean {\n return this.cuts.some(cut => start >= cut.start && end <= cut.end);\n }\n}\n"]}
|
package/dist/{TrajectoryEffectRendering-C7E2KJbV.d.cts → TrajectoryEffectRendering-BKKPO7Uk.d.cts}
RENAMED
|
@@ -60,7 +60,7 @@ declare class RealtimeVideoFormat {
|
|
|
60
60
|
* 上传编码配置
|
|
61
61
|
*/
|
|
62
62
|
/**
|
|
63
|
-
* 最低上传码率,单位为 kbps
|
|
63
|
+
* 最低上传码率,单位为 kbps;缺省为 100,0 表示不设最低码率;仅支持该参数的 RTC 链路生效。
|
|
64
64
|
*/
|
|
65
65
|
readonly minimumBitrate?: number;
|
|
66
66
|
/**
|
|
@@ -77,7 +77,7 @@ declare class RealtimeVideoFormat {
|
|
|
77
77
|
* @param init.width 视频宽度,单位为像素。
|
|
78
78
|
* @param init.height 视频高度,单位为像素。
|
|
79
79
|
* @param init.fps 视频帧率,必须大于 0。
|
|
80
|
-
* @param init.minimumBitrate 最低上传码率,单位为 kbps
|
|
80
|
+
* @param init.minimumBitrate 最低上传码率,单位为 kbps;缺省为 100,仅支持该参数的 RTC 链路生效。
|
|
81
81
|
* @param init.maximumBitrate 最高上传码率,单位为 kbps;缺省按最终上传尺寸和帧率计算。
|
|
82
82
|
* @param init.encoderPreference 上传编码策略偏好,默认值为 maintainFramerate。
|
|
83
83
|
*/
|
package/dist/{TrajectoryEffectRendering-C7E2KJbV.d.ts → TrajectoryEffectRendering-BKKPO7Uk.d.ts}
RENAMED
|
@@ -60,7 +60,7 @@ declare class RealtimeVideoFormat {
|
|
|
60
60
|
* 上传编码配置
|
|
61
61
|
*/
|
|
62
62
|
/**
|
|
63
|
-
* 最低上传码率,单位为 kbps
|
|
63
|
+
* 最低上传码率,单位为 kbps;缺省为 100,0 表示不设最低码率;仅支持该参数的 RTC 链路生效。
|
|
64
64
|
*/
|
|
65
65
|
readonly minimumBitrate?: number;
|
|
66
66
|
/**
|
|
@@ -77,7 +77,7 @@ declare class RealtimeVideoFormat {
|
|
|
77
77
|
* @param init.width 视频宽度,单位为像素。
|
|
78
78
|
* @param init.height 视频高度,单位为像素。
|
|
79
79
|
* @param init.fps 视频帧率,必须大于 0。
|
|
80
|
-
* @param init.minimumBitrate 最低上传码率,单位为 kbps
|
|
80
|
+
* @param init.minimumBitrate 最低上传码率,单位为 kbps;缺省为 100,仅支持该参数的 RTC 链路生效。
|
|
81
81
|
* @param init.maximumBitrate 最高上传码率,单位为 kbps;缺省按最终上传尺寸和帧率计算。
|
|
82
82
|
* @param init.encoderPreference 上传编码策略偏好,默认值为 maintainFramerate。
|
|
83
83
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-
|
|
1
|
+
{"version":3,"sources":["/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-ox16QE/source/packages/xmax-sdk/dist/chunk-4DE2IREA.cjs"],"names":[],"mappings":"AAAA,6EAAI,UAAU,EAAE,MAAM,CAAC,cAAc;AACrC,IAAI,gBAAgB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK;AAC/J,IAAI,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC,GAAG,EAAE,OAAO,IAAI,IAAI,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;AAC9G;AACA;AACE;AACF,sCAAC","file":"/private/var/folders/5j/p3g3j18x2w3byrl5wtnk94tc0000gn/T/xmax-web-release-ox16QE/source/packages/xmax-sdk/dist/chunk-4DE2IREA.cjs"}
|