melies-video-editor 0.1.5 → 0.1.7
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/index.cjs +8 -8
- package/dist/index.js +1458 -1443
- package/dist/types/App.d.ts +102 -0
- package/dist/types/appVersion.d.ts +2 -0
- package/dist/types/audioControl.d.ts +29 -0
- package/dist/types/custom.d.ts +14 -0
- package/dist/types/dev/DevRoot.d.ts +5 -0
- package/dist/types/dev/HostApp.d.ts +8 -0
- package/dist/types/dev/opfs.d.ts +35 -0
- package/dist/types/footageBin.d.ts +12 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/lib/index.d.ts +3 -0
- package/dist/types/lottieControl.d.ts +28 -0
- package/dist/types/mediaCache.d.ts +50 -0
- package/dist/types/mock.d.ts +25 -0
- package/dist/types/player.d.ts +18 -0
- package/dist/types/useCoarsePointer.d.ts +1 -0
- package/dist/types/videoControl.d.ts +91 -0
- package/package.json +1 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import './index.less';
|
|
2
|
+
import type { CusTomTimelineRow } from './mock';
|
|
3
|
+
import type { FootageItem } from './footageBin';
|
|
4
|
+
export type MeliesVideoEditorProps = {
|
|
5
|
+
/**
|
|
6
|
+
* URLs (often blob: URLs) to show in the footage bin.
|
|
7
|
+
* When omitted or empty, the footage bin will be empty.
|
|
8
|
+
*/
|
|
9
|
+
footageUrls?: string[];
|
|
10
|
+
/**
|
|
11
|
+
* Local Files to show in the footage bin.
|
|
12
|
+
*
|
|
13
|
+
* This is ideal for OPFS (Base44 can load from OPFS and pass `File`s here).
|
|
14
|
+
*/
|
|
15
|
+
footageFiles?: File[];
|
|
16
|
+
/**
|
|
17
|
+
* Handle-like objects (e.g. `FileSystemFileHandle`) that can yield `File`s.
|
|
18
|
+
*
|
|
19
|
+
* We intentionally avoid depending on `FileSystemFileHandle` directly so
|
|
20
|
+
* consumers without that DOM lib type can still compile.
|
|
21
|
+
*/
|
|
22
|
+
footageFileHandles?: Array<{
|
|
23
|
+
getFile: () => Promise<File>;
|
|
24
|
+
name?: string;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* When true, automatically place `footageUrls` onto the timeline on first initialization
|
|
28
|
+
* (one after another, starting at t=0).
|
|
29
|
+
*
|
|
30
|
+
* Defaults to false.
|
|
31
|
+
*/
|
|
32
|
+
autoPlaceFootage?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Optional initial timeline snapshot (e.g. loaded from your DB).
|
|
35
|
+
*
|
|
36
|
+
* Note: if you store `blob:` URLs in the snapshot, they will not be valid across sessions.
|
|
37
|
+
* Prefer storing stable asset ids and rehydrating to playable URLs before loading.
|
|
38
|
+
*/
|
|
39
|
+
initialTimelineSnapshot?: MeliesTimelineSnapshot;
|
|
40
|
+
/**
|
|
41
|
+
* Called whenever timeline state changes.
|
|
42
|
+
*
|
|
43
|
+
* Consumers should debounce/throttle this callback when persisting to a DB.
|
|
44
|
+
*/
|
|
45
|
+
onTimelineStateChange?: (snapshot: MeliesTimelineSnapshot) => void;
|
|
46
|
+
/**
|
|
47
|
+
* Fired when the user imports files into the footage bin.
|
|
48
|
+
*
|
|
49
|
+
* This exposes the actual `File` objects to the host app (for upload/OPFS/storage).
|
|
50
|
+
* Note: imported `blob:` URLs are session-only; hosts should persist and rehydrate using
|
|
51
|
+
* stable asset identifiers if they need cross-session restore.
|
|
52
|
+
*/
|
|
53
|
+
onFootageImported?: (event: MeliesFootageImportEvent) => void;
|
|
54
|
+
};
|
|
55
|
+
export type MeliesFootageImportEntry = {
|
|
56
|
+
/** The bin item added to the footage bin. */
|
|
57
|
+
item: FootageItem;
|
|
58
|
+
/** The underlying file selected by the user. */
|
|
59
|
+
file: File;
|
|
60
|
+
};
|
|
61
|
+
export type MeliesFootageImportEvent = {
|
|
62
|
+
/** Pairs each created bin item to its underlying file. */
|
|
63
|
+
entries: MeliesFootageImportEntry[];
|
|
64
|
+
/** Convenience list of items. */
|
|
65
|
+
items: FootageItem[];
|
|
66
|
+
/** Convenience list of files. */
|
|
67
|
+
files: File[];
|
|
68
|
+
};
|
|
69
|
+
export type MeliesTimelineSnapshot = {
|
|
70
|
+
/** Bump this when snapshot schema changes. */
|
|
71
|
+
version: 1;
|
|
72
|
+
/** Timeline rows/actions data (seconds). */
|
|
73
|
+
editorData: CusTomTimelineRow[];
|
|
74
|
+
/** UI selection (optional to restore). */
|
|
75
|
+
selectedActionId: string | null;
|
|
76
|
+
/** UI zoom (optional to restore). */
|
|
77
|
+
timelineScaleWidth: number;
|
|
78
|
+
};
|
|
79
|
+
export type MeliesVideoEditorRef = {
|
|
80
|
+
/**
|
|
81
|
+
* Get a deep-cloned snapshot of the current timeline state.
|
|
82
|
+
* Safe to store/mutate externally.
|
|
83
|
+
*/
|
|
84
|
+
getTimelineSnapshot: () => MeliesTimelineSnapshot;
|
|
85
|
+
/**
|
|
86
|
+
* Load a snapshot into the editor.
|
|
87
|
+
* Resets undo/redo history.
|
|
88
|
+
*/
|
|
89
|
+
setTimelineSnapshot: (snapshot: MeliesTimelineSnapshot) => void;
|
|
90
|
+
/**
|
|
91
|
+
* Get the imported `File` for a given footage item id (only for user-imported items).
|
|
92
|
+
* Returns null if the id was not imported this session.
|
|
93
|
+
*/
|
|
94
|
+
getImportedFileByFootageId: (footageId: string) => File | null;
|
|
95
|
+
/** List all imported files currently known to the editor (this session). */
|
|
96
|
+
listImportedFiles: () => Array<{
|
|
97
|
+
footageId: string;
|
|
98
|
+
file: File;
|
|
99
|
+
}>;
|
|
100
|
+
};
|
|
101
|
+
declare const MeliesVideoEditor: import("react").ForwardRefExoticComponent<MeliesVideoEditorProps & import("react").RefAttributes<MeliesVideoEditorRef>>;
|
|
102
|
+
export default MeliesVideoEditor;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TimelineEngine } from '@xzdarcy/react-timeline-editor';
|
|
2
|
+
declare class AudioControl {
|
|
3
|
+
private howlBySrc;
|
|
4
|
+
private activeByActionId;
|
|
5
|
+
private getHowl;
|
|
6
|
+
/**
|
|
7
|
+
* Ensure the underlying WebAudio context is resumed.
|
|
8
|
+
*
|
|
9
|
+
* Some browsers (notably iOS Safari) block audio playback until a user gesture
|
|
10
|
+
* resumes the AudioContext. Timeline engine callbacks may occur outside the
|
|
11
|
+
* original gesture call stack, so we explicitly unlock in the toolbar handler.
|
|
12
|
+
*/
|
|
13
|
+
unlock(): void;
|
|
14
|
+
warm(src: string): void;
|
|
15
|
+
private seekForEngineTime;
|
|
16
|
+
start(data: {
|
|
17
|
+
actionId: string;
|
|
18
|
+
engine: TimelineEngine;
|
|
19
|
+
src: string;
|
|
20
|
+
startTime: number;
|
|
21
|
+
time: number;
|
|
22
|
+
offset?: number;
|
|
23
|
+
}): void;
|
|
24
|
+
stop(data: {
|
|
25
|
+
actionId: string;
|
|
26
|
+
}): void;
|
|
27
|
+
}
|
|
28
|
+
declare const _default: AudioControl;
|
|
29
|
+
export default _default;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FC } from 'react';
|
|
2
|
+
import type { CustomTimelineAction, CusTomTimelineRow } from './mock';
|
|
3
|
+
export declare const CustomRender0: FC<{
|
|
4
|
+
action: CustomTimelineAction;
|
|
5
|
+
row: CusTomTimelineRow;
|
|
6
|
+
}>;
|
|
7
|
+
export declare const CustomRender1: FC<{
|
|
8
|
+
action: CustomTimelineAction;
|
|
9
|
+
row: CusTomTimelineRow;
|
|
10
|
+
}>;
|
|
11
|
+
export declare const CustomRender2: FC<{
|
|
12
|
+
action: CustomTimelineAction;
|
|
13
|
+
row: CusTomTimelineRow;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export default function HostApp({ footageUrls, footageFiles, footageFileHandles, }: {
|
|
2
|
+
footageUrls?: string[];
|
|
3
|
+
footageFiles?: File[];
|
|
4
|
+
footageFileHandles?: Array<{
|
|
5
|
+
getFile: () => Promise<File>;
|
|
6
|
+
name?: string;
|
|
7
|
+
}>;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
type OpfsRoot = FileSystemDirectoryHandle;
|
|
2
|
+
type Maybe<T> = T | null | undefined;
|
|
3
|
+
export type OpfsSupport = {
|
|
4
|
+
supported: boolean;
|
|
5
|
+
reason?: string;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Best-effort OPFS capability check.
|
|
9
|
+
*
|
|
10
|
+
* Notes:
|
|
11
|
+
* - Many browsers require a secure context (HTTPS); desktop browsers often treat localhost as secure.
|
|
12
|
+
* - Some mobile browsers may not implement OPFS at all.
|
|
13
|
+
*/
|
|
14
|
+
export declare const getOpfsSupport: () => OpfsSupport;
|
|
15
|
+
export declare const ensureOpfsRoot: () => Promise<OpfsRoot>;
|
|
16
|
+
export declare const ensureDir: (root: OpfsRoot, path: string) => Promise<FileSystemDirectoryHandle>;
|
|
17
|
+
export declare const writeBlobToOpfs: (opts: {
|
|
18
|
+
root: OpfsRoot;
|
|
19
|
+
dirPath: string;
|
|
20
|
+
fileName: string;
|
|
21
|
+
blob: Blob;
|
|
22
|
+
}) => Promise<{
|
|
23
|
+
fileHandle: FileSystemFileHandle;
|
|
24
|
+
path: string;
|
|
25
|
+
}>;
|
|
26
|
+
export declare const clearDir: (opts: {
|
|
27
|
+
root: OpfsRoot;
|
|
28
|
+
dirPath: string;
|
|
29
|
+
}) => Promise<void>;
|
|
30
|
+
export declare const listFiles: (opts: {
|
|
31
|
+
root: OpfsRoot;
|
|
32
|
+
dirPath: string;
|
|
33
|
+
}) => Promise<FileSystemFileHandle[]>;
|
|
34
|
+
export declare const getFileFromPublicUrl: (url: string, fallbackName?: Maybe<string>) => Promise<File>;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type FootageItem = {
|
|
2
|
+
id: string;
|
|
3
|
+
kind: 'video' | 'audio';
|
|
4
|
+
name: string;
|
|
5
|
+
src: string;
|
|
6
|
+
/** Optional lower-res/proxy source for smooth preview playback. */
|
|
7
|
+
previewSrc?: string;
|
|
8
|
+
defaultDuration?: number;
|
|
9
|
+
};
|
|
10
|
+
export declare const FOOTAGE_BIN: FootageItem[];
|
|
11
|
+
export declare const VIDEO_ITEMS: FootageItem[];
|
|
12
|
+
export declare const AUDIO_ITEMS: FootageItem[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'antd/dist/antd.css';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { default as MeliesVideoEditor } from '../App';
|
|
2
|
+
export type { MeliesFootageImportEntry, MeliesFootageImportEvent, MeliesTimelineSnapshot, MeliesVideoEditorProps, MeliesVideoEditorRef, } from '../App';
|
|
3
|
+
export type { TimelineAction, TimelineEffect, TimelineRow, TimelineState, } from '@xzdarcy/react-timeline-editor';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type AnimationItem } from 'lottie-web';
|
|
2
|
+
declare class LottieControl {
|
|
3
|
+
cacheMap: Record<string, AnimationItem>;
|
|
4
|
+
private _goToAndStop;
|
|
5
|
+
enter(data: {
|
|
6
|
+
id: string;
|
|
7
|
+
src: string;
|
|
8
|
+
startTime: number;
|
|
9
|
+
endTime: number;
|
|
10
|
+
time: number;
|
|
11
|
+
}): void;
|
|
12
|
+
update(data: {
|
|
13
|
+
id: string;
|
|
14
|
+
src: string;
|
|
15
|
+
startTime: number;
|
|
16
|
+
endTime: number;
|
|
17
|
+
time: number;
|
|
18
|
+
}): void;
|
|
19
|
+
leave(data: {
|
|
20
|
+
id: string;
|
|
21
|
+
startTime: number;
|
|
22
|
+
endTime: number;
|
|
23
|
+
time: number;
|
|
24
|
+
}): void;
|
|
25
|
+
destroy(): void;
|
|
26
|
+
}
|
|
27
|
+
declare const _default: LottieControl;
|
|
28
|
+
export default _default;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
type MediaKind = 'video' | 'audio' | 'other';
|
|
2
|
+
declare const guessKind: (src: string) => MediaKind;
|
|
3
|
+
declare class MediaCache {
|
|
4
|
+
private blobUrlBySrc;
|
|
5
|
+
private pendingBySrc;
|
|
6
|
+
private metaBySrc;
|
|
7
|
+
private durationSecBySrc;
|
|
8
|
+
private pendingDurationBySrc;
|
|
9
|
+
registerSrcMeta(src: string, meta: {
|
|
10
|
+
name?: string;
|
|
11
|
+
mimeType?: string;
|
|
12
|
+
}): void;
|
|
13
|
+
getSrcMeta(src: string): {
|
|
14
|
+
name?: string;
|
|
15
|
+
mimeType?: string;
|
|
16
|
+
} | undefined;
|
|
17
|
+
/** Returns the cached duration (seconds) if known. */
|
|
18
|
+
getCachedDurationSec(src: string): number | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Attempts to read media duration from browser metadata (seconds).
|
|
21
|
+
* Returns null when duration cannot be determined (e.g. unsupported/CORS/streaming).
|
|
22
|
+
*/
|
|
23
|
+
getDurationSec(src: string, kindHint?: MediaKind): Promise<number | null>;
|
|
24
|
+
/**
|
|
25
|
+
* Preloads a URL into memory and returns a blob: URL.
|
|
26
|
+
* Useful to avoid runtime buffering/stalls when seeking frequently.
|
|
27
|
+
*/
|
|
28
|
+
preloadToBlobUrl(src: string): Promise<string>;
|
|
29
|
+
/** Returns a blob URL if available, otherwise the original `src`. */
|
|
30
|
+
resolve(src: string): string;
|
|
31
|
+
/** Starts preload in background (non-blocking). */
|
|
32
|
+
warm(src: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Preload a list of srcs with bounded concurrency.
|
|
35
|
+
*
|
|
36
|
+
* This is useful when you know ahead of time which assets will be scrubbed/seeked,
|
|
37
|
+
* so we can eliminate network stalls during interaction.
|
|
38
|
+
*/
|
|
39
|
+
warmAll(srcs: Iterable<string>, opts?: {
|
|
40
|
+
/** Maximum number of concurrent fetches. Defaults to 3. */
|
|
41
|
+
concurrency?: number;
|
|
42
|
+
/** Yield back to the event loop between items. Defaults to true. */
|
|
43
|
+
yieldBetween?: boolean;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
/** Convenience: preload all unique action.data.src from editor data. */
|
|
46
|
+
warmFromEditorData(editorData: unknown): void;
|
|
47
|
+
}
|
|
48
|
+
declare const mediaCache: MediaCache;
|
|
49
|
+
export default mediaCache;
|
|
50
|
+
export { guessKind };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { TimelineAction, TimelineEffect, TimelineRow } from '@xzdarcy/react-timeline-editor';
|
|
2
|
+
export declare const scaleWidth = 160;
|
|
3
|
+
export declare const scale = 5;
|
|
4
|
+
export declare const startLeft = 20;
|
|
5
|
+
export interface CustomTimelineAction extends TimelineAction {
|
|
6
|
+
data: {
|
|
7
|
+
src: string;
|
|
8
|
+
previewSrc?: string;
|
|
9
|
+
name: string;
|
|
10
|
+
/** Video lane index (0=V1, 1=V2). Higher value wins when overlapping. */
|
|
11
|
+
videoLayer?: number;
|
|
12
|
+
/** Shared id for clips that should move/trim together (e.g. video + its embedded audio). */
|
|
13
|
+
linkId?: string;
|
|
14
|
+
/**
|
|
15
|
+
* In-point offset into the underlying media (seconds).
|
|
16
|
+
* Used for split clips so the right segment continues from the correct time.
|
|
17
|
+
*/
|
|
18
|
+
offset?: number;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface CusTomTimelineRow extends TimelineRow {
|
|
22
|
+
actions: CustomTimelineAction[];
|
|
23
|
+
}
|
|
24
|
+
export declare const mockEffect: Record<string, TimelineEffect>;
|
|
25
|
+
export declare const mockData: CusTomTimelineRow[];
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TimelineState } from '@xzdarcy/react-timeline-editor';
|
|
2
|
+
export declare const Rates: number[];
|
|
3
|
+
declare const TimelinePlayer: ({ timelineState, autoScrollWhenPlay, scale, scaleWidth, startLeft, editorData, selectedActionId, onDeleteSelectedClip, onSplitSelectedClip, canUndo, canRedo, onUndo, onRedo, }: {
|
|
4
|
+
timelineState: React.MutableRefObject<TimelineState | null>;
|
|
5
|
+
autoScrollWhenPlay: React.MutableRefObject<boolean>;
|
|
6
|
+
scale: number;
|
|
7
|
+
scaleWidth: number;
|
|
8
|
+
startLeft: number;
|
|
9
|
+
editorData: any[];
|
|
10
|
+
selectedActionId: string | null;
|
|
11
|
+
onDeleteSelectedClip: () => void;
|
|
12
|
+
onSplitSelectedClip: () => void;
|
|
13
|
+
canUndo: boolean;
|
|
14
|
+
canRedo: boolean;
|
|
15
|
+
onUndo: () => void;
|
|
16
|
+
onRedo: () => void;
|
|
17
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export default TimelinePlayer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useCoarsePointer(): boolean;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { TimelineEngine, TimelineRow } from '@xzdarcy/react-timeline-editor';
|
|
2
|
+
declare class VideoControl {
|
|
3
|
+
private primaryEl;
|
|
4
|
+
private secondaryEl;
|
|
5
|
+
private activeEl;
|
|
6
|
+
private rowData;
|
|
7
|
+
private boundEngine;
|
|
8
|
+
private vfcHandle;
|
|
9
|
+
private rafHandle;
|
|
10
|
+
private isPlaying;
|
|
11
|
+
private playbackRate;
|
|
12
|
+
private lastVideoClip;
|
|
13
|
+
private lastKnownTime;
|
|
14
|
+
constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Called by App.tsx to provide the two video elements.
|
|
17
|
+
*/
|
|
18
|
+
attachPrimary(el: HTMLVideoElement | null): void;
|
|
19
|
+
attachSecondary(el: HTMLVideoElement | null): void;
|
|
20
|
+
/**
|
|
21
|
+
* Helper to set initial styling/events for video elements.
|
|
22
|
+
*/
|
|
23
|
+
private initElement;
|
|
24
|
+
/**
|
|
25
|
+
* Deprecated single-element attach, mapped to primary for safety.
|
|
26
|
+
*/
|
|
27
|
+
attach(el: HTMLVideoElement | null): void;
|
|
28
|
+
/**
|
|
29
|
+
* Called by App.tsx whenever timeline data changes.
|
|
30
|
+
*/
|
|
31
|
+
setEditorData(data: TimelineRow[]): void;
|
|
32
|
+
/**
|
|
33
|
+
* We use claimVideo to drive the dual-buffer logic from the engine's time updates.
|
|
34
|
+
* This ensures we sync to the engine's clock (Slave Mode).
|
|
35
|
+
*/
|
|
36
|
+
claimVideo(data: {
|
|
37
|
+
isPlaying?: boolean;
|
|
38
|
+
time?: number;
|
|
39
|
+
[key: string]: unknown;
|
|
40
|
+
}): void;
|
|
41
|
+
bindEngine(engine: TimelineEngine): void;
|
|
42
|
+
unbindEngine(): void;
|
|
43
|
+
private startLoop;
|
|
44
|
+
private stopLoop;
|
|
45
|
+
/**
|
|
46
|
+
* The main heart beat.
|
|
47
|
+
* - If playing: sync engine time to video time.
|
|
48
|
+
* - Always: Check schedule (what should be playing vs preloading).
|
|
49
|
+
*/
|
|
50
|
+
private tickLoop;
|
|
51
|
+
/**
|
|
52
|
+
* Evaluate the timeline at `time` (and `time + lookahead`).
|
|
53
|
+
* Manage Primary/Secondary elements.
|
|
54
|
+
*/
|
|
55
|
+
private updateState;
|
|
56
|
+
private makeActive;
|
|
57
|
+
private loadVideo;
|
|
58
|
+
private isLoaded;
|
|
59
|
+
private findClipAtTime;
|
|
60
|
+
private findNextVideoClipStartAfter;
|
|
61
|
+
private findNextVideoClipAfter;
|
|
62
|
+
play(): void;
|
|
63
|
+
pause(): void;
|
|
64
|
+
setRate(rate: number): void;
|
|
65
|
+
seek(time: number): void;
|
|
66
|
+
warm(src: string): void;
|
|
67
|
+
releaseVideo(_actionId: string): void;
|
|
68
|
+
setActive(_active: boolean): void;
|
|
69
|
+
/**
|
|
70
|
+
* Returns the active (visible) video element, if any.
|
|
71
|
+
* Useful for UI-level logic that needs to wait for buffering after a seek.
|
|
72
|
+
*/
|
|
73
|
+
getActiveVideoElement(): HTMLVideoElement | null;
|
|
74
|
+
/**
|
|
75
|
+
* Checks whether a video has at least `minSecondsAhead` buffered at its current time.
|
|
76
|
+
*
|
|
77
|
+
* Note: buffered ranges are in media time, not timeline time.
|
|
78
|
+
*/
|
|
79
|
+
private hasBufferedAhead;
|
|
80
|
+
/**
|
|
81
|
+
* Waits until the active element appears ready for smooth playback after a seek.
|
|
82
|
+
* Returns true if the readiness criteria is met before timing out.
|
|
83
|
+
*/
|
|
84
|
+
waitForActiveBufferedAhead(opts?: {
|
|
85
|
+
minSecondsAhead?: number;
|
|
86
|
+
timeoutMs?: number;
|
|
87
|
+
pollMs?: number;
|
|
88
|
+
}): Promise<boolean>;
|
|
89
|
+
}
|
|
90
|
+
declare const _default: VideoControl;
|
|
91
|
+
export default _default;
|