@remotion/media 4.0.451 → 4.0.453
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/audio/audio-for-preview.d.ts +0 -1
- package/dist/audio/audio-preview-iterator.d.ts +13 -39
- package/dist/audio/get-scheduled-time.d.ts +3 -3
- package/dist/audio/props.d.ts +0 -1
- package/dist/audio/sort-by-priority.d.ts +1 -0
- package/dist/audio-iterator-manager.d.ts +41 -47
- package/dist/canvas-ahead-of-time.d.ts +13 -0
- package/dist/debug-overlay/preview-overlay.d.ts +32 -47
- package/dist/esm/index.mjs +846 -918
- package/dist/index.d.ts +0 -1
- package/dist/make-iterator-with-priming.d.ts +9 -2
- package/dist/media-player.d.ts +16 -16
- package/dist/prewarm-iterator-for-looping.d.ts +5 -11
- package/dist/shared-audio-context-for-media-player.d.ts +2 -0
- package/dist/use-common-effects.d.ts +1 -8
- package/dist/video/props.d.ts +0 -1
- package/dist/video/video-for-preview.d.ts +0 -1
- package/dist/video/video-preview-iterator.d.ts +6 -3
- package/dist/video/video.d.ts +0 -1
- package/dist/video-iterator-manager.d.ts +4 -4
- package/package.json +3 -3
- package/dist/audio/decode-pool.d.ts +0 -7
- package/dist/audio-decode-scheduler.d.ts +0 -14
- package/dist/draw-with-object-fit.d.ts +0 -14
- package/dist/set-global-time-anchor.d.ts +0 -11
package/dist/index.d.ts
CHANGED
|
@@ -34,7 +34,6 @@ export declare const experimental_Video: import("react").ComponentType<{
|
|
|
34
34
|
toneFrequency: number;
|
|
35
35
|
showInTimeline: boolean;
|
|
36
36
|
debugOverlay: boolean;
|
|
37
|
-
debugAudioScheduling: boolean;
|
|
38
37
|
headless: boolean;
|
|
39
38
|
onError: import("./on-error").MediaOnError | undefined;
|
|
40
39
|
credentials: RequestCredentials | undefined;
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import type { AudioBufferSink, WrappedAudioBuffer } from 'mediabunny';
|
|
2
|
-
export
|
|
2
|
+
export type BufferWithMediaTimestamp = {
|
|
3
|
+
buffer: WrappedAudioBuffer;
|
|
4
|
+
timestamp: number;
|
|
5
|
+
};
|
|
6
|
+
export declare const makeIteratorWithPriming: ({ audioSink, timeToSeek, maximumTimestamp, loop, playbackRate, sequenceDurationInSeconds, }: {
|
|
3
7
|
audioSink: AudioBufferSink;
|
|
4
8
|
timeToSeek: number;
|
|
5
9
|
maximumTimestamp: number;
|
|
6
|
-
|
|
10
|
+
loop: boolean;
|
|
11
|
+
playbackRate: number;
|
|
12
|
+
sequenceDurationInSeconds: number;
|
|
13
|
+
}) => AsyncGenerator<BufferWithMediaTimestamp, void, unknown>;
|
package/dist/media-player.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export type MediaPlayerInitResult = {
|
|
|
17
17
|
type: 'disposed';
|
|
18
18
|
};
|
|
19
19
|
export declare class MediaPlayer {
|
|
20
|
+
private tagType;
|
|
20
21
|
private canvas;
|
|
21
22
|
private context;
|
|
22
23
|
private src;
|
|
@@ -27,16 +28,15 @@ export declare class MediaPlayer {
|
|
|
27
28
|
private sharedAudioContext;
|
|
28
29
|
audioIteratorManager: AudioIteratorManager | null;
|
|
29
30
|
videoIteratorManager: VideoIteratorManager | null;
|
|
30
|
-
private sequenceOffset;
|
|
31
31
|
private playing;
|
|
32
32
|
private loop;
|
|
33
33
|
private fps;
|
|
34
34
|
private trimBefore;
|
|
35
35
|
private trimAfter;
|
|
36
|
-
private
|
|
36
|
+
private sequenceDurationInFrames;
|
|
37
|
+
private sequenceOffset;
|
|
37
38
|
private totalDuration;
|
|
38
39
|
private debugOverlay;
|
|
39
|
-
private debugAudioScheduling;
|
|
40
40
|
private nonceManager;
|
|
41
41
|
private onVideoFrameCallback;
|
|
42
42
|
private initializationPromise;
|
|
@@ -44,7 +44,7 @@ export declare class MediaPlayer {
|
|
|
44
44
|
private isPremounting;
|
|
45
45
|
private isPostmounting;
|
|
46
46
|
private seekPromiseChain;
|
|
47
|
-
constructor({ canvas, src, logLevel, sharedAudioContext, loop, trimBefore, trimAfter, playbackRate, globalPlaybackRate, audioStreamIndex, fps, debugOverlay,
|
|
47
|
+
constructor({ canvas, src, logLevel, sharedAudioContext, loop, trimBefore, trimAfter, playbackRate, globalPlaybackRate, audioStreamIndex, fps, debugOverlay, bufferState, isPremounting, isPostmounting, durationInFrames, onVideoFrameCallback, playing, sequenceOffset, credentials, tagType }: {
|
|
48
48
|
canvas: HTMLCanvasElement | OffscreenCanvas | null;
|
|
49
49
|
src: string;
|
|
50
50
|
logLevel: LogLevel;
|
|
@@ -57,7 +57,6 @@ export declare class MediaPlayer {
|
|
|
57
57
|
audioStreamIndex: number;
|
|
58
58
|
fps: number;
|
|
59
59
|
debugOverlay: boolean;
|
|
60
|
-
debugAudioScheduling: boolean;
|
|
61
60
|
bufferState: ReturnType<typeof useBufferState>;
|
|
62
61
|
isPremounting: boolean;
|
|
63
62
|
isPostmounting: boolean;
|
|
@@ -66,40 +65,41 @@ export declare class MediaPlayer {
|
|
|
66
65
|
playing: boolean;
|
|
67
66
|
sequenceOffset: number;
|
|
68
67
|
credentials: RequestCredentials | undefined;
|
|
68
|
+
tagType: 'audio' | 'video';
|
|
69
69
|
});
|
|
70
70
|
private input;
|
|
71
71
|
private isDisposalError;
|
|
72
72
|
initialize(startTimeUnresolved: number, initialMuted: boolean): Promise<MediaPlayerInitResult>;
|
|
73
73
|
private getStartTime;
|
|
74
|
-
private
|
|
74
|
+
private getSequenceEndTimestamp;
|
|
75
|
+
private getSequenceDurationInSeconds;
|
|
76
|
+
private getMediaEndTimestamp;
|
|
77
|
+
private getLoopSegmentMediaEndTimestamp;
|
|
75
78
|
private _initialize;
|
|
76
79
|
private seekToWithQueue;
|
|
77
80
|
seekTo(time: number): Promise<void>;
|
|
78
81
|
private seekToDoNotCallDirectly;
|
|
79
|
-
playAudio(): void;
|
|
80
82
|
play(): void;
|
|
81
83
|
private delayPlaybackHandleIfNotPremounting;
|
|
82
84
|
pause(): void;
|
|
83
85
|
setMuted(muted: boolean): void;
|
|
84
86
|
setVolume(volume: number): void;
|
|
85
87
|
private getTrimmedTime;
|
|
86
|
-
private updateAfterTrimChange;
|
|
87
88
|
setTrimBefore(trimBefore: number | undefined, unloopedTimeInSeconds: number): Promise<void>;
|
|
88
89
|
setTrimAfter(trimAfter: number | undefined, unloopedTimeInSeconds: number): Promise<void>;
|
|
89
90
|
setDebugOverlay(debugOverlay: boolean): void;
|
|
90
|
-
setDebugAudioScheduling(debugAudioScheduling: boolean): void;
|
|
91
|
-
private rescheduleAudioChunks;
|
|
92
91
|
setPlaybackRate(rate: number, unloopedTimeInSeconds: number): Promise<void>;
|
|
93
|
-
setGlobalPlaybackRate(rate: number): void
|
|
94
|
-
setFps(fps: number): void
|
|
92
|
+
setGlobalPlaybackRate(rate: number, unloopedTimeInSeconds: number): Promise<void>;
|
|
93
|
+
setFps(fps: number, unloopedTimeInSeconds: number): Promise<void>;
|
|
95
94
|
setIsPremounting(isPremounting: boolean): void;
|
|
96
95
|
setIsPostmounting(isPostmounting: boolean): void;
|
|
97
|
-
setLoop(loop: boolean): void
|
|
98
|
-
setSequenceOffset(offset: number): void
|
|
99
|
-
|
|
96
|
+
setLoop(loop: boolean, unloopedTimeInSeconds: number): Promise<void>;
|
|
97
|
+
setSequenceOffset(offset: number, unloopedTimeInSeconds: number): Promise<void>;
|
|
98
|
+
setSequenceDurationInFrames(sequenceDurationInFrames: number, unloopedTimeInSeconds: number): Promise<void>;
|
|
100
99
|
dispose(): Promise<void>;
|
|
100
|
+
private getTargetTime;
|
|
101
101
|
private scheduleAudioNode;
|
|
102
|
-
private getAudioPlaybackTime;
|
|
103
102
|
setVideoFrameCallback(callback: null | ((frame: CanvasImageSource) => void)): void;
|
|
104
103
|
private drawDebugOverlay;
|
|
104
|
+
audioSyncAnchorChanged: () => void;
|
|
105
105
|
}
|
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CanvasSink } from 'mediabunny';
|
|
2
2
|
export declare const makePrewarmedVideoIteratorCache: (videoSink: CanvasSink) => {
|
|
3
3
|
prewarmIteratorForLooping: ({ timeToSeek }: {
|
|
4
4
|
timeToSeek: number;
|
|
5
5
|
}) => void;
|
|
6
|
-
makeIteratorOrUsePrewarmed: (timeToSeek: number) =>
|
|
6
|
+
makeIteratorOrUsePrewarmed: (timeToSeek: number) => {
|
|
7
|
+
next: () => import("./canvas-ahead-of-time").CanvasAheadOfTimeNext;
|
|
8
|
+
closeIterator: () => Promise<void>;
|
|
9
|
+
};
|
|
7
10
|
destroy: () => void;
|
|
8
11
|
};
|
|
9
12
|
export type PrewarmedVideoIteratorCache = ReturnType<typeof makePrewarmedVideoIteratorCache>;
|
|
10
|
-
export declare const makePrewarmedAudioIteratorCache: (audioSink: AudioBufferSink) => {
|
|
11
|
-
prewarmIteratorForLooping: ({ timeToSeek, maximumTimestamp, }: {
|
|
12
|
-
timeToSeek: number;
|
|
13
|
-
maximumTimestamp: number;
|
|
14
|
-
}) => void;
|
|
15
|
-
makeIteratorOrUsePrewarmed: (timeToSeek: number, maximumTimestamp: number) => AsyncGenerator<WrappedAudioBuffer, void, unknown>;
|
|
16
|
-
destroy: () => void;
|
|
17
|
-
};
|
|
18
|
-
export type PrewarmedAudioIteratorCache = ReturnType<typeof makePrewarmedAudioIteratorCache>;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { ScheduleAudioNodeOptions, ScheduleAudioNodeResult } from 'remotion';
|
|
2
2
|
export type SharedAudioContextForMediaPlayer = {
|
|
3
3
|
audioContext: AudioContext;
|
|
4
|
+
gainNode: GainNode;
|
|
4
5
|
audioSyncAnchor: {
|
|
5
6
|
value: number;
|
|
6
7
|
};
|
|
7
8
|
scheduleAudioNode: (options: ScheduleAudioNodeOptions) => ScheduleAudioNodeResult;
|
|
9
|
+
unscheduleAudioNode: (node: AudioBufferSourceNode) => void;
|
|
8
10
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
2
|
import type { MediaPlayer } from './media-player';
|
|
3
|
-
export declare const useCommonEffects: ({ mediaPlayerRef, mediaPlayerReady, currentTimeRef, playing, isPlayerBuffering, frame, trimBefore, trimAfter, effectiveMuted, userPreferredVolume, playbackRate, globalPlaybackRate, fps, sequenceOffset, loop,
|
|
3
|
+
export declare const useCommonEffects: ({ mediaPlayerRef, mediaPlayerReady, currentTimeRef, playing, isPlayerBuffering, frame, trimBefore, trimAfter, effectiveMuted, userPreferredVolume, playbackRate, globalPlaybackRate, fps, sequenceOffset, loop, durationInFrames, isPremounting, isPostmounting, currentTime, logLevel, label, }: {
|
|
4
4
|
readonly mediaPlayerRef: React.RefObject<MediaPlayer | null>;
|
|
5
5
|
readonly mediaPlayerReady: boolean;
|
|
6
6
|
readonly currentTimeRef: React.RefObject<number>;
|
|
@@ -16,17 +16,10 @@ export declare const useCommonEffects: ({ mediaPlayerRef, mediaPlayerReady, curr
|
|
|
16
16
|
readonly fps: number;
|
|
17
17
|
readonly sequenceOffset: number;
|
|
18
18
|
readonly loop: boolean;
|
|
19
|
-
readonly debugAudioScheduling: boolean;
|
|
20
19
|
readonly durationInFrames: number;
|
|
21
20
|
readonly isPremounting: boolean;
|
|
22
21
|
readonly isPostmounting: boolean;
|
|
23
22
|
readonly currentTime: number;
|
|
24
23
|
readonly logLevel: "error" | "info" | "trace" | "verbose" | "warn";
|
|
25
|
-
readonly sharedAudioContext: {
|
|
26
|
-
readonly audioContext: AudioContext | null;
|
|
27
|
-
readonly audioSyncAnchor: {
|
|
28
|
-
value: number;
|
|
29
|
-
};
|
|
30
|
-
} | null;
|
|
31
24
|
readonly label: string;
|
|
32
25
|
}) => void;
|
package/dist/video/props.d.ts
CHANGED
|
@@ -22,7 +22,6 @@ type VideoForPreviewProps = {
|
|
|
22
22
|
readonly fallbackOffthreadVideoProps: FallbackOffthreadVideoProps;
|
|
23
23
|
readonly audioStreamIndex: number;
|
|
24
24
|
readonly debugOverlay: boolean;
|
|
25
|
-
readonly debugAudioScheduling: boolean;
|
|
26
25
|
readonly headless: boolean;
|
|
27
26
|
readonly onError: MediaOnError | undefined;
|
|
28
27
|
readonly credentials: RequestCredentials | undefined;
|
|
@@ -3,18 +3,21 @@ export declare const createVideoIterator: (timeToSeek: number, cache: {
|
|
|
3
3
|
prewarmIteratorForLooping: ({ timeToSeek }: {
|
|
4
4
|
timeToSeek: number;
|
|
5
5
|
}) => void;
|
|
6
|
-
makeIteratorOrUsePrewarmed: (timeToSeek: number) =>
|
|
6
|
+
makeIteratorOrUsePrewarmed: (timeToSeek: number) => {
|
|
7
|
+
next: () => import("../canvas-ahead-of-time").CanvasAheadOfTimeNext;
|
|
8
|
+
closeIterator: () => Promise<void>;
|
|
9
|
+
};
|
|
7
10
|
destroy: () => void;
|
|
8
11
|
}) => Promise<{
|
|
9
12
|
destroy: () => void;
|
|
10
13
|
initialFrame: WrappedCanvas | null;
|
|
11
14
|
isDestroyed: () => boolean;
|
|
12
|
-
tryToSatisfySeek: (time: number) =>
|
|
15
|
+
tryToSatisfySeek: (time: number) => {
|
|
13
16
|
type: "not-satisfied";
|
|
14
17
|
reason: string;
|
|
15
18
|
} | {
|
|
16
19
|
type: "satisfied";
|
|
17
20
|
frame: WrappedCanvas;
|
|
18
|
-
}
|
|
21
|
+
};
|
|
19
22
|
}>;
|
|
20
23
|
export type VideoIterator = Awaited<ReturnType<typeof createVideoIterator>>;
|
package/dist/video/video.d.ts
CHANGED
|
@@ -26,7 +26,6 @@ export declare const Video: React.ComponentType<{
|
|
|
26
26
|
toneFrequency: number;
|
|
27
27
|
showInTimeline: boolean;
|
|
28
28
|
debugOverlay: boolean;
|
|
29
|
-
debugAudioScheduling: boolean;
|
|
30
29
|
headless: boolean;
|
|
31
30
|
onError: import("../on-error").MediaOnError | undefined;
|
|
32
31
|
credentials: RequestCredentials | undefined;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { InputVideoTrack, WrappedCanvas } from 'mediabunny';
|
|
2
2
|
import type { DelayPlaybackIfNotPremounting } from './delay-playback-if-not-premounting';
|
|
3
3
|
import type { Nonce } from './nonce-manager';
|
|
4
|
-
export declare const videoIteratorManager: ({ delayPlaybackHandleIfNotPremounting, canvas, context, drawDebugOverlay, logLevel, getOnVideoFrameCallback, videoTrack,
|
|
4
|
+
export declare const videoIteratorManager: ({ delayPlaybackHandleIfNotPremounting, canvas, context, drawDebugOverlay, logLevel, getOnVideoFrameCallback, videoTrack, getLoopSegmentMediaEndTimestamp, getStartTime, getIsLooping, }: {
|
|
5
5
|
videoTrack: InputVideoTrack;
|
|
6
6
|
delayPlaybackHandleIfNotPremounting: () => DelayPlaybackIfNotPremounting;
|
|
7
7
|
context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;
|
|
@@ -9,7 +9,7 @@ export declare const videoIteratorManager: ({ delayPlaybackHandleIfNotPremountin
|
|
|
9
9
|
getOnVideoFrameCallback: () => ((frame: CanvasImageSource) => void) | null;
|
|
10
10
|
logLevel: "error" | "info" | "trace" | "verbose" | "warn";
|
|
11
11
|
drawDebugOverlay: () => void;
|
|
12
|
-
|
|
12
|
+
getLoopSegmentMediaEndTimestamp: () => number;
|
|
13
13
|
getStartTime: () => number;
|
|
14
14
|
getIsLooping: () => boolean;
|
|
15
15
|
}) => {
|
|
@@ -24,13 +24,13 @@ export declare const videoIteratorManager: ({ delayPlaybackHandleIfNotPremountin
|
|
|
24
24
|
destroy: () => void;
|
|
25
25
|
initialFrame: WrappedCanvas | null;
|
|
26
26
|
isDestroyed: () => boolean;
|
|
27
|
-
tryToSatisfySeek: (time: number) =>
|
|
27
|
+
tryToSatisfySeek: (time: number) => {
|
|
28
28
|
type: "not-satisfied";
|
|
29
29
|
reason: string;
|
|
30
30
|
} | {
|
|
31
31
|
type: "satisfied";
|
|
32
32
|
frame: WrappedCanvas;
|
|
33
|
-
}
|
|
33
|
+
};
|
|
34
34
|
} | null;
|
|
35
35
|
drawFrame: (frame: WrappedCanvas) => void;
|
|
36
36
|
getFramesRendered: () => number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remotion/media",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.453",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"module": "dist/esm/index.mjs",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"mediabunny": "1.39.2",
|
|
26
|
-
"remotion": "4.0.
|
|
26
|
+
"remotion": "4.0.453",
|
|
27
27
|
"zod": "4.3.6"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"react-dom": ">=16.8.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@remotion/eslint-config-internal": "4.0.
|
|
34
|
+
"@remotion/eslint-config-internal": "4.0.453",
|
|
35
35
|
"@vitest/browser-webdriverio": "4.0.9",
|
|
36
36
|
"eslint": "9.19.0",
|
|
37
37
|
"react": "19.2.3",
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export declare class AudioDecodeScheduler {
|
|
2
|
-
private activeTurns;
|
|
3
|
-
private nextId;
|
|
4
|
-
private queue;
|
|
5
|
-
private pendingBatch;
|
|
6
|
-
private batchTimer;
|
|
7
|
-
requestTurn(priority: number): Promise<number>;
|
|
8
|
-
releaseTurn(id: number): void;
|
|
9
|
-
private processBatch;
|
|
10
|
-
private grant;
|
|
11
|
-
private getMinActivePriority;
|
|
12
|
-
private grantEligibleWaiters;
|
|
13
|
-
}
|
|
14
|
-
export declare const getAudioDecodeScheduler: (audioContext: AudioContext) => AudioDecodeScheduler;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export type ObjectFitValue = 'fill' | 'contain' | 'cover' | 'none' | 'scale-down';
|
|
2
|
-
/**
|
|
3
|
-
* Draws a source image onto a canvas context with the specified object-fit behavior.
|
|
4
|
-
* This implements object-fit at the canvas drawing level, which is more reliable
|
|
5
|
-
* than CSS object-fit on canvas elements.
|
|
6
|
-
*/
|
|
7
|
-
export declare const drawWithObjectFit: (ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, source: CanvasImageSource, options: {
|
|
8
|
-
sourceWidth: number;
|
|
9
|
-
sourceHeight: number;
|
|
10
|
-
destWidth: number;
|
|
11
|
-
destHeight: number;
|
|
12
|
-
fit: ObjectFitValue;
|
|
13
|
-
}) => void;
|
|
14
|
-
export declare const parseObjectFit: (value: string | undefined) => ObjectFitValue | null;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export declare const ALLOWED_GLOBAL_TIME_ANCHOR_SHIFT = 0.1;
|
|
2
|
-
export declare const setGlobalTimeAnchor: ({ audioContext, audioSyncAnchor, absoluteTimeInSeconds, globalPlaybackRate, debugAudioScheduling, logLevel, }: {
|
|
3
|
-
audioContext: AudioContext;
|
|
4
|
-
audioSyncAnchor: {
|
|
5
|
-
value: number;
|
|
6
|
-
};
|
|
7
|
-
absoluteTimeInSeconds: number;
|
|
8
|
-
globalPlaybackRate: number;
|
|
9
|
-
debugAudioScheduling: boolean;
|
|
10
|
-
logLevel: "error" | "info" | "trace" | "verbose" | "warn";
|
|
11
|
-
}) => void;
|