@livepeer-frameworks/player-core 0.0.3
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/dist/cjs/index.js +19493 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/index.js +19398 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/player.css +2140 -0
- package/dist/types/core/ABRController.d.ts +164 -0
- package/dist/types/core/CodecUtils.d.ts +54 -0
- package/dist/types/core/Disposable.d.ts +61 -0
- package/dist/types/core/EventEmitter.d.ts +73 -0
- package/dist/types/core/GatewayClient.d.ts +144 -0
- package/dist/types/core/InteractionController.d.ts +121 -0
- package/dist/types/core/LiveDurationProxy.d.ts +102 -0
- package/dist/types/core/MetaTrackManager.d.ts +220 -0
- package/dist/types/core/MistReporter.d.ts +163 -0
- package/dist/types/core/MistSignaling.d.ts +148 -0
- package/dist/types/core/PlayerController.d.ts +665 -0
- package/dist/types/core/PlayerInterface.d.ts +230 -0
- package/dist/types/core/PlayerManager.d.ts +182 -0
- package/dist/types/core/PlayerRegistry.d.ts +27 -0
- package/dist/types/core/QualityMonitor.d.ts +184 -0
- package/dist/types/core/ScreenWakeLockManager.d.ts +70 -0
- package/dist/types/core/SeekingUtils.d.ts +142 -0
- package/dist/types/core/StreamStateClient.d.ts +108 -0
- package/dist/types/core/SubtitleManager.d.ts +111 -0
- package/dist/types/core/TelemetryReporter.d.ts +79 -0
- package/dist/types/core/TimeFormat.d.ts +97 -0
- package/dist/types/core/TimerManager.d.ts +83 -0
- package/dist/types/core/UrlUtils.d.ts +81 -0
- package/dist/types/core/detector.d.ts +149 -0
- package/dist/types/core/index.d.ts +49 -0
- package/dist/types/core/scorer.d.ts +167 -0
- package/dist/types/core/selector.d.ts +9 -0
- package/dist/types/index.d.ts +45 -0
- package/dist/types/lib/utils.d.ts +2 -0
- package/dist/types/players/DashJsPlayer.d.ts +102 -0
- package/dist/types/players/HlsJsPlayer.d.ts +70 -0
- package/dist/types/players/MewsWsPlayer/SourceBufferManager.d.ts +119 -0
- package/dist/types/players/MewsWsPlayer/WebSocketManager.d.ts +60 -0
- package/dist/types/players/MewsWsPlayer/index.d.ts +220 -0
- package/dist/types/players/MewsWsPlayer/types.d.ts +89 -0
- package/dist/types/players/MistPlayer.d.ts +25 -0
- package/dist/types/players/MistWebRTCPlayer/index.d.ts +133 -0
- package/dist/types/players/NativePlayer.d.ts +143 -0
- package/dist/types/players/VideoJsPlayer.d.ts +59 -0
- package/dist/types/players/WebCodecsPlayer/JitterBuffer.d.ts +118 -0
- package/dist/types/players/WebCodecsPlayer/LatencyProfiles.d.ts +64 -0
- package/dist/types/players/WebCodecsPlayer/RawChunkParser.d.ts +63 -0
- package/dist/types/players/WebCodecsPlayer/SyncController.d.ts +174 -0
- package/dist/types/players/WebCodecsPlayer/WebSocketController.d.ts +164 -0
- package/dist/types/players/WebCodecsPlayer/index.d.ts +149 -0
- package/dist/types/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.d.ts +105 -0
- package/dist/types/players/WebCodecsPlayer/types.d.ts +395 -0
- package/dist/types/players/WebCodecsPlayer/worker/decoder.worker.d.ts +13 -0
- package/dist/types/players/WebCodecsPlayer/worker/types.d.ts +197 -0
- package/dist/types/players/index.d.ts +14 -0
- package/dist/types/styles/index.d.ts +11 -0
- package/dist/types/types.d.ts +363 -0
- package/dist/types/vanilla/FrameWorksPlayer.d.ts +143 -0
- package/dist/types/vanilla/index.d.ts +19 -0
- package/dist/workers/decoder.worker.js +989 -0
- package/dist/workers/decoder.worker.js.map +1 -0
- package/package.json +80 -0
- package/src/core/ABRController.ts +550 -0
- package/src/core/CodecUtils.ts +257 -0
- package/src/core/Disposable.ts +120 -0
- package/src/core/EventEmitter.ts +113 -0
- package/src/core/GatewayClient.ts +439 -0
- package/src/core/InteractionController.ts +712 -0
- package/src/core/LiveDurationProxy.ts +270 -0
- package/src/core/MetaTrackManager.ts +753 -0
- package/src/core/MistReporter.ts +543 -0
- package/src/core/MistSignaling.ts +346 -0
- package/src/core/PlayerController.ts +2829 -0
- package/src/core/PlayerInterface.ts +432 -0
- package/src/core/PlayerManager.ts +900 -0
- package/src/core/PlayerRegistry.ts +149 -0
- package/src/core/QualityMonitor.ts +597 -0
- package/src/core/ScreenWakeLockManager.ts +163 -0
- package/src/core/SeekingUtils.ts +364 -0
- package/src/core/StreamStateClient.ts +457 -0
- package/src/core/SubtitleManager.ts +297 -0
- package/src/core/TelemetryReporter.ts +308 -0
- package/src/core/TimeFormat.ts +205 -0
- package/src/core/TimerManager.ts +209 -0
- package/src/core/UrlUtils.ts +179 -0
- package/src/core/detector.ts +382 -0
- package/src/core/index.ts +140 -0
- package/src/core/scorer.ts +553 -0
- package/src/core/selector.ts +16 -0
- package/src/global.d.ts +11 -0
- package/src/index.ts +75 -0
- package/src/lib/utils.ts +6 -0
- package/src/players/DashJsPlayer.ts +642 -0
- package/src/players/HlsJsPlayer.ts +483 -0
- package/src/players/MewsWsPlayer/SourceBufferManager.ts +572 -0
- package/src/players/MewsWsPlayer/WebSocketManager.ts +241 -0
- package/src/players/MewsWsPlayer/index.ts +1065 -0
- package/src/players/MewsWsPlayer/types.ts +106 -0
- package/src/players/MistPlayer.ts +188 -0
- package/src/players/MistWebRTCPlayer/index.ts +703 -0
- package/src/players/NativePlayer.ts +820 -0
- package/src/players/VideoJsPlayer.ts +643 -0
- package/src/players/WebCodecsPlayer/JitterBuffer.ts +299 -0
- package/src/players/WebCodecsPlayer/LatencyProfiles.ts +151 -0
- package/src/players/WebCodecsPlayer/RawChunkParser.ts +151 -0
- package/src/players/WebCodecsPlayer/SyncController.ts +456 -0
- package/src/players/WebCodecsPlayer/WebSocketController.ts +564 -0
- package/src/players/WebCodecsPlayer/index.ts +1650 -0
- package/src/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.ts +379 -0
- package/src/players/WebCodecsPlayer/types.ts +542 -0
- package/src/players/WebCodecsPlayer/worker/decoder.worker.ts +1360 -0
- package/src/players/WebCodecsPlayer/worker/types.ts +276 -0
- package/src/players/index.ts +22 -0
- package/src/styles/animations.css +21 -0
- package/src/styles/index.ts +52 -0
- package/src/styles/player.css +2126 -0
- package/src/styles/tailwind.css +1015 -0
- package/src/types.ts +421 -0
- package/src/vanilla/FrameWorksPlayer.ts +367 -0
- package/src/vanilla/index.ts +22 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocketController - Control Channel & Binary Frame Routing
|
|
3
|
+
*
|
|
4
|
+
* Manages WebSocket connection to MistServer for raw frame streaming.
|
|
5
|
+
* Handles:
|
|
6
|
+
* - JSON control messages (play, hold, seek, etc.)
|
|
7
|
+
* - Binary frame routing to chunk parser
|
|
8
|
+
* - Reconnection with exponential backoff
|
|
9
|
+
* - Server delay estimation
|
|
10
|
+
*
|
|
11
|
+
* Based on MewsWsPlayer WebSocketManager with raw frame protocol support.
|
|
12
|
+
*/
|
|
13
|
+
import type { ControlCommand, CodecDataMessage, InfoMessage, OnTimeMessage, RawChunk, TrackInfo } from './types';
|
|
14
|
+
/** Connection states */
|
|
15
|
+
export type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';
|
|
16
|
+
/** Event types emitted by WebSocketController */
|
|
17
|
+
export interface WebSocketControllerEvents {
|
|
18
|
+
statechange: ConnectionState;
|
|
19
|
+
codecdata: CodecDataMessage;
|
|
20
|
+
info: InfoMessage;
|
|
21
|
+
ontime: OnTimeMessage;
|
|
22
|
+
tracks: TrackInfo[];
|
|
23
|
+
chunk: RawChunk;
|
|
24
|
+
stop: void;
|
|
25
|
+
error: Error;
|
|
26
|
+
}
|
|
27
|
+
type EventListener<K extends keyof WebSocketControllerEvents> = (data: WebSocketControllerEvents[K]) => void;
|
|
28
|
+
/** Options for WebSocketController */
|
|
29
|
+
export interface WebSocketControllerOptions {
|
|
30
|
+
/** Enable debug logging */
|
|
31
|
+
debug?: boolean;
|
|
32
|
+
/** Maximum reconnection attempts (0 = unlimited) */
|
|
33
|
+
maxReconnectAttempts?: number;
|
|
34
|
+
/** Initial reconnection delay (ms) */
|
|
35
|
+
reconnectDelayMs?: number;
|
|
36
|
+
/** Maximum reconnection delay (ms) */
|
|
37
|
+
maxReconnectDelayMs?: number;
|
|
38
|
+
/** Connection timeout (ms) */
|
|
39
|
+
connectionTimeoutMs?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* WebSocketController - Manages raw frame WebSocket connection
|
|
43
|
+
*/
|
|
44
|
+
export declare class WebSocketController {
|
|
45
|
+
private ws;
|
|
46
|
+
private url;
|
|
47
|
+
private options;
|
|
48
|
+
private state;
|
|
49
|
+
private reconnectAttempts;
|
|
50
|
+
private reconnectTimer;
|
|
51
|
+
private connectionTimer;
|
|
52
|
+
private listeners;
|
|
53
|
+
private serverDelay;
|
|
54
|
+
private intentionalClose;
|
|
55
|
+
constructor(url: string, options?: WebSocketControllerOptions);
|
|
56
|
+
/**
|
|
57
|
+
* Connect to WebSocket server
|
|
58
|
+
*/
|
|
59
|
+
connect(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Disconnect from WebSocket server
|
|
62
|
+
*/
|
|
63
|
+
disconnect(): void;
|
|
64
|
+
/**
|
|
65
|
+
* Send a control command
|
|
66
|
+
*/
|
|
67
|
+
send(command: ControlCommand): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Request playback start
|
|
70
|
+
*/
|
|
71
|
+
play(): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Request playback pause
|
|
74
|
+
*/
|
|
75
|
+
hold(): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Seek to position
|
|
78
|
+
* @param timeMs - Target time in milliseconds
|
|
79
|
+
* @param fastForwardMs - Additional buffer to request (ms)
|
|
80
|
+
*/
|
|
81
|
+
seek(timeMs: number, fastForwardMs?: number): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Set playback speed
|
|
84
|
+
*/
|
|
85
|
+
setSpeed(rate: number | 'auto'): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Request codec initialization data
|
|
88
|
+
* @param supportedCombinations - Array of codec combinations we can play
|
|
89
|
+
* Format: [[ ["H264"], ["AAC"] ]] means "H264 video AND AAC audio"
|
|
90
|
+
* Per MistServer rawws.js line 1544
|
|
91
|
+
*/
|
|
92
|
+
requestCodecData(supportedCombinations?: string[][][]): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Request additional data (fast-forward for buffer recovery)
|
|
95
|
+
*/
|
|
96
|
+
fastForward(ms: number): boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Get current connection state
|
|
99
|
+
*/
|
|
100
|
+
getState(): ConnectionState;
|
|
101
|
+
/**
|
|
102
|
+
* Get estimated server delay
|
|
103
|
+
*/
|
|
104
|
+
getServerDelay(): number;
|
|
105
|
+
/**
|
|
106
|
+
* Check if connected
|
|
107
|
+
*/
|
|
108
|
+
isConnected(): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Add event listener
|
|
111
|
+
*/
|
|
112
|
+
on<K extends keyof WebSocketControllerEvents>(event: K, listener: EventListener<K>): void;
|
|
113
|
+
/**
|
|
114
|
+
* Remove event listener
|
|
115
|
+
*/
|
|
116
|
+
off<K extends keyof WebSocketControllerEvents>(event: K, listener: EventListener<K>): void;
|
|
117
|
+
/**
|
|
118
|
+
* Emit event to listeners
|
|
119
|
+
*/
|
|
120
|
+
private emit;
|
|
121
|
+
/**
|
|
122
|
+
* Handle incoming WebSocket message
|
|
123
|
+
*/
|
|
124
|
+
private handleMessage;
|
|
125
|
+
private lastDeltaLogTime;
|
|
126
|
+
private deltaLogInterval;
|
|
127
|
+
/**
|
|
128
|
+
* Handle binary frame data
|
|
129
|
+
*/
|
|
130
|
+
private handleBinaryMessage;
|
|
131
|
+
/**
|
|
132
|
+
* Handle JSON control message
|
|
133
|
+
*
|
|
134
|
+
* Per MistServer util.js line 1301, we need to unwrap the `data` field:
|
|
135
|
+
* MistServer sends: { type: "codec_data", data: { codecs: [...], tracks: [...] } }
|
|
136
|
+
* We need to emit: { type: "codec_data", codecs: [...], tracks: [...] }
|
|
137
|
+
*/
|
|
138
|
+
private handleControlMessage;
|
|
139
|
+
/**
|
|
140
|
+
* Set connection state and emit event
|
|
141
|
+
*/
|
|
142
|
+
private setState;
|
|
143
|
+
/**
|
|
144
|
+
* Check if should attempt reconnection
|
|
145
|
+
*/
|
|
146
|
+
private shouldReconnect;
|
|
147
|
+
/**
|
|
148
|
+
* Schedule reconnection with exponential backoff
|
|
149
|
+
*/
|
|
150
|
+
private scheduleReconnect;
|
|
151
|
+
/**
|
|
152
|
+
* Clear reconnect timer
|
|
153
|
+
*/
|
|
154
|
+
private clearReconnectTimer;
|
|
155
|
+
/**
|
|
156
|
+
* Clear connection timer
|
|
157
|
+
*/
|
|
158
|
+
private clearConnectionTimer;
|
|
159
|
+
/**
|
|
160
|
+
* Log message (if debug enabled)
|
|
161
|
+
*/
|
|
162
|
+
private log;
|
|
163
|
+
}
|
|
164
|
+
export {};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebCodecs Player Implementation
|
|
3
|
+
*
|
|
4
|
+
* Low-latency WebSocket streaming using WebCodecs API for video/audio decoding.
|
|
5
|
+
* Decoding runs in a Web Worker for optimal performance.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Ultra-low latency streaming (configurable via profiles)
|
|
9
|
+
* - Worker-based VideoDecoder/AudioDecoder
|
|
10
|
+
* - Adaptive playback speed for live catchup/slowdown
|
|
11
|
+
* - Jitter compensation
|
|
12
|
+
* - Firefox polyfill for MediaStreamTrackGenerator
|
|
13
|
+
*
|
|
14
|
+
* Protocol: MistServer raw WebSocket frames (12-byte header + data)
|
|
15
|
+
*/
|
|
16
|
+
import { BasePlayer } from '../../core/PlayerInterface';
|
|
17
|
+
import type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../../core/PlayerInterface';
|
|
18
|
+
import type { TrackInfo, WebCodecsStats } from './types';
|
|
19
|
+
/**
|
|
20
|
+
* WebCodecsPlayerImpl - WebCodecs-based low-latency player
|
|
21
|
+
*/
|
|
22
|
+
export declare class WebCodecsPlayerImpl extends BasePlayer {
|
|
23
|
+
readonly capability: PlayerCapability;
|
|
24
|
+
private wsController;
|
|
25
|
+
private syncController;
|
|
26
|
+
private worker;
|
|
27
|
+
private mediaStream;
|
|
28
|
+
private container;
|
|
29
|
+
private pipelines;
|
|
30
|
+
private tracks;
|
|
31
|
+
private tracksByIndex;
|
|
32
|
+
private queuedInitData;
|
|
33
|
+
private queuedChunks;
|
|
34
|
+
private isDestroyed;
|
|
35
|
+
private debugging;
|
|
36
|
+
private verboseDebugging;
|
|
37
|
+
private streamType;
|
|
38
|
+
private workerUidCounter;
|
|
39
|
+
private workerListeners;
|
|
40
|
+
private _duration;
|
|
41
|
+
private _currentTime;
|
|
42
|
+
private _bufferMs;
|
|
43
|
+
private _avDrift;
|
|
44
|
+
private _frameCallbackId;
|
|
45
|
+
private _statsInterval;
|
|
46
|
+
private _framesDropped;
|
|
47
|
+
private _framesDecoded;
|
|
48
|
+
private _bytesReceived;
|
|
49
|
+
private _messagesReceived;
|
|
50
|
+
private static codecCache;
|
|
51
|
+
/**
|
|
52
|
+
* Get cache key for a track's codec configuration
|
|
53
|
+
*/
|
|
54
|
+
private static getCodecCacheKey;
|
|
55
|
+
/**
|
|
56
|
+
* Test if a track's codec is supported by WebCodecs
|
|
57
|
+
* Reference: rawws.js:75-137 - isTrackSupported()
|
|
58
|
+
*/
|
|
59
|
+
static isTrackSupported(track: TrackInfo): Promise<{
|
|
60
|
+
supported: boolean;
|
|
61
|
+
config: any;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Validate all tracks and return which are supported
|
|
65
|
+
* Returns array of supported track types ('video', 'audio')
|
|
66
|
+
*/
|
|
67
|
+
static validateTracks(tracks: TrackInfo[]): Promise<string[]>;
|
|
68
|
+
isMimeSupported(mimetype: string): boolean;
|
|
69
|
+
isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[];
|
|
70
|
+
initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions, streamInfo?: StreamInfo): Promise<HTMLVideoElement>;
|
|
71
|
+
destroy(): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Try to load a worker from a URL with proper async error detection.
|
|
74
|
+
* new Worker() doesn't throw on invalid URLs - it fires error events async.
|
|
75
|
+
*/
|
|
76
|
+
private tryLoadWorker;
|
|
77
|
+
private initializeWorker;
|
|
78
|
+
private sendToWorker;
|
|
79
|
+
private handleWorkerMessage;
|
|
80
|
+
private setupWebSocketHandlers;
|
|
81
|
+
private handleCodecData;
|
|
82
|
+
/**
|
|
83
|
+
* Handle stream info message containing track metadata
|
|
84
|
+
* This is sent by MistServer with full track information
|
|
85
|
+
*/
|
|
86
|
+
private handleInfo;
|
|
87
|
+
private handleOnTime;
|
|
88
|
+
private handleTracksChange;
|
|
89
|
+
private handleChunk;
|
|
90
|
+
private sendChunkToWorker;
|
|
91
|
+
private handleStop;
|
|
92
|
+
private handleError;
|
|
93
|
+
private createPipeline;
|
|
94
|
+
private configurePipeline;
|
|
95
|
+
private closePipeline;
|
|
96
|
+
play(): Promise<void>;
|
|
97
|
+
pause(): void;
|
|
98
|
+
seek(time: number): void;
|
|
99
|
+
setPlaybackRate(rate: number): void;
|
|
100
|
+
isLive(): boolean;
|
|
101
|
+
jumpToLive(): void;
|
|
102
|
+
/**
|
|
103
|
+
* Check if seeking is supported.
|
|
104
|
+
* WebCodecs can seek via server commands when connected.
|
|
105
|
+
* Reference: rawws.js line 1294-1304 implements seeking via control channel
|
|
106
|
+
*/
|
|
107
|
+
canSeek(): boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Get stream duration (Infinity for live streams)
|
|
110
|
+
*/
|
|
111
|
+
get duration(): number;
|
|
112
|
+
getDuration(): number;
|
|
113
|
+
/**
|
|
114
|
+
* Get current playback time (seconds)
|
|
115
|
+
* Uses requestVideoFrameCallback for accurate timing when available
|
|
116
|
+
*/
|
|
117
|
+
get currentTime(): number;
|
|
118
|
+
getCurrentTime(): number;
|
|
119
|
+
/**
|
|
120
|
+
* Get buffered time ranges
|
|
121
|
+
* Returns single range from current time to current + buffer
|
|
122
|
+
*/
|
|
123
|
+
get buffered(): TimeRanges;
|
|
124
|
+
/**
|
|
125
|
+
* Get comprehensive player statistics
|
|
126
|
+
*/
|
|
127
|
+
getStats(): Promise<WebCodecsStats>;
|
|
128
|
+
/**
|
|
129
|
+
* Set up requestVideoFrameCallback for accurate frame timing
|
|
130
|
+
* This provides vsync-aligned frame metadata for A/V sync
|
|
131
|
+
*/
|
|
132
|
+
private setupFrameCallback;
|
|
133
|
+
/**
|
|
134
|
+
* Handle video frame presentation callback
|
|
135
|
+
* Updates current time
|
|
136
|
+
*/
|
|
137
|
+
private onVideoFrame;
|
|
138
|
+
/**
|
|
139
|
+
* Cancel frame callback on cleanup
|
|
140
|
+
*/
|
|
141
|
+
private cancelFrameCallback;
|
|
142
|
+
private log;
|
|
143
|
+
}
|
|
144
|
+
export { WebSocketController } from './WebSocketController';
|
|
145
|
+
export { SyncController } from './SyncController';
|
|
146
|
+
export { JitterTracker, MultiTrackJitterTracker } from './JitterBuffer';
|
|
147
|
+
export { getLatencyProfile, mergeLatencyProfile, LATENCY_PROFILES } from './LatencyProfiles';
|
|
148
|
+
export { parseRawChunk, RawChunkParser } from './RawChunkParser';
|
|
149
|
+
export * from './types';
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MediaStreamTrackGenerator Polyfill
|
|
3
|
+
*
|
|
4
|
+
* Provides fallback for browsers without native MediaStreamTrackGenerator (Firefox).
|
|
5
|
+
*
|
|
6
|
+
* Video: Uses Canvas2D + captureStream()
|
|
7
|
+
* Audio: Uses AudioWorklet + createMediaStreamDestination()
|
|
8
|
+
*
|
|
9
|
+
* Based on legacy rawws.js polyfill with improvements:
|
|
10
|
+
* - TypeScript types
|
|
11
|
+
* - Pull-based audio to prevent tin-can distortion
|
|
12
|
+
* - Better resource cleanup
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Check if native MediaStreamTrackGenerator is available
|
|
16
|
+
*/
|
|
17
|
+
export declare function hasNativeMediaStreamTrackGenerator(): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Polyfill for MediaStreamTrackGenerator (video)
|
|
20
|
+
*
|
|
21
|
+
* Uses an offscreen canvas and captureStream() to create a MediaStreamTrack
|
|
22
|
+
* that can be fed VideoFrames via a WritableStream.
|
|
23
|
+
*/
|
|
24
|
+
export declare class VideoTrackGeneratorPolyfill {
|
|
25
|
+
private canvas;
|
|
26
|
+
private ctx;
|
|
27
|
+
private track;
|
|
28
|
+
private _writable;
|
|
29
|
+
private closed;
|
|
30
|
+
constructor();
|
|
31
|
+
/**
|
|
32
|
+
* Get the writable stream for writing VideoFrames
|
|
33
|
+
*/
|
|
34
|
+
get writable(): WritableStream<VideoFrame>;
|
|
35
|
+
/**
|
|
36
|
+
* Get the MediaStreamTrack for adding to MediaStream
|
|
37
|
+
*/
|
|
38
|
+
getTrack(): MediaStreamTrack;
|
|
39
|
+
/**
|
|
40
|
+
* Close and cleanup resources
|
|
41
|
+
*/
|
|
42
|
+
close(): void;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Polyfill for MediaStreamTrackGenerator (audio)
|
|
46
|
+
*
|
|
47
|
+
* Uses AudioWorklet to create a pull-based audio output that prevents
|
|
48
|
+
* the "tin-can" distortion issue from the legacy implementation.
|
|
49
|
+
*
|
|
50
|
+
* Key improvement: Audio samples are pulled by the worklet at a fixed rate,
|
|
51
|
+
* and we feed samples proactively rather than pushing them as they arrive.
|
|
52
|
+
*/
|
|
53
|
+
export declare class AudioTrackGeneratorPolyfill {
|
|
54
|
+
private audioContext;
|
|
55
|
+
private destination;
|
|
56
|
+
private workletNode;
|
|
57
|
+
private track;
|
|
58
|
+
private _writable;
|
|
59
|
+
private closed;
|
|
60
|
+
private initialized;
|
|
61
|
+
private initPromise;
|
|
62
|
+
private sampleBuffer;
|
|
63
|
+
private maxBufferChunks;
|
|
64
|
+
constructor();
|
|
65
|
+
/**
|
|
66
|
+
* Initialize the AudioWorklet
|
|
67
|
+
*/
|
|
68
|
+
private initializeWorklet;
|
|
69
|
+
/**
|
|
70
|
+
* Convert AudioData to mono Float32Array
|
|
71
|
+
*/
|
|
72
|
+
private audioDataToSamples;
|
|
73
|
+
/**
|
|
74
|
+
* Feed samples to the worklet
|
|
75
|
+
*/
|
|
76
|
+
private feedSamples;
|
|
77
|
+
/**
|
|
78
|
+
* Get the writable stream for writing AudioData
|
|
79
|
+
*/
|
|
80
|
+
get writable(): WritableStream<AudioData>;
|
|
81
|
+
/**
|
|
82
|
+
* Get the MediaStreamTrack for adding to MediaStream
|
|
83
|
+
*/
|
|
84
|
+
getTrack(): MediaStreamTrack;
|
|
85
|
+
/**
|
|
86
|
+
* Wait for initialization to complete
|
|
87
|
+
*/
|
|
88
|
+
waitForInit(): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Close and cleanup resources
|
|
91
|
+
*/
|
|
92
|
+
close(): void;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Create appropriate track generator based on browser support
|
|
96
|
+
*
|
|
97
|
+
* @param kind - 'video' or 'audio'
|
|
98
|
+
* @returns Native generator or polyfill
|
|
99
|
+
*/
|
|
100
|
+
export declare function createTrackGenerator(kind: 'video' | 'audio'): {
|
|
101
|
+
writable: WritableStream<VideoFrame | AudioData>;
|
|
102
|
+
getTrack: () => MediaStreamTrack;
|
|
103
|
+
close: () => void;
|
|
104
|
+
waitForInit?: () => Promise<void>;
|
|
105
|
+
};
|