@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,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SourceBuffer Manager for MEWS Player
|
|
3
|
+
*
|
|
4
|
+
* Handles MediaSource Extension (MSE) buffer operations.
|
|
5
|
+
* Ported from reference: mews.js:206-384
|
|
6
|
+
*
|
|
7
|
+
* Key features:
|
|
8
|
+
* - Buffer creation and codec configuration
|
|
9
|
+
* - Append queue management with _append/_do/_doNext pattern
|
|
10
|
+
* - QuotaExceededError handling
|
|
11
|
+
* - Buffer cleanup (_clean)
|
|
12
|
+
* - Track switch msgqueue handling
|
|
13
|
+
*/
|
|
14
|
+
import type { SourceBufferManagerOptions } from './types';
|
|
15
|
+
export declare class SourceBufferManager {
|
|
16
|
+
private mediaSource;
|
|
17
|
+
private videoElement;
|
|
18
|
+
private sourceBuffer;
|
|
19
|
+
private onError;
|
|
20
|
+
private queue;
|
|
21
|
+
private _busy;
|
|
22
|
+
private do_on_updateend;
|
|
23
|
+
private msgqueue;
|
|
24
|
+
private _codecs;
|
|
25
|
+
private fragmentCount;
|
|
26
|
+
paused: boolean;
|
|
27
|
+
private debugging;
|
|
28
|
+
constructor(options: SourceBufferManagerOptions);
|
|
29
|
+
/**
|
|
30
|
+
* Initialize the SourceBuffer with the given codecs.
|
|
31
|
+
* Ported from mews.js:206-384 (sbinit function)
|
|
32
|
+
*/
|
|
33
|
+
initWithCodecs(codecs: string[]): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get current codecs
|
|
36
|
+
*/
|
|
37
|
+
getCodecs(): string[];
|
|
38
|
+
/**
|
|
39
|
+
* Queue data for appending to the buffer.
|
|
40
|
+
* If a track switch is in progress (msgqueue active), data goes to the latest queue.
|
|
41
|
+
* Ported from mews.js:809-824
|
|
42
|
+
*/
|
|
43
|
+
append(data: Uint8Array): void;
|
|
44
|
+
/**
|
|
45
|
+
* Internal append with error handling.
|
|
46
|
+
* Ported from mews.js:292-339
|
|
47
|
+
*/
|
|
48
|
+
private _append;
|
|
49
|
+
/**
|
|
50
|
+
* Schedule an operation to run on next updateend.
|
|
51
|
+
* Ported from mews.js:281-283
|
|
52
|
+
*/
|
|
53
|
+
_doNext(func: () => void): void;
|
|
54
|
+
/**
|
|
55
|
+
* Run operation now if not busy, otherwise schedule for updateend.
|
|
56
|
+
* Ported from mews.js:284-291
|
|
57
|
+
*/
|
|
58
|
+
_do(func: (remaining?: Array<() => void>) => void): void;
|
|
59
|
+
/**
|
|
60
|
+
* Schedule an operation to run after the current SourceBuffer update completes.
|
|
61
|
+
* Public API for external callers.
|
|
62
|
+
*/
|
|
63
|
+
scheduleAfterUpdate(fn: () => void): void;
|
|
64
|
+
/**
|
|
65
|
+
* Change codecs mid-stream (track switch).
|
|
66
|
+
* Uses message queue to prevent data loss during rapid switches.
|
|
67
|
+
* Ported from mews.js:623-788
|
|
68
|
+
*/
|
|
69
|
+
changeCodecs(codecs: string[], switchPointMs?: number): void;
|
|
70
|
+
/**
|
|
71
|
+
* Check if two codec arrays are equivalent (order-independent)
|
|
72
|
+
*/
|
|
73
|
+
private codecsEqual;
|
|
74
|
+
/**
|
|
75
|
+
* Find which buffer range contains the given position.
|
|
76
|
+
* Ported from mews.js:947-956
|
|
77
|
+
*/
|
|
78
|
+
findBufferIndex(position: number): number | false;
|
|
79
|
+
/**
|
|
80
|
+
* Remove buffer content before keepaway seconds from current position.
|
|
81
|
+
* Ported from mews.js:370-379
|
|
82
|
+
*/
|
|
83
|
+
_clean(keepaway?: number): void;
|
|
84
|
+
/**
|
|
85
|
+
* Clear buffer and reinitialize with new codecs.
|
|
86
|
+
* Ported from mews.js:696-730
|
|
87
|
+
*/
|
|
88
|
+
private clearAndReinit;
|
|
89
|
+
/**
|
|
90
|
+
* Reinitialize buffer with new codecs.
|
|
91
|
+
* Ported from mews.js:703-724
|
|
92
|
+
*/
|
|
93
|
+
private reinitBuffer;
|
|
94
|
+
/**
|
|
95
|
+
* Wait for playback to reach switch point, then clear and reinit.
|
|
96
|
+
* Ported from mews.js:751-785
|
|
97
|
+
*/
|
|
98
|
+
private awaitSwitchingPoint;
|
|
99
|
+
/**
|
|
100
|
+
* Drain the oldest message queue and append its data.
|
|
101
|
+
* Called after source buffer reinit to flush queued track switch data.
|
|
102
|
+
* Ported from mews.js:341-367
|
|
103
|
+
*/
|
|
104
|
+
private drainMessageQueue;
|
|
105
|
+
/**
|
|
106
|
+
* Install event handlers on the sourceBuffer.
|
|
107
|
+
* Ported from mews.js:224-279
|
|
108
|
+
*/
|
|
109
|
+
private installEventHandlers;
|
|
110
|
+
/**
|
|
111
|
+
* Flush any pending queue data.
|
|
112
|
+
*/
|
|
113
|
+
private flushQueue;
|
|
114
|
+
/**
|
|
115
|
+
* Check if there's an active message queue (track switch in progress)
|
|
116
|
+
*/
|
|
117
|
+
hasActiveMessageQueue(): boolean;
|
|
118
|
+
destroy(): void;
|
|
119
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Manager for MEWS Player
|
|
3
|
+
*
|
|
4
|
+
* Handles WebSocket connection, reconnection with exponential backoff,
|
|
5
|
+
* message sending, and typed message listeners.
|
|
6
|
+
*
|
|
7
|
+
* Ported from reference: mews.js:387-883
|
|
8
|
+
*/
|
|
9
|
+
import type { WebSocketManagerOptions, MewsMessage, MewsMessageListener } from './types';
|
|
10
|
+
export declare class WebSocketManager {
|
|
11
|
+
private ws;
|
|
12
|
+
private url;
|
|
13
|
+
private maxReconnectAttempts;
|
|
14
|
+
private reconnectAttempts;
|
|
15
|
+
private reconnectTimer;
|
|
16
|
+
private wasConnected;
|
|
17
|
+
private isDestroyed;
|
|
18
|
+
private pendingRetryTimers;
|
|
19
|
+
private listeners;
|
|
20
|
+
private onMessage;
|
|
21
|
+
private onOpen;
|
|
22
|
+
private onClose;
|
|
23
|
+
private onError;
|
|
24
|
+
constructor(options: WebSocketManagerOptions);
|
|
25
|
+
connect(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Send a command with retry logic (3.3.6).
|
|
28
|
+
* If not connected, will retry up to 5 times with 500ms delay.
|
|
29
|
+
* If connection is closing/closed, will attempt reconnect then retry.
|
|
30
|
+
*/
|
|
31
|
+
send(cmd: object, retry?: number): boolean;
|
|
32
|
+
private clearReconnectTimer;
|
|
33
|
+
destroy(): void;
|
|
34
|
+
isConnected(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Add a listener for a specific message type.
|
|
37
|
+
* Ported from mews.js:441-444
|
|
38
|
+
*
|
|
39
|
+
* @param type - Message type to listen for (e.g., 'on_time', 'codec_data', 'seek')
|
|
40
|
+
* @param callback - Function to call when message is received
|
|
41
|
+
*/
|
|
42
|
+
addListener(type: string, callback: MewsMessageListener): void;
|
|
43
|
+
/**
|
|
44
|
+
* Remove a listener for a specific message type.
|
|
45
|
+
* Ported from mews.js:445-450
|
|
46
|
+
*
|
|
47
|
+
* @param type - Message type
|
|
48
|
+
* @param callback - The exact callback function to remove
|
|
49
|
+
* @returns true if listener was found and removed
|
|
50
|
+
*/
|
|
51
|
+
removeListener(type: string, callback: MewsMessageListener): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Notify all listeners for a given message type.
|
|
54
|
+
* Called internally when a JSON message is received.
|
|
55
|
+
* Ported from mews.js:795-799
|
|
56
|
+
*
|
|
57
|
+
* @param msg - Parsed message object
|
|
58
|
+
*/
|
|
59
|
+
notifyListeners(msg: MewsMessage): void;
|
|
60
|
+
}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MEWS WebSocket Player Implementation
|
|
3
|
+
*
|
|
4
|
+
* Low-latency WebSocket MP4 streaming using MediaSource Extensions.
|
|
5
|
+
* Protocol: Custom MEWS (MistServer Extended WebSocket)
|
|
6
|
+
*
|
|
7
|
+
* Ported from reference: mews.js (MistMetaPlayer)
|
|
8
|
+
*/
|
|
9
|
+
import { BasePlayer } from '../../core/PlayerInterface';
|
|
10
|
+
import type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../../core/PlayerInterface';
|
|
11
|
+
export declare class MewsWsPlayerImpl extends BasePlayer {
|
|
12
|
+
readonly capability: PlayerCapability;
|
|
13
|
+
private wsManager;
|
|
14
|
+
private sbManager;
|
|
15
|
+
private mediaSource;
|
|
16
|
+
private objectUrl;
|
|
17
|
+
private container;
|
|
18
|
+
private isDestroyed;
|
|
19
|
+
private debugging;
|
|
20
|
+
private serverDelays;
|
|
21
|
+
private pendingDelayTypes;
|
|
22
|
+
private supportedCodecs;
|
|
23
|
+
private isReady;
|
|
24
|
+
private readyResolvers;
|
|
25
|
+
private lastDuration;
|
|
26
|
+
private streamType;
|
|
27
|
+
private currentTracks;
|
|
28
|
+
private lastCodecs;
|
|
29
|
+
private requestedRate;
|
|
30
|
+
private bitCounter;
|
|
31
|
+
private bitsSince;
|
|
32
|
+
private currentBps;
|
|
33
|
+
private nWaiting;
|
|
34
|
+
private nWaitingThreshold;
|
|
35
|
+
private seeking;
|
|
36
|
+
private analyticsConfig;
|
|
37
|
+
private analyticsTimer;
|
|
38
|
+
isMimeSupported(mimetype: string): boolean;
|
|
39
|
+
isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[];
|
|
40
|
+
initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions): Promise<HTMLVideoElement>;
|
|
41
|
+
/**
|
|
42
|
+
* Handle MediaSource sourceopen event.
|
|
43
|
+
* Ported from mews.js:143-148, 198-204, 885-902
|
|
44
|
+
*/
|
|
45
|
+
private handleSourceOpen;
|
|
46
|
+
/**
|
|
47
|
+
* Handle MediaSource sourceclose event.
|
|
48
|
+
* Ported from mews.js:150-153
|
|
49
|
+
*/
|
|
50
|
+
private handleSourceClose;
|
|
51
|
+
/**
|
|
52
|
+
* Handle MediaSource sourceended event.
|
|
53
|
+
* Ported from mews.js:154-194
|
|
54
|
+
*/
|
|
55
|
+
private handleSourceEnded;
|
|
56
|
+
/**
|
|
57
|
+
* Handle WebSocket open event.
|
|
58
|
+
* Ported from mews.js:401-403, 885-902
|
|
59
|
+
*/
|
|
60
|
+
private handleWsOpen;
|
|
61
|
+
/**
|
|
62
|
+
* Handle WebSocket close event with reconnection logic.
|
|
63
|
+
* Ported from mews.js:408-431
|
|
64
|
+
*/
|
|
65
|
+
private handleWsClose;
|
|
66
|
+
/**
|
|
67
|
+
* Handle incoming WebSocket message.
|
|
68
|
+
* Routes to binary append or JSON control message handler.
|
|
69
|
+
* Ported from mews.js:456-830
|
|
70
|
+
*/
|
|
71
|
+
private handleMessage;
|
|
72
|
+
/**
|
|
73
|
+
* Handle JSON control messages.
|
|
74
|
+
* Ported from mews.js:461-799
|
|
75
|
+
*/
|
|
76
|
+
private handleControlMessage;
|
|
77
|
+
/**
|
|
78
|
+
* Handle on_stop message - stream ended (VoD).
|
|
79
|
+
* Ported from mews.js:462-471
|
|
80
|
+
*/
|
|
81
|
+
private handleOnStop;
|
|
82
|
+
/**
|
|
83
|
+
* Handle on_time message - playback time sync.
|
|
84
|
+
* Ported from mews.js:473-621
|
|
85
|
+
*/
|
|
86
|
+
private handleOnTime;
|
|
87
|
+
/**
|
|
88
|
+
* Tune playback rate for live streams.
|
|
89
|
+
* Ported from mews.js:508-545
|
|
90
|
+
*
|
|
91
|
+
* Fixed: Use direct assignment instead of multiplication to prevent
|
|
92
|
+
* compounding rate adjustments on each on_time message.
|
|
93
|
+
*/
|
|
94
|
+
private tuneLivePlaybackRate;
|
|
95
|
+
/**
|
|
96
|
+
* Tune server delivery speed for VoD.
|
|
97
|
+
* Ported from mews.js:547-586
|
|
98
|
+
*/
|
|
99
|
+
private tuneVodDeliverySpeed;
|
|
100
|
+
/**
|
|
101
|
+
* Handle tracks message - codec switch.
|
|
102
|
+
* Ported from mews.js:623-788
|
|
103
|
+
*/
|
|
104
|
+
private handleTracks;
|
|
105
|
+
/**
|
|
106
|
+
* Handle pause message.
|
|
107
|
+
* Ported from mews.js:790-792
|
|
108
|
+
*/
|
|
109
|
+
private handlePause;
|
|
110
|
+
/**
|
|
111
|
+
* Set video currentTime with retry logic.
|
|
112
|
+
* Ported from mews.js:635-672
|
|
113
|
+
*/
|
|
114
|
+
private setSeekingPosition;
|
|
115
|
+
/**
|
|
116
|
+
* Check if two codec arrays are equivalent (order-independent)
|
|
117
|
+
*/
|
|
118
|
+
private codecsEqual;
|
|
119
|
+
/**
|
|
120
|
+
* Play with optional skip to live edge.
|
|
121
|
+
* Ported from mews.js:959-1023
|
|
122
|
+
*/
|
|
123
|
+
play(): Promise<void>;
|
|
124
|
+
/**
|
|
125
|
+
* Pause playback and server delivery.
|
|
126
|
+
* Ported from mews.js:1025-1029
|
|
127
|
+
*/
|
|
128
|
+
pause(): void;
|
|
129
|
+
/**
|
|
130
|
+
* Seek to position with server sync.
|
|
131
|
+
* Ported from mews.js:1071-1111
|
|
132
|
+
*/
|
|
133
|
+
seek(time: number): void;
|
|
134
|
+
/**
|
|
135
|
+
* Try to set currentTime with retry logic.
|
|
136
|
+
* Ported from mews.js:1092-1103
|
|
137
|
+
*/
|
|
138
|
+
private trySetCurrentTime;
|
|
139
|
+
getCurrentTime(): number;
|
|
140
|
+
getDuration(): number;
|
|
141
|
+
/**
|
|
142
|
+
* Set playback rate.
|
|
143
|
+
* Ported from mews.js:1119-1129
|
|
144
|
+
*/
|
|
145
|
+
setPlaybackRate(rate: number): void;
|
|
146
|
+
getQualities(): Array<{
|
|
147
|
+
id: string;
|
|
148
|
+
label: string;
|
|
149
|
+
isAuto?: boolean;
|
|
150
|
+
active?: boolean;
|
|
151
|
+
}>;
|
|
152
|
+
selectQuality(id: string): void;
|
|
153
|
+
/**
|
|
154
|
+
* Set tracks for ABR or quality selection.
|
|
155
|
+
* Ported from mews.js:1030-1037
|
|
156
|
+
*/
|
|
157
|
+
setTracks(obj: {
|
|
158
|
+
video?: string;
|
|
159
|
+
audio?: string;
|
|
160
|
+
subtitle?: string;
|
|
161
|
+
}): void;
|
|
162
|
+
/**
|
|
163
|
+
* Select a subtitle track.
|
|
164
|
+
*/
|
|
165
|
+
selectTextTrack(id: string | null): void;
|
|
166
|
+
isLive(): boolean;
|
|
167
|
+
/**
|
|
168
|
+
* Jump to live edge.
|
|
169
|
+
*/
|
|
170
|
+
jumpToLive(): void;
|
|
171
|
+
getStats(): Promise<any>;
|
|
172
|
+
/**
|
|
173
|
+
* Install waiting event handler.
|
|
174
|
+
* Handles buffer gaps and ABR.
|
|
175
|
+
* Ported from mews.js:1177-1186, 1272-1278
|
|
176
|
+
*/
|
|
177
|
+
private installWaitingHandler;
|
|
178
|
+
/**
|
|
179
|
+
* Install seeking event handlers.
|
|
180
|
+
* Ported from mews.js:1169-1175
|
|
181
|
+
*/
|
|
182
|
+
private installSeekingHandler;
|
|
183
|
+
/**
|
|
184
|
+
* Install pause event handler for browser pause detection.
|
|
185
|
+
* Ported from mews.js:1188-1200
|
|
186
|
+
*/
|
|
187
|
+
private installPauseHandler;
|
|
188
|
+
/**
|
|
189
|
+
* Install loop handler for VoD content.
|
|
190
|
+
* Ported from mews.js:1157-1167
|
|
191
|
+
*/
|
|
192
|
+
private installLoopHandler;
|
|
193
|
+
/**
|
|
194
|
+
* Send command to server with retry.
|
|
195
|
+
* Ported from mews.js:904-944
|
|
196
|
+
*/
|
|
197
|
+
private send;
|
|
198
|
+
/**
|
|
199
|
+
* Log delay for server RTT estimation.
|
|
200
|
+
* Ported from mews.js:835-862
|
|
201
|
+
*/
|
|
202
|
+
private logDelay;
|
|
203
|
+
/**
|
|
204
|
+
* Resolve delay measurement.
|
|
205
|
+
* Ported from mews.js:855-861, 863-867
|
|
206
|
+
*/
|
|
207
|
+
private resolveDelay;
|
|
208
|
+
/**
|
|
209
|
+
* Get average server delay.
|
|
210
|
+
* Ported from mews.js:869-881
|
|
211
|
+
*/
|
|
212
|
+
private getServerDelay;
|
|
213
|
+
/**
|
|
214
|
+
* Track bandwidth for ABR.
|
|
215
|
+
* Ported from mews.js:1280-1303
|
|
216
|
+
*/
|
|
217
|
+
private trackBits;
|
|
218
|
+
private startTelemetry;
|
|
219
|
+
destroy(): Promise<void>;
|
|
220
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MEWS WebSocket Player Types
|
|
3
|
+
*/
|
|
4
|
+
export interface MewsMessage {
|
|
5
|
+
type: string;
|
|
6
|
+
data?: any;
|
|
7
|
+
}
|
|
8
|
+
export interface CodecDataMessage extends MewsMessage {
|
|
9
|
+
type: 'codec_data';
|
|
10
|
+
data: {
|
|
11
|
+
codecs: string[];
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export interface OnTimeMessage extends MewsMessage {
|
|
15
|
+
type: 'on_time';
|
|
16
|
+
data: {
|
|
17
|
+
current: number;
|
|
18
|
+
end?: number;
|
|
19
|
+
begin?: number;
|
|
20
|
+
play_rate_curr?: 'auto' | number;
|
|
21
|
+
jitter?: number;
|
|
22
|
+
tracks?: string[];
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface TracksMessage extends MewsMessage {
|
|
26
|
+
type: 'tracks';
|
|
27
|
+
data: {
|
|
28
|
+
codecs: string[];
|
|
29
|
+
current?: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface OnStopMessage extends MewsMessage {
|
|
33
|
+
type: 'on_stop';
|
|
34
|
+
}
|
|
35
|
+
export interface SeekAckMessage extends MewsMessage {
|
|
36
|
+
type: 'seek';
|
|
37
|
+
}
|
|
38
|
+
export interface SetSpeedAckMessage extends MewsMessage {
|
|
39
|
+
type: 'set_speed';
|
|
40
|
+
data?: {
|
|
41
|
+
play_rate_curr?: 'auto' | number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export interface PauseMessage extends MewsMessage {
|
|
45
|
+
type: 'pause';
|
|
46
|
+
}
|
|
47
|
+
export interface MewsCommand {
|
|
48
|
+
type: 'request_codec_data' | 'play' | 'hold' | 'seek' | 'set_speed' | 'tracks';
|
|
49
|
+
[key: string]: any;
|
|
50
|
+
}
|
|
51
|
+
export interface RequestCodecDataCommand extends MewsCommand {
|
|
52
|
+
type: 'request_codec_data';
|
|
53
|
+
supported_codecs: string[];
|
|
54
|
+
}
|
|
55
|
+
export interface SeekCommand extends MewsCommand {
|
|
56
|
+
type: 'seek';
|
|
57
|
+
seek_time: number;
|
|
58
|
+
}
|
|
59
|
+
export interface SetSpeedCommand extends MewsCommand {
|
|
60
|
+
type: 'set_speed';
|
|
61
|
+
play_rate: number | 'auto';
|
|
62
|
+
}
|
|
63
|
+
export interface TracksCommand extends MewsCommand {
|
|
64
|
+
type: 'tracks';
|
|
65
|
+
video?: string;
|
|
66
|
+
subtitle?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Callback for WebSocket message listeners.
|
|
70
|
+
* Listeners are registered per message type and receive parsed MewsMessage objects.
|
|
71
|
+
*/
|
|
72
|
+
export type MewsMessageListener = (msg: MewsMessage) => void;
|
|
73
|
+
export interface WebSocketManagerOptions {
|
|
74
|
+
url: string;
|
|
75
|
+
maxReconnectAttempts?: number;
|
|
76
|
+
onMessage: (data: ArrayBuffer | string) => void;
|
|
77
|
+
onOpen: () => void;
|
|
78
|
+
onClose: () => void;
|
|
79
|
+
onError: (message: string) => void;
|
|
80
|
+
}
|
|
81
|
+
export interface SourceBufferManagerOptions {
|
|
82
|
+
mediaSource: MediaSource;
|
|
83
|
+
videoElement: HTMLVideoElement;
|
|
84
|
+
onError: (message: string) => void;
|
|
85
|
+
}
|
|
86
|
+
export interface AnalyticsConfig {
|
|
87
|
+
enabled: boolean;
|
|
88
|
+
endpoint: string | null;
|
|
89
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BasePlayer } from '../core/PlayerInterface';
|
|
2
|
+
import type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../core/PlayerInterface';
|
|
3
|
+
/**
|
|
4
|
+
* MistPlayerImpl - Legacy fallback player
|
|
5
|
+
*
|
|
6
|
+
* Simple passthrough to MistServer's native player.js embed.
|
|
7
|
+
* No codec preferences or fancy params - just let MistServer handle everything.
|
|
8
|
+
* This is the final fallback when other players fail.
|
|
9
|
+
*/
|
|
10
|
+
export declare class MistPlayerImpl extends BasePlayer {
|
|
11
|
+
readonly capability: PlayerCapability;
|
|
12
|
+
private container;
|
|
13
|
+
private mistDiv;
|
|
14
|
+
private proxyVideo;
|
|
15
|
+
private previousContainerOverflow;
|
|
16
|
+
private destroyed;
|
|
17
|
+
isMimeSupported(mimetype: string): boolean;
|
|
18
|
+
isBrowserSupported(mimetype: string, _source: StreamSource, _streamInfo: StreamInfo): boolean | string[];
|
|
19
|
+
initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions): Promise<HTMLVideoElement>;
|
|
20
|
+
private getPlayerJsUrl;
|
|
21
|
+
private loadAndPlay;
|
|
22
|
+
private findVideoElement;
|
|
23
|
+
private createProxyVideo;
|
|
24
|
+
destroy(): Promise<void>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MistWebRTCPlayerImpl - IPlayer implementation for MistServer native WebRTC
|
|
3
|
+
*
|
|
4
|
+
* Uses MistServer's WebSocket signaling protocol instead of WHEP.
|
|
5
|
+
* Key advantages over WHEP:
|
|
6
|
+
* - Server-side track selection via signaling
|
|
7
|
+
* - Playback speed control (including "auto" for live catch-up)
|
|
8
|
+
* - Seeking via signaling (DVR support)
|
|
9
|
+
* - Real-time buffer_window updates
|
|
10
|
+
* - DataChannel for timed metadata
|
|
11
|
+
*/
|
|
12
|
+
import { BasePlayer } from '../../core/PlayerInterface';
|
|
13
|
+
import type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../../core/PlayerInterface';
|
|
14
|
+
export declare class MistWebRTCPlayerImpl extends BasePlayer {
|
|
15
|
+
readonly capability: PlayerCapability;
|
|
16
|
+
private signaling;
|
|
17
|
+
private peerConnection;
|
|
18
|
+
private dataChannel;
|
|
19
|
+
private container;
|
|
20
|
+
private destroyed;
|
|
21
|
+
private seekOffset;
|
|
22
|
+
private durationMs;
|
|
23
|
+
private isLiveStream;
|
|
24
|
+
private playRate;
|
|
25
|
+
private bufferWindow;
|
|
26
|
+
private currentTracks;
|
|
27
|
+
private currentSource;
|
|
28
|
+
private currentOptions;
|
|
29
|
+
private lastInboundStats;
|
|
30
|
+
/**
|
|
31
|
+
* Chrome on Android has a bug where H264 is not available immediately
|
|
32
|
+
* after the tab is opened. Retry up to 5 times with 100ms intervals.
|
|
33
|
+
* https://bugs.chromium.org/p/webrtc/issues/detail?id=11620
|
|
34
|
+
*/
|
|
35
|
+
private checkH264Available;
|
|
36
|
+
/**
|
|
37
|
+
* Load MistServer's WebRTC browser equalizer script for browser-specific fixes.
|
|
38
|
+
* This is non-fatal if it fails to load.
|
|
39
|
+
*/
|
|
40
|
+
private loadBrowserEqualizer;
|
|
41
|
+
/**
|
|
42
|
+
* Compare two arrays for equality (order-independent)
|
|
43
|
+
*/
|
|
44
|
+
private arraysEqual;
|
|
45
|
+
isMimeSupported(mimetype: string): boolean;
|
|
46
|
+
isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[];
|
|
47
|
+
initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions): Promise<HTMLVideoElement>;
|
|
48
|
+
destroy(): Promise<void>;
|
|
49
|
+
seek(time: number): void;
|
|
50
|
+
setPlaybackRate(rate: number): void;
|
|
51
|
+
jumpToLive(): void;
|
|
52
|
+
isLive(): boolean;
|
|
53
|
+
getDuration(): number;
|
|
54
|
+
getCurrentTime(): number;
|
|
55
|
+
/**
|
|
56
|
+
* Get available quality levels from signaling
|
|
57
|
+
*/
|
|
58
|
+
getQualities(): Array<{
|
|
59
|
+
id: string;
|
|
60
|
+
label: string;
|
|
61
|
+
isAuto?: boolean;
|
|
62
|
+
active?: boolean;
|
|
63
|
+
}>;
|
|
64
|
+
selectQuality(id: string): void;
|
|
65
|
+
selectTextTrack(id: string | null): void;
|
|
66
|
+
getStats(): Promise<{
|
|
67
|
+
type: 'webrtc';
|
|
68
|
+
video?: {
|
|
69
|
+
bytesReceived: number;
|
|
70
|
+
packetsReceived: number;
|
|
71
|
+
packetsLost: number;
|
|
72
|
+
packetLossRate: number;
|
|
73
|
+
jitter: number;
|
|
74
|
+
framesDecoded: number;
|
|
75
|
+
framesDropped: number;
|
|
76
|
+
frameDropRate: number;
|
|
77
|
+
frameWidth: number;
|
|
78
|
+
frameHeight: number;
|
|
79
|
+
framesPerSecond: number;
|
|
80
|
+
bitrate: number;
|
|
81
|
+
jitterBufferDelay: number;
|
|
82
|
+
};
|
|
83
|
+
audio?: {
|
|
84
|
+
bytesReceived: number;
|
|
85
|
+
packetsReceived: number;
|
|
86
|
+
packetsLost: number;
|
|
87
|
+
packetLossRate: number;
|
|
88
|
+
jitter: number;
|
|
89
|
+
bitrate: number;
|
|
90
|
+
};
|
|
91
|
+
network?: {
|
|
92
|
+
rtt: number;
|
|
93
|
+
availableOutgoingBitrate: number;
|
|
94
|
+
availableIncomingBitrate: number;
|
|
95
|
+
bytesSent: number;
|
|
96
|
+
bytesReceived: number;
|
|
97
|
+
};
|
|
98
|
+
timestamp: number;
|
|
99
|
+
} | undefined>;
|
|
100
|
+
getLatency(): Promise<{
|
|
101
|
+
estimatedMs: number;
|
|
102
|
+
jitterBufferMs: number;
|
|
103
|
+
rttMs: number;
|
|
104
|
+
} | undefined>;
|
|
105
|
+
/**
|
|
106
|
+
* Get the current buffer window in milliseconds (P2)
|
|
107
|
+
* This is the difference between buffer end and begin from on_time messages.
|
|
108
|
+
*/
|
|
109
|
+
getBufferWindow(): number;
|
|
110
|
+
/**
|
|
111
|
+
* Request video track matching the given player size (P2 - ABR_resize)
|
|
112
|
+
* Uses MistServer's ~widthxheight track selection syntax.
|
|
113
|
+
*/
|
|
114
|
+
setQualityForSize(size: {
|
|
115
|
+
width: number;
|
|
116
|
+
height: number;
|
|
117
|
+
}): void;
|
|
118
|
+
/**
|
|
119
|
+
* Get the metadata DataChannel for timed metadata (P2)
|
|
120
|
+
* Returns the RTCDataChannel or null if not available.
|
|
121
|
+
*/
|
|
122
|
+
getMetaDataChannel(): RTCDataChannel | null;
|
|
123
|
+
/**
|
|
124
|
+
* Override to add WebRTC-specific event handling:
|
|
125
|
+
* - Loop reconnect for VoD (P1)
|
|
126
|
+
* - Proper autoplay disable (P2)
|
|
127
|
+
*/
|
|
128
|
+
protected setupVideoEventListeners(video: HTMLVideoElement, options: PlayerOptions): void;
|
|
129
|
+
private setupWebRTC;
|
|
130
|
+
private setupSignalingHandlers;
|
|
131
|
+
private handleTimeUpdate;
|
|
132
|
+
private createAndSendOffer;
|
|
133
|
+
}
|