@remotion/media 4.0.508 → 4.0.510
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-iterator-manager.d.ts +1 -8
- package/dist/caches.d.ts +6 -6
- package/dist/esm/index.mjs +32 -58
- package/dist/extract-frame-and-audio.d.ts +2 -2
- package/dist/serialized-queue.d.ts +1 -0
- package/dist/video-extraction/extract-frame-via-broadcast-channel.d.ts +2 -2
- package/package.json +4 -4
|
@@ -16,7 +16,7 @@ export declare const anchorToContinuousTime: ({ anchor, unloopedTimeInSeconds, p
|
|
|
16
16
|
unloopedTimeInSeconds: number;
|
|
17
17
|
playbackRate: number;
|
|
18
18
|
}) => number;
|
|
19
|
-
export declare const audioIteratorManager: ({ audioTrack, delayPlaybackHandleIfNotPremounting, sharedAudioContext, getSequenceEndTimestamp, getSequenceDurationInSeconds, getMediaEndTimestamp, getStartTime, initialMuted, drawDebugOverlay,
|
|
19
|
+
export declare const audioIteratorManager: ({ audioTrack, delayPlaybackHandleIfNotPremounting, sharedAudioContext, getSequenceEndTimestamp, getSequenceDurationInSeconds, getMediaEndTimestamp, getStartTime, initialMuted, drawDebugOverlay, }: {
|
|
20
20
|
audioTrack: InputAudioTrack;
|
|
21
21
|
delayPlaybackHandleIfNotPremounting: () => DelayPlaybackIfNotPremounting;
|
|
22
22
|
sharedAudioContext: SharedAudioContextForMediaPlayer;
|
|
@@ -26,13 +26,6 @@ export declare const audioIteratorManager: ({ audioTrack, delayPlaybackHandleIfN
|
|
|
26
26
|
getStartTime: () => number;
|
|
27
27
|
initialMuted: boolean;
|
|
28
28
|
drawDebugOverlay: () => void;
|
|
29
|
-
initialPlaybackRate: number;
|
|
30
|
-
initialTrimBefore: number | undefined;
|
|
31
|
-
initialTrimAfter: number | undefined;
|
|
32
|
-
initialSequenceOffset: number;
|
|
33
|
-
initialSequenceDurationInFrames: number;
|
|
34
|
-
initialLoop: boolean;
|
|
35
|
-
initialFps: number;
|
|
36
29
|
}) => {
|
|
37
30
|
startAudioIterator: ({ nonce, playbackRate, startFromSecond, unloopedStartFromSecond, scheduleAudioNode, getTargetTime, logLevel, loop, unscheduleAudioNode, getAudioContextCurrentTimeMockedInTest, }: {
|
|
38
31
|
startFromSecond: number;
|
package/dist/caches.d.ts
CHANGED
|
@@ -90,8 +90,8 @@ export declare const makeMediaCache: () => {
|
|
|
90
90
|
totalSize: number;
|
|
91
91
|
};
|
|
92
92
|
isDisposed: () => boolean;
|
|
93
|
-
queueFrameExtraction: <T>(
|
|
94
|
-
queueAudioExtraction: <T>(
|
|
93
|
+
queueFrameExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
|
|
94
|
+
queueAudioExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
|
|
95
95
|
dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
|
|
96
96
|
};
|
|
97
97
|
export type MediaCache = ReturnType<typeof makeMediaCache>;
|
|
@@ -185,8 +185,8 @@ export declare const globalMediaCache: {
|
|
|
185
185
|
totalSize: number;
|
|
186
186
|
};
|
|
187
187
|
isDisposed: () => boolean;
|
|
188
|
-
queueFrameExtraction: <T>(
|
|
189
|
-
queueAudioExtraction: <T>(
|
|
188
|
+
queueFrameExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
|
|
189
|
+
queueAudioExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
|
|
190
190
|
dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
|
|
191
191
|
};
|
|
192
192
|
export declare const keyframeManager: {
|
|
@@ -352,8 +352,8 @@ export declare const useRenderMediaCache: (logLevel: "error" | "info" | "trace"
|
|
|
352
352
|
totalSize: number;
|
|
353
353
|
};
|
|
354
354
|
isDisposed: () => boolean;
|
|
355
|
-
queueFrameExtraction: <T>(
|
|
356
|
-
queueAudioExtraction: <T>(
|
|
355
|
+
queueFrameExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
|
|
356
|
+
queueAudioExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
|
|
357
357
|
dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
|
|
358
358
|
};
|
|
359
359
|
export { getMaxVideoCacheSize };
|
package/dist/esm/index.mjs
CHANGED
|
@@ -435,27 +435,11 @@ var audioIteratorManager = ({
|
|
|
435
435
|
getMediaEndTimestamp,
|
|
436
436
|
getStartTime,
|
|
437
437
|
initialMuted,
|
|
438
|
-
drawDebugOverlay
|
|
439
|
-
initialPlaybackRate,
|
|
440
|
-
initialTrimBefore,
|
|
441
|
-
initialTrimAfter,
|
|
442
|
-
initialSequenceOffset,
|
|
443
|
-
initialSequenceDurationInFrames,
|
|
444
|
-
initialLoop,
|
|
445
|
-
initialFps
|
|
438
|
+
drawDebugOverlay
|
|
446
439
|
}) => {
|
|
447
440
|
let muted = initialMuted;
|
|
448
441
|
let currentVolume = 1;
|
|
449
|
-
let currentSeek =
|
|
450
|
-
time: -1,
|
|
451
|
-
playbackRate: initialPlaybackRate,
|
|
452
|
-
trimBefore: initialTrimBefore,
|
|
453
|
-
trimAfter: initialTrimAfter,
|
|
454
|
-
sequenceOffset: initialSequenceOffset,
|
|
455
|
-
sequenceDurationInFrames: initialSequenceDurationInFrames,
|
|
456
|
-
loop: initialLoop,
|
|
457
|
-
fps: initialFps
|
|
458
|
-
};
|
|
442
|
+
let currentSeek = null;
|
|
459
443
|
const gainNode = sharedAudioContext.audioContext.createGain();
|
|
460
444
|
gainNode.connect(sharedAudioContext.gainNode);
|
|
461
445
|
const audioSink = new AudioBufferSink(audioTrack);
|
|
@@ -735,7 +719,7 @@ var audioIteratorManager = ({
|
|
|
735
719
|
if (nonce.isStale()) {
|
|
736
720
|
return;
|
|
737
721
|
}
|
|
738
|
-
if (currentSeek.time === newTime && currentSeek.playbackRate === playbackRate && currentSeek.trimBefore === trimBefore && currentSeek.trimAfter === trimAfter && currentSeek.sequenceOffset === sequenceOffset && currentSeek.sequenceDurationInFrames === sequenceDurationInFrames && currentSeek.loop === loop && currentSeek.fps === fps) {
|
|
722
|
+
if (currentSeek !== null && currentSeek.time === newTime && currentSeek.playbackRate === playbackRate && currentSeek.trimBefore === trimBefore && currentSeek.trimAfter === trimAfter && currentSeek.sequenceOffset === sequenceOffset && currentSeek.sequenceDurationInFrames === sequenceDurationInFrames && currentSeek.loop === loop && currentSeek.fps === fps) {
|
|
739
723
|
return;
|
|
740
724
|
}
|
|
741
725
|
currentSeek = {
|
|
@@ -794,6 +778,7 @@ var audioIteratorManager = ({
|
|
|
794
778
|
audioBufferIterator?.destroy();
|
|
795
779
|
audioBufferIterator = null;
|
|
796
780
|
currentAnchor = null;
|
|
781
|
+
currentSeek = null;
|
|
797
782
|
unblockCurrentDelayHandle();
|
|
798
783
|
},
|
|
799
784
|
seek,
|
|
@@ -1845,8 +1830,7 @@ class MediaPlayer {
|
|
|
1845
1830
|
this.getEffectChainState = getEffectChainState;
|
|
1846
1831
|
if (canvas) {
|
|
1847
1832
|
const context = canvas.getContext("2d", {
|
|
1848
|
-
alpha: true
|
|
1849
|
-
desynchronized: true
|
|
1833
|
+
alpha: true
|
|
1850
1834
|
});
|
|
1851
1835
|
if (!context) {
|
|
1852
1836
|
throw new Error("Could not get 2D context from canvas");
|
|
@@ -1987,14 +1971,7 @@ class MediaPlayer {
|
|
|
1987
1971
|
getStartTime: () => this.getStartTime(),
|
|
1988
1972
|
initialMuted,
|
|
1989
1973
|
drawDebugOverlay: this.drawDebugOverlay,
|
|
1990
|
-
|
|
1991
|
-
getSequenceDurationInSeconds: () => this.getSequenceDurationInSeconds(),
|
|
1992
|
-
initialTrimBefore: this.trimBefore,
|
|
1993
|
-
initialTrimAfter: this.trimAfter,
|
|
1994
|
-
initialSequenceOffset: this.sequenceOffset,
|
|
1995
|
-
initialSequenceDurationInFrames: this.sequenceDurationInFrames,
|
|
1996
|
-
initialLoop: this.loop,
|
|
1997
|
-
initialFps: this.fps
|
|
1974
|
+
getSequenceDurationInSeconds: () => this.getSequenceDurationInSeconds()
|
|
1998
1975
|
});
|
|
1999
1976
|
}
|
|
2000
1977
|
const nonce = this.nonceManager.createAsyncOperation();
|
|
@@ -2844,6 +2821,20 @@ import { Internals as Internals15 } from "remotion";
|
|
|
2844
2821
|
// src/audio-extraction/audio-manager.ts
|
|
2845
2822
|
import { Internals as Internals10 } from "remotion";
|
|
2846
2823
|
|
|
2824
|
+
// src/serialized-queue.ts
|
|
2825
|
+
var makeSerializedQueue = () => {
|
|
2826
|
+
let tail = Promise.resolve(undefined);
|
|
2827
|
+
return (fn) => {
|
|
2828
|
+
const result = tail.then(() => fn());
|
|
2829
|
+
tail = result.then(() => {
|
|
2830
|
+
return;
|
|
2831
|
+
}, () => {
|
|
2832
|
+
return;
|
|
2833
|
+
});
|
|
2834
|
+
return result;
|
|
2835
|
+
};
|
|
2836
|
+
};
|
|
2837
|
+
|
|
2847
2838
|
// src/audio-extraction/audio-iterator.ts
|
|
2848
2839
|
import { Internals as Internals9 } from "remotion";
|
|
2849
2840
|
|
|
@@ -3192,7 +3183,7 @@ var makeAudioManager = ({
|
|
|
3192
3183
|
disposed = true;
|
|
3193
3184
|
clearAll();
|
|
3194
3185
|
};
|
|
3195
|
-
|
|
3186
|
+
const enqueue = makeSerializedQueue();
|
|
3196
3187
|
return {
|
|
3197
3188
|
getIterator: ({
|
|
3198
3189
|
src,
|
|
@@ -3203,7 +3194,7 @@ var makeAudioManager = ({
|
|
|
3203
3194
|
logLevel,
|
|
3204
3195
|
maxCacheSize
|
|
3205
3196
|
}) => {
|
|
3206
|
-
|
|
3197
|
+
return enqueue(() => getIterator({
|
|
3207
3198
|
src,
|
|
3208
3199
|
timeInSeconds,
|
|
3209
3200
|
audioSampleSink,
|
|
@@ -3212,7 +3203,6 @@ var makeAudioManager = ({
|
|
|
3212
3203
|
logLevel,
|
|
3213
3204
|
maxCacheSize
|
|
3214
3205
|
}));
|
|
3215
|
-
return queue;
|
|
3216
3206
|
},
|
|
3217
3207
|
getCacheStats,
|
|
3218
3208
|
getIteratorMostInThePast,
|
|
@@ -3634,7 +3624,7 @@ var makeKeyframeBank = async ({
|
|
|
3634
3624
|
const getLastUsed = () => {
|
|
3635
3625
|
return lastUsed;
|
|
3636
3626
|
};
|
|
3637
|
-
|
|
3627
|
+
const enqueue = makeSerializedQueue();
|
|
3638
3628
|
const firstFrame = await sampleIterator.next();
|
|
3639
3629
|
if (!firstFrame.value) {
|
|
3640
3630
|
throw new Error("No first frame found");
|
|
@@ -3699,18 +3689,16 @@ var makeKeyframeBank = async ({
|
|
|
3699
3689
|
const keyframeBank = {
|
|
3700
3690
|
getFrameFromTimestamp: (timestamp, fps) => {
|
|
3701
3691
|
pendingOperations++;
|
|
3702
|
-
|
|
3692
|
+
return enqueue(() => getFrameFromTimestamp(timestamp, fps)).finally(() => {
|
|
3703
3693
|
pendingOperations--;
|
|
3704
3694
|
});
|
|
3705
|
-
return queue;
|
|
3706
3695
|
},
|
|
3707
3696
|
prepareForDeletion,
|
|
3708
3697
|
hasTimestampInSecond: (timestamp, fps) => {
|
|
3709
3698
|
pendingOperations++;
|
|
3710
|
-
|
|
3699
|
+
return enqueue(() => hasTimestampInSecond(timestamp, fps)).finally(() => {
|
|
3711
3700
|
pendingOperations--;
|
|
3712
3701
|
});
|
|
3713
|
-
return queue;
|
|
3714
3702
|
},
|
|
3715
3703
|
addFrame,
|
|
3716
3704
|
deleteFramesBeforeTimestamp,
|
|
@@ -3958,7 +3946,7 @@ var makeKeyframeManager = ({
|
|
|
3958
3946
|
disposed = true;
|
|
3959
3947
|
clearAll(logLevel);
|
|
3960
3948
|
};
|
|
3961
|
-
|
|
3949
|
+
const enqueue = makeSerializedQueue();
|
|
3962
3950
|
return {
|
|
3963
3951
|
requestKeyframeBank: ({
|
|
3964
3952
|
timestamp,
|
|
@@ -3968,7 +3956,7 @@ var makeKeyframeManager = ({
|
|
|
3968
3956
|
maxCacheSize,
|
|
3969
3957
|
fps
|
|
3970
3958
|
}) => {
|
|
3971
|
-
|
|
3959
|
+
return enqueue(() => requestKeyframeBank({
|
|
3972
3960
|
timestamp,
|
|
3973
3961
|
videoSampleSink,
|
|
3974
3962
|
src,
|
|
@@ -3976,7 +3964,6 @@ var makeKeyframeManager = ({
|
|
|
3976
3964
|
maxCacheSize,
|
|
3977
3965
|
fps
|
|
3978
3966
|
}));
|
|
3979
|
-
return queue;
|
|
3980
3967
|
},
|
|
3981
3968
|
getCacheStats,
|
|
3982
3969
|
clearAll,
|
|
@@ -4012,8 +3999,8 @@ var makeMediaCache = () => {
|
|
|
4012
3999
|
});
|
|
4013
4000
|
managerInstances.keyframe = keyframeManagerInstance;
|
|
4014
4001
|
managerInstances.audio = audioManagerInstance;
|
|
4015
|
-
|
|
4016
|
-
|
|
4002
|
+
const queueFrameExtraction = makeSerializedQueue();
|
|
4003
|
+
const queueAudioExtraction = makeSerializedQueue();
|
|
4017
4004
|
let disposed = false;
|
|
4018
4005
|
return {
|
|
4019
4006
|
sinkManager,
|
|
@@ -4021,20 +4008,8 @@ var makeMediaCache = () => {
|
|
|
4021
4008
|
audioManager: audioManagerInstance,
|
|
4022
4009
|
getTotalCacheStats: getCacheStats,
|
|
4023
4010
|
isDisposed: () => disposed,
|
|
4024
|
-
queueFrameExtraction
|
|
4025
|
-
|
|
4026
|
-
frameExtractionQueue = extraction.catch(() => {
|
|
4027
|
-
return;
|
|
4028
|
-
});
|
|
4029
|
-
return extraction;
|
|
4030
|
-
},
|
|
4031
|
-
queueAudioExtraction: (extract) => {
|
|
4032
|
-
const extraction = audioExtractionQueue.then(extract);
|
|
4033
|
-
audioExtractionQueue = extraction.catch(() => {
|
|
4034
|
-
return;
|
|
4035
|
-
});
|
|
4036
|
-
return extraction;
|
|
4037
|
-
},
|
|
4011
|
+
queueFrameExtraction,
|
|
4012
|
+
queueAudioExtraction,
|
|
4038
4013
|
dispose: (logLevel) => {
|
|
4039
4014
|
if (disposed) {
|
|
4040
4015
|
return;
|
|
@@ -5566,8 +5541,7 @@ var VideoForPreviewAssertedShowing = ({
|
|
|
5566
5541
|
canvas.width = cached.width;
|
|
5567
5542
|
canvas.height = cached.height;
|
|
5568
5543
|
const ctx = canvas.getContext("2d", {
|
|
5569
|
-
alpha: true
|
|
5570
|
-
desynchronized: true
|
|
5544
|
+
alpha: true
|
|
5571
5545
|
});
|
|
5572
5546
|
if (!ctx) {
|
|
5573
5547
|
return;
|
|
@@ -106,8 +106,8 @@ export declare const extractFrameAndAudio: ({ src, timeInSeconds, logLevel, dura
|
|
|
106
106
|
totalSize: number;
|
|
107
107
|
};
|
|
108
108
|
isDisposed: () => boolean;
|
|
109
|
-
queueFrameExtraction: <T>(
|
|
110
|
-
queueAudioExtraction: <T>(
|
|
109
|
+
queueFrameExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
|
|
110
|
+
queueAudioExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
|
|
111
111
|
dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
|
|
112
112
|
};
|
|
113
113
|
}) => Promise<ExtractFrameViaBroadcastChannelResult>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const makeSerializedQueue: () => <T>(fn: () => T | Promise<T>) => Promise<T>;
|
|
@@ -126,8 +126,8 @@ export declare const extractFrameViaBroadcastChannel: ({ src, timeInSeconds, log
|
|
|
126
126
|
totalSize: number;
|
|
127
127
|
};
|
|
128
128
|
isDisposed: () => boolean;
|
|
129
|
-
queueFrameExtraction: <T>(
|
|
130
|
-
queueAudioExtraction: <T>(
|
|
129
|
+
queueFrameExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
|
|
130
|
+
queueAudioExtraction: <T>(fn: () => T | Promise<T>) => Promise<T>;
|
|
131
131
|
dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
|
|
132
132
|
};
|
|
133
133
|
}) => Promise<ExtractFrameViaBroadcastChannelResult>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remotion/media",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.510",
|
|
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.50.8",
|
|
26
|
-
"remotion": "4.0.
|
|
26
|
+
"remotion": "4.0.510",
|
|
27
27
|
"zod": "4.4.3"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"react-dom": ">=16.8.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@remotion/eslint-config-internal": "4.0.
|
|
35
|
-
"@remotion/player": "4.0.
|
|
34
|
+
"@remotion/eslint-config-internal": "4.0.510",
|
|
35
|
+
"@remotion/player": "4.0.510",
|
|
36
36
|
"@vitest/browser-webdriverio": "4.0.9",
|
|
37
37
|
"eslint": "9.19.0",
|
|
38
38
|
"react": "19.2.3",
|