@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.
- package/README.md +139 -0
- package/dist/agent/__tests__/agent.test.d.ts +1 -0
- package/dist/agent/audio-debug.d.ts +3 -0
- package/dist/agent/audio-uplink.d.ts +62 -0
- package/dist/agent/avatar.cjs +2 -0
- package/dist/agent/avatar.cjs.map +1 -0
- package/dist/agent/avatar.modern.js +2 -0
- package/dist/agent/avatar.modern.js.map +1 -0
- package/dist/agent/avatar.module.js +2 -0
- package/dist/agent/avatar.module.js.map +1 -0
- package/dist/agent/avatar.umd.js +2 -0
- package/dist/agent/avatar.umd.js.map +1 -0
- package/dist/agent/e2e-client.d.ts +32 -0
- package/dist/agent/fixed-audio-track.d.ts +48 -0
- package/dist/agent/index.cjs +5 -0
- package/dist/agent/index.d.ts +104 -0
- package/dist/agent/index.umd.js +10 -0
- package/dist/agent/microphone.d.ts +49 -0
- package/dist/agent/types.d.ts +153 -0
- package/dist/baseRender/AudioRenderer.d.ts +46 -0
- package/dist/baseRender/AudioWorklet.d.ts +78 -0
- package/dist/baseRender/AvatarRenderer.d.ts +226 -0
- package/dist/baseRender/MSEAudioPlayer.d.ts +51 -0
- package/dist/baseRender/UIRenderer.d.ts +39 -0
- package/dist/baseRender/pcm-audio-processor.d.ts +63 -0
- package/dist/control/APIForwarder.d.ts +23 -0
- package/dist/control/DataCacheQueue.d.ts +69 -0
- package/dist/control/EventDispatcher.d.ts +35 -0
- package/dist/control/RenderScheduler.d.ts +162 -0
- package/dist/control/SaveAndDownload.d.ts +14 -0
- package/dist/control/StreamingClient.d.ts +33 -0
- package/dist/control/VideoPlayer.d.ts +47 -0
- package/dist/control/ttsa.d.ts +111 -0
- package/dist/encoding/media-recorder-encoder.d.ts +33 -0
- package/dist/encoding/pcm-webm-encoder.d.ts +13 -0
- package/dist/encoding/webcodec-opus-encoder.d.ts +41 -0
- package/dist/encoding/webm-muxer.d.ts +90 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +231 -0
- package/dist/index.modern.js +2 -0
- package/dist/index.modern.js.map +1 -0
- package/dist/index.module.js +2 -0
- package/dist/index.module.js.map +1 -0
- package/dist/index.umd.js +2 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/modules/Composition.d.ts +28 -0
- package/dist/modules/ResourceManager.d.ts +295 -0
- package/dist/modules/TrackRenderer/base-track.d.ts +4 -0
- package/dist/modules/TrackRenderer/index.d.ts +12 -0
- package/dist/modules/TrackRenderer/render-implements.d.ts +19 -0
- package/dist/modules/TrackRenderer/track-pic.d.ts +8 -0
- package/dist/modules/TrackRenderer/track-subtitle.d.ts +8 -0
- package/dist/modules/cache-manager.d.ts +5 -0
- package/dist/modules/decoder.d.ts +84 -0
- package/dist/modules/error-handle.d.ts +17 -0
- package/dist/modules/network.d.ts +21 -0
- package/dist/proto/face_data_pb.d.ts +0 -0
- package/dist/types/capability.d.ts +15 -0
- package/dist/types/error.d.ts +70 -0
- package/dist/types/event.d.ts +25 -0
- package/dist/types/frame-data.d.ts +107 -0
- package/dist/types/index.d.ts +187 -0
- package/dist/types/render.d.ts +18 -0
- package/dist/utils/DataInterface.d.ts +113 -0
- package/dist/utils/GLDevice.d.ts +46 -0
- package/dist/utils/GLPipeline.d.ts +84 -0
- package/dist/utils/GLPipelineDebugTools.d.ts +5 -0
- package/dist/utils/Math.d.ts +21 -0
- package/dist/utils/__tests__/capability-checker.test.d.ts +1 -0
- package/dist/utils/audio-session.d.ts +11 -0
- package/dist/utils/audio.d.ts +1 -0
- package/dist/utils/capability-checker.d.ts +23 -0
- package/dist/utils/encodeToken.d.ts +7 -0
- package/dist/utils/face.d.ts +1 -0
- package/dist/utils/float32-decoder.d.ts +26 -0
- package/dist/utils/fpsTracker.d.ts +27 -0
- package/dist/utils/index.d.ts +22 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/media-recorder-timestamp.d.ts +15 -0
- package/dist/utils/pcmAnalyzer.d.ts +40 -0
- package/dist/utils/perfermance.d.ts +15 -0
- package/dist/utils/request.d.ts +19 -0
- package/dist/utils/requestAnimateFrames.d.ts +31 -0
- package/dist/utils/time.d.ts +9 -0
- package/dist/view/DebugOverlay.d.ts +54 -0
- package/dist/worker/streaming-video.d.ts +1 -0
- package/package.json +82 -0
- package/src/agent/__tests__/agent.test.ts +3787 -0
- package/src/agent/audio-debug.ts +36 -0
- package/src/agent/audio-uplink.ts +392 -0
- package/src/agent/e2e-client.ts +215 -0
- package/src/agent/fixed-audio-track.ts +547 -0
- package/src/agent/index.ts +1393 -0
- package/src/agent/microphone.ts +534 -0
- package/src/agent/types.ts +197 -0
- package/src/baseRender/AudioRenderer.ts +317 -0
- package/src/baseRender/AudioWorklet.ts +776 -0
- package/src/baseRender/AvatarRenderer.ts +1559 -0
- package/src/baseRender/MSEAudioPlayer.ts +243 -0
- package/src/baseRender/UIRenderer.ts +195 -0
- package/src/baseRender/pcm-audio-processor.js +267 -0
- package/src/control/APIForwarder.ts +67 -0
- package/src/control/DataCacheQueue.ts +372 -0
- package/src/control/EventDispatcher.ts +106 -0
- package/src/control/RenderScheduler.ts +945 -0
- package/src/control/SaveAndDownload.js +77 -0
- package/src/control/StreamingClient.ts +138 -0
- package/src/control/VideoPlayer.ts +306 -0
- package/src/control/ttsa.ts +676 -0
- package/src/encoding/media-recorder-encoder.ts +175 -0
- package/src/encoding/pcm-webm-encoder.ts +72 -0
- package/src/encoding/webcodec-opus-encoder.ts +258 -0
- package/src/encoding/webm-muxer.ts +337 -0
- package/src/global.d.ts +105 -0
- package/src/index.ts +1920 -0
- package/src/modules/Composition.ts +79 -0
- package/src/modules/ResourceManager.ts +899 -0
- package/src/modules/TrackRenderer/base-track.ts +7 -0
- package/src/modules/TrackRenderer/index.ts +40 -0
- package/src/modules/TrackRenderer/render-implements.ts +269 -0
- package/src/modules/TrackRenderer/track-pic.ts +19 -0
- package/src/modules/TrackRenderer/track-subtitle.ts +16 -0
- package/src/modules/cache-manager.ts +10 -0
- package/src/modules/decoder.ts +515 -0
- package/src/modules/error-handle.ts +20 -0
- package/src/modules/network.ts +71 -0
- package/src/proto/face_data.proto +45 -0
- package/src/proto/face_data_pb.js +1297 -0
- package/src/proto/protobuf.min.js +8 -0
- package/src/types/capability.ts +23 -0
- package/src/types/error.ts +211 -0
- package/src/types/event.ts +38 -0
- package/src/types/frame-data.ts +121 -0
- package/src/types/index.ts +207 -0
- package/src/types/render.ts +18 -0
- package/src/utils/DataInterface.ts +746 -0
- package/src/utils/GLDevice.ts +286 -0
- package/src/utils/GLPipeline.ts +1293 -0
- package/src/utils/GLPipelineDebugTools.ts +174 -0
- package/src/utils/Math.ts +266 -0
- package/src/utils/__tests__/capability-checker.test.ts +159 -0
- package/src/utils/audio-session.ts +144 -0
- package/src/utils/audio.ts +44 -0
- package/src/utils/blueimp-md5.d.ts +3 -0
- package/src/utils/capability-checker.ts +379 -0
- package/src/utils/encodeToken.ts +100 -0
- package/src/utils/face.ts +29 -0
- package/src/utils/float32-decoder.js +130 -0
- package/src/utils/fpsTracker.ts +100 -0
- package/src/utils/index.ts +182 -0
- package/src/utils/logger.js +36 -0
- package/src/utils/media-recorder-timestamp.ts +79 -0
- package/src/utils/pcmAnalyzer.ts +154 -0
- package/src/utils/perfermance.ts +141 -0
- package/src/utils/request.ts +95 -0
- package/src/utils/requestAnimateFrames.ts +195 -0
- package/src/utils/time.ts +32 -0
- package/src/view/DebugOverlay.ts +404 -0
- package/src/worker/streaming-video.ts +4647 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StreamingClient - 薄客户端模式下的 WebSocket 连接管理器
|
|
3
|
+
* 负责与 Streaming Server 建立连接,管理消息路由、心跳和重连。
|
|
4
|
+
*/
|
|
5
|
+
export interface StreamingClientOptions {
|
|
6
|
+
url: string;
|
|
7
|
+
onReady?: () => void;
|
|
8
|
+
onOffer?: (sdp: string) => void;
|
|
9
|
+
onIce?: (candidate: RTCIceCandidateInit) => void;
|
|
10
|
+
onEventProxy?: (eventType: string, data: any, serverFrame?: number) => void;
|
|
11
|
+
onError?: (error: string) => void;
|
|
12
|
+
onDisconnect?: () => void;
|
|
13
|
+
}
|
|
14
|
+
export declare class StreamingClient {
|
|
15
|
+
private ws;
|
|
16
|
+
private options;
|
|
17
|
+
private retryCount;
|
|
18
|
+
private maxRetry;
|
|
19
|
+
private retryTimer;
|
|
20
|
+
private destroyed;
|
|
21
|
+
private connected;
|
|
22
|
+
constructor(options: StreamingClientOptions);
|
|
23
|
+
connect(): void;
|
|
24
|
+
private handleMessage;
|
|
25
|
+
send(msg: object): void;
|
|
26
|
+
/**
|
|
27
|
+
* 发送 API 调用
|
|
28
|
+
*/
|
|
29
|
+
sendApiCall(method: string, params?: any[]): void;
|
|
30
|
+
private scheduleRetry;
|
|
31
|
+
isConnected(): boolean;
|
|
32
|
+
destroy(): void;
|
|
33
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VideoPlayer - 薄客户端模式下的 WebRTC 收流与播放管理
|
|
3
|
+
* 支持两种模式:
|
|
4
|
+
* - 普通模式:直接 <video> 播放
|
|
5
|
+
* - Alpha Mask 模式:canvas 渲染 + 双路流 alpha 合成(透明背景)
|
|
6
|
+
*/
|
|
7
|
+
import { StreamingClient } from './StreamingClient';
|
|
8
|
+
export interface VideoPlayerOptions {
|
|
9
|
+
container: HTMLElement;
|
|
10
|
+
streamingClient: StreamingClient;
|
|
11
|
+
useAlphaMask?: boolean;
|
|
12
|
+
onConnected?: () => void;
|
|
13
|
+
onDisconnected?: () => void;
|
|
14
|
+
}
|
|
15
|
+
export declare class VideoPlayer {
|
|
16
|
+
private video;
|
|
17
|
+
private canvas;
|
|
18
|
+
private canvasCtx;
|
|
19
|
+
private pc;
|
|
20
|
+
private stream;
|
|
21
|
+
private options;
|
|
22
|
+
private destroyed;
|
|
23
|
+
private animFrameId;
|
|
24
|
+
private tempCanvas;
|
|
25
|
+
private tempCtx;
|
|
26
|
+
constructor(options: VideoPlayerOptions);
|
|
27
|
+
private createVideoElement;
|
|
28
|
+
private createCanvasElement;
|
|
29
|
+
/**
|
|
30
|
+
* 处理远端 SDP offer,创建 answer 并通过 StreamingClient 回传
|
|
31
|
+
*/
|
|
32
|
+
handleOffer(sdp: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Alpha Mask 渲染循环
|
|
35
|
+
* 将双路流(RGB + Alpha)合成为带透明度的画面
|
|
36
|
+
*/
|
|
37
|
+
private startAlphaRendering;
|
|
38
|
+
/**
|
|
39
|
+
* 添加 ICE candidate
|
|
40
|
+
*/
|
|
41
|
+
addIceCandidate(candidate: RTCIceCandidateInit): Promise<void>;
|
|
42
|
+
getVideoElement(): HTMLVideoElement | null;
|
|
43
|
+
getCanvasElement(): HTMLCanvasElement | null;
|
|
44
|
+
isConnected(): boolean;
|
|
45
|
+
private destroyPeer;
|
|
46
|
+
destroy(): void;
|
|
47
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { EFrameDataType, IRawFrameData, StateChangeInfo } from "../types/frame-data";
|
|
2
|
+
import type XmovAvatar from "../index";
|
|
3
|
+
import { DeviceInfo, Layout, WalkConfig } from "../types";
|
|
4
|
+
import { IResumeParams } from "../modules/ResourceManager";
|
|
5
|
+
import '../proto/protobuf.min';
|
|
6
|
+
import '../proto/face_data_pb';
|
|
7
|
+
interface ITtsaOptions {
|
|
8
|
+
sdkInstance: XmovAvatar;
|
|
9
|
+
url: string;
|
|
10
|
+
room: string;
|
|
11
|
+
session_id: string;
|
|
12
|
+
token: string;
|
|
13
|
+
appInfo: {
|
|
14
|
+
appId: string;
|
|
15
|
+
env: string;
|
|
16
|
+
};
|
|
17
|
+
framedata_proto_version: number;
|
|
18
|
+
onReady(): void;
|
|
19
|
+
handleMessage: (type: EFrameDataType, data: IRawFrameData[]) => void;
|
|
20
|
+
handleAAFrame: (data: any) => void;
|
|
21
|
+
runStartFrameIndex: (server_time: number) => void;
|
|
22
|
+
ttsaStateChangeHandle: (state: StateChangeInfo) => void;
|
|
23
|
+
reloadSuccess: () => void;
|
|
24
|
+
enterOfflineMode: () => void;
|
|
25
|
+
reStartSDK: () => void;
|
|
26
|
+
reconnect_client_timeout: number;
|
|
27
|
+
sendVoiceEnd: () => void;
|
|
28
|
+
getCurrentFrameIndex: () => number;
|
|
29
|
+
}
|
|
30
|
+
export default class Ttsa {
|
|
31
|
+
private TAG;
|
|
32
|
+
private ws;
|
|
33
|
+
private room;
|
|
34
|
+
private session_id;
|
|
35
|
+
private token;
|
|
36
|
+
private framedata_proto_version;
|
|
37
|
+
private getResumeInfo?;
|
|
38
|
+
private runStartFrameIndex;
|
|
39
|
+
private ttsaStateChangeHandle;
|
|
40
|
+
private sdk;
|
|
41
|
+
private reloadSuccess;
|
|
42
|
+
private _lastSessionId;
|
|
43
|
+
private _uniqueSpeakId;
|
|
44
|
+
private session_speak_req_id;
|
|
45
|
+
private enterOfflineMode;
|
|
46
|
+
private reStartSDK;
|
|
47
|
+
private reconnect_client_timeout;
|
|
48
|
+
private reconnectTimer;
|
|
49
|
+
private wsConnectTimer;
|
|
50
|
+
private enterOfflineFlag;
|
|
51
|
+
private sendVoiceEnd;
|
|
52
|
+
private syncTimestampInterval;
|
|
53
|
+
private syncTimestampNum;
|
|
54
|
+
private readonly SYNC_INTERVAL;
|
|
55
|
+
private lastSyncTime;
|
|
56
|
+
private getCurrentFrameIndex;
|
|
57
|
+
private heartbeatTimer;
|
|
58
|
+
private readonly HEARTBEAT_INTERVAL;
|
|
59
|
+
/**
|
|
60
|
+
* 清除WebSocket重连定时器
|
|
61
|
+
*/
|
|
62
|
+
clearReconnectTimer(): void;
|
|
63
|
+
/**
|
|
64
|
+
* 启动客户端心跳(每 2s 发送一次 client_heartbeat)
|
|
65
|
+
*/
|
|
66
|
+
private startHeartbeat;
|
|
67
|
+
/**
|
|
68
|
+
* 停止客户端心跳
|
|
69
|
+
*/
|
|
70
|
+
private stopHeartbeat;
|
|
71
|
+
private _isResume;
|
|
72
|
+
private appInfo;
|
|
73
|
+
constructor(options: ITtsaOptions);
|
|
74
|
+
clearOldWsTimeoutTimer: () => void;
|
|
75
|
+
initWsTimeoutTimer: () => void;
|
|
76
|
+
start(): void;
|
|
77
|
+
idle(): void;
|
|
78
|
+
listen(): void;
|
|
79
|
+
think(): void;
|
|
80
|
+
interactiveidle(): void;
|
|
81
|
+
/**
|
|
82
|
+
* 通知后端进入隐身模式
|
|
83
|
+
*/
|
|
84
|
+
enterInvisibleMode(): void;
|
|
85
|
+
/**
|
|
86
|
+
* 通知后端退出隐身模式
|
|
87
|
+
*/
|
|
88
|
+
exitInvisibleMode(): void;
|
|
89
|
+
firstStartTimestamp(server_time: number): void;
|
|
90
|
+
syncTimestamp(): void;
|
|
91
|
+
sendSyncTimestamp(client_frame: number): void;
|
|
92
|
+
sendText(ssml: string, is_start: boolean, is_end: boolean, extra?: {
|
|
93
|
+
client_speak_id: string;
|
|
94
|
+
}): string | undefined;
|
|
95
|
+
sendSdkPoint(name: string, params?: any, extra?: any): void;
|
|
96
|
+
stateChange(state: string, params?: object): void;
|
|
97
|
+
sendPerfLog(payload: object): void;
|
|
98
|
+
changeLayout(layout: Layout): void;
|
|
99
|
+
changeWalkConfig(walkConfig: WalkConfig): void;
|
|
100
|
+
send(event: string, payload: Object): void;
|
|
101
|
+
sendDeviceInfo(deviceInfo: DeviceInfo): void;
|
|
102
|
+
getStatus(): boolean;
|
|
103
|
+
_setResumeInfoCallback(lastSessionId: string, _getResumeInfo: () => IResumeParams): void;
|
|
104
|
+
_getResumeInfo(): IResumeParams | null;
|
|
105
|
+
updateUniqueSpeakId(): void;
|
|
106
|
+
getUniqueSpeakId(): string;
|
|
107
|
+
close(): void;
|
|
108
|
+
connect(): void;
|
|
109
|
+
seekToFrame(frame: number): void;
|
|
110
|
+
}
|
|
111
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MediaRecorder 降级编码器
|
|
3
|
+
* 对于不支持 WebCodecs Opus 但支持 MediaRecorder webm/opus 的平台(Safari 18.4+)
|
|
4
|
+
* 通过 16kHz AudioContext + PCMInjectorProcessor + MediaRecorder 实现 Opus 编码
|
|
5
|
+
*/
|
|
6
|
+
export declare class MediaRecorderEncoder {
|
|
7
|
+
private audioCtx;
|
|
8
|
+
private workletNode;
|
|
9
|
+
private destination;
|
|
10
|
+
private recorder;
|
|
11
|
+
private isRecording;
|
|
12
|
+
private nextResolve;
|
|
13
|
+
private dataQueue;
|
|
14
|
+
/**
|
|
15
|
+
* 检测当前浏览器是否支持 MediaRecorder webm/opus
|
|
16
|
+
*/
|
|
17
|
+
static isSupported(): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* 初始化:创建 16kHz AudioContext + 中转 Worklet + MediaRecorder
|
|
20
|
+
*/
|
|
21
|
+
init(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* 注入 PCM 数据并等待编码输出
|
|
24
|
+
* @param pcmData S16LE PCM ArrayBuffer (16kHz)
|
|
25
|
+
* @returns 编码后的 WebM 数据,或 null
|
|
26
|
+
*/
|
|
27
|
+
feedPCM(pcmData: ArrayBuffer): Promise<ArrayBuffer | null>;
|
|
28
|
+
/**
|
|
29
|
+
* 重置(新 speak 段开始时调用)
|
|
30
|
+
*/
|
|
31
|
+
reset(): void;
|
|
32
|
+
destroy(): void;
|
|
33
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class PcmWebMEncoder {
|
|
2
|
+
private readonly opusEncoder;
|
|
3
|
+
private readonly muxer;
|
|
4
|
+
private queue;
|
|
5
|
+
private generation;
|
|
6
|
+
private destroyed;
|
|
7
|
+
private pendingBlocks;
|
|
8
|
+
static isSupported(): Promise<boolean>;
|
|
9
|
+
init(): Promise<void>;
|
|
10
|
+
encode(pcm: Int16Array): Promise<ArrayBuffer>;
|
|
11
|
+
reset(): void;
|
|
12
|
+
destroy(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebCodecs AudioEncoder Opus 编码封装
|
|
3
|
+
* 使用浏览器原生 WebCodecs API 将 PCM 音频编码为 Opus 帧
|
|
4
|
+
*/
|
|
5
|
+
export interface OpusEncoderConfig {
|
|
6
|
+
sampleRate: number;
|
|
7
|
+
channels: number;
|
|
8
|
+
bitrate: number;
|
|
9
|
+
frameSize: number;
|
|
10
|
+
}
|
|
11
|
+
export interface EncodedOpusFrame {
|
|
12
|
+
data: Uint8Array;
|
|
13
|
+
durationMs: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class WebCodecOpusEncoder {
|
|
16
|
+
private encoder;
|
|
17
|
+
private config;
|
|
18
|
+
private isInitialized;
|
|
19
|
+
private pendingEncode;
|
|
20
|
+
private timestamp;
|
|
21
|
+
constructor(config?: Partial<OpusEncoderConfig>);
|
|
22
|
+
/**
|
|
23
|
+
* 检测当前浏览器是否支持 WebCodecs Opus 编码
|
|
24
|
+
*/
|
|
25
|
+
static isSupported(): Promise<boolean>;
|
|
26
|
+
init(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* 异步编码 PCM 为 Opus 帧
|
|
29
|
+
* @param pcm S16LE PCM 数据 (Int16Array, 1600 samples = 100ms)
|
|
30
|
+
* @returns 保留 packet 边界和时长的 Opus 帧数组
|
|
31
|
+
*/
|
|
32
|
+
encode(pcm: Int16Array): Promise<EncodedOpusFrame[]>;
|
|
33
|
+
/**
|
|
34
|
+
* 重置时间戳(新 speak 段开始时调用)
|
|
35
|
+
*/
|
|
36
|
+
reset(): void;
|
|
37
|
+
destroy(): Promise<void>;
|
|
38
|
+
private createEncoder;
|
|
39
|
+
private handleOutput;
|
|
40
|
+
private failPending;
|
|
41
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
export declare class WebMMuxer {
|
|
9
|
+
private chunks;
|
|
10
|
+
private hasHeader;
|
|
11
|
+
private clusterTimestamp;
|
|
12
|
+
private sampleRate;
|
|
13
|
+
private frameDuration;
|
|
14
|
+
constructor(sampleRate?: number);
|
|
15
|
+
/**
|
|
16
|
+
* 写入 WebM 文件头(EBML Header + Segment Info + Track)
|
|
17
|
+
*/
|
|
18
|
+
writeHeader(): void;
|
|
19
|
+
/**
|
|
20
|
+
* 写入 Opus 帧
|
|
21
|
+
* @param opusFrame Opus 编码后的数据
|
|
22
|
+
* @param durationMs 帧时长 (默认 100ms)
|
|
23
|
+
*/
|
|
24
|
+
feedOpusFrame(opusFrame: Uint8Array, durationMs?: number): void;
|
|
25
|
+
/**
|
|
26
|
+
* 获取新增的 WebM 数据(自上次 flush 以来的数据)
|
|
27
|
+
* 返回后清空已返回的数据,避免重复发送
|
|
28
|
+
*/
|
|
29
|
+
flush(): ArrayBuffer;
|
|
30
|
+
/**
|
|
31
|
+
* 重置(新 speak 段开始时调用)
|
|
32
|
+
*/
|
|
33
|
+
reset(): void;
|
|
34
|
+
/**
|
|
35
|
+
* 编码 VINT(Variable-length Integer)
|
|
36
|
+
*/
|
|
37
|
+
private encodeVINT;
|
|
38
|
+
/**
|
|
39
|
+
* 编码 EBML Element ID
|
|
40
|
+
*/
|
|
41
|
+
private encodeID;
|
|
42
|
+
/**
|
|
43
|
+
* 编码无符号整数
|
|
44
|
+
*/
|
|
45
|
+
private encodeUint;
|
|
46
|
+
/**
|
|
47
|
+
* 编码字符串
|
|
48
|
+
*/
|
|
49
|
+
private encodeString;
|
|
50
|
+
/**
|
|
51
|
+
* 编码浮点数(32-bit IEEE 754)
|
|
52
|
+
*/
|
|
53
|
+
private encodeFloat32;
|
|
54
|
+
/**
|
|
55
|
+
* 编码 EBML Element = ID + Size + Data
|
|
56
|
+
*/
|
|
57
|
+
private encodeElement;
|
|
58
|
+
/**
|
|
59
|
+
* 编码 unsigned integer Element
|
|
60
|
+
*/
|
|
61
|
+
private encodeUintElement;
|
|
62
|
+
/**
|
|
63
|
+
* 编码 string Element
|
|
64
|
+
*/
|
|
65
|
+
private encodeStringElement;
|
|
66
|
+
/**
|
|
67
|
+
* 编码 float32 Element
|
|
68
|
+
*/
|
|
69
|
+
private encodeFloat32Element;
|
|
70
|
+
/**
|
|
71
|
+
* 合并多个 Uint8Array
|
|
72
|
+
*/
|
|
73
|
+
private concatArrays;
|
|
74
|
+
/**
|
|
75
|
+
* 构建 EBML Header
|
|
76
|
+
*/
|
|
77
|
+
private buildEBMLHeader;
|
|
78
|
+
/**
|
|
79
|
+
* 构建 SegmentInfo
|
|
80
|
+
*/
|
|
81
|
+
private buildSegmentInfo;
|
|
82
|
+
/**
|
|
83
|
+
* 构建 Opus Audio Track
|
|
84
|
+
*/
|
|
85
|
+
private buildOpusTracks;
|
|
86
|
+
/**
|
|
87
|
+
* 构建 Cluster + SimpleBlock
|
|
88
|
+
*/
|
|
89
|
+
private buildCluster;
|
|
90
|
+
}
|