@remotion/media 4.0.506 → 4.0.508

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.
@@ -1,6 +1,6 @@
1
1
  import type { MediaRequestInit } from './request-init';
2
2
  import type { ExtractFrameViaBroadcastChannelResult } from './video-extraction/extract-frame-via-broadcast-channel';
3
- export declare const extractFrameAndAudio: ({ src, timeInSeconds, logLevel, durationInSeconds, playbackRate, includeAudio, includeVideo, loop, audioStreamIndex, trimAfter, trimBefore, fps, maxCacheSize, credentials, requestInit, }: {
3
+ export declare const extractFrameAndAudio: ({ src, timeInSeconds, logLevel, durationInSeconds, playbackRate, includeAudio, includeVideo, loop, audioStreamIndex, trimAfter, trimBefore, fps, maxCacheSize, credentials, requestInit, mediaCache, }: {
4
4
  src: string;
5
5
  timeInSeconds: number;
6
6
  logLevel: "error" | "info" | "trace" | "verbose" | "warn";
@@ -16,4 +16,98 @@ export declare const extractFrameAndAudio: ({ src, timeInSeconds, logLevel, dura
16
16
  maxCacheSize: number;
17
17
  credentials: RequestCredentials | undefined;
18
18
  requestInit?: MediaRequestInit | undefined;
19
+ mediaCache: {
20
+ sinkManager: {
21
+ getSink: (src: string, logLevel: "error" | "info" | "trace" | "verbose" | "warn", credentials: RequestCredentials | undefined, requestInit: MediaRequestInit | undefined) => Promise<{
22
+ getVideo: () => Promise<import("./video-extraction/get-frames-since-keyframe").VideoSinkResult>;
23
+ getAudio: (index: number | null) => Promise<import("./video-extraction/get-frames-since-keyframe").AudioSinkResult>;
24
+ actualMatroskaTimestamps: {
25
+ observeTimestamp: (startTime: number) => void;
26
+ getRealTimestamp: (observedTimestamp: number) => number | null;
27
+ };
28
+ isMatroska: boolean;
29
+ getDuration: () => Promise<number>;
30
+ }>;
31
+ dispose: () => void;
32
+ };
33
+ keyframeManager: {
34
+ requestKeyframeBank: ({ timestamp, videoSampleSink, src, logLevel, maxCacheSize, fps, }: {
35
+ timestamp: number;
36
+ videoSampleSink: import("mediabunny").VideoSampleSink;
37
+ src: string;
38
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
39
+ maxCacheSize: number;
40
+ fps: number;
41
+ }) => Promise<import("./video-extraction/keyframe-bank").KeyframeBank | null>;
42
+ getCacheStats: () => {
43
+ count: number;
44
+ totalSize: number;
45
+ };
46
+ clearAll: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
47
+ dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
48
+ };
49
+ audioManager: {
50
+ getIterator: ({ src, timeInSeconds, audioSampleSink, isMatroska, actualMatroskaTimestamps, logLevel, maxCacheSize, }: {
51
+ src: string;
52
+ timeInSeconds: number;
53
+ audioSampleSink: import("mediabunny").AudioSampleSink;
54
+ isMatroska: boolean;
55
+ actualMatroskaTimestamps: {
56
+ observeTimestamp: (startTime: number) => void;
57
+ getRealTimestamp: (observedTimestamp: number) => number | null;
58
+ };
59
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
60
+ maxCacheSize: number;
61
+ }) => Promise<{
62
+ src: string;
63
+ getSamples: (ts: number, dur: number) => Promise<import("mediabunny").AudioSample[]>;
64
+ waitForCompletion: () => Promise<boolean>;
65
+ canSatisfyRequestedTime: (timestamp: number) => boolean;
66
+ logOpenFrames: () => void;
67
+ getCacheStats: () => {
68
+ count: number;
69
+ size: number;
70
+ };
71
+ getLastUsed: () => number;
72
+ prepareForDeletion: () => void;
73
+ startTimestamp: number;
74
+ clearBeforeThreshold: (threshold: number) => void;
75
+ getOldestTimestamp: () => number;
76
+ getNewestTimestamp: () => number | null;
77
+ }>;
78
+ getCacheStats: () => {
79
+ count: number;
80
+ totalSize: number;
81
+ };
82
+ getIteratorMostInThePast: () => {
83
+ src: string;
84
+ getSamples: (ts: number, dur: number) => Promise<import("mediabunny").AudioSample[]>;
85
+ waitForCompletion: () => Promise<boolean>;
86
+ canSatisfyRequestedTime: (timestamp: number) => boolean;
87
+ logOpenFrames: () => void;
88
+ getCacheStats: () => {
89
+ count: number;
90
+ size: number;
91
+ };
92
+ getLastUsed: () => number;
93
+ prepareForDeletion: () => void;
94
+ startTimestamp: number;
95
+ clearBeforeThreshold: (threshold: number) => void;
96
+ getOldestTimestamp: () => number;
97
+ getNewestTimestamp: () => number | null;
98
+ } | null;
99
+ logOpenFrames: () => void;
100
+ deleteDuplicateIterators: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
101
+ clearAll: () => void;
102
+ dispose: () => void;
103
+ };
104
+ getTotalCacheStats: () => {
105
+ count: number;
106
+ totalSize: number;
107
+ };
108
+ isDisposed: () => boolean;
109
+ queueFrameExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
110
+ queueAudioExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
111
+ dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
112
+ };
19
113
  }) => Promise<ExtractFrameViaBroadcastChannelResult>;
@@ -1,9 +1,10 @@
1
1
  import { Input } from 'mediabunny';
2
2
  import { type MediaRequestInit } from './request-init';
3
- export declare const acquireSharedInput: ({ src, credentials, requestInit, }: {
3
+ export declare const acquireSharedInput: ({ src, credentials, requestInit, logLevel, }: {
4
4
  src: string;
5
5
  credentials: RequestCredentials | undefined;
6
6
  requestInit: MediaRequestInit | undefined;
7
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
7
8
  }) => {
8
9
  input: Input<import("mediabunny").Source>;
9
10
  cacheKey: string;
@@ -1,18 +1,20 @@
1
1
  import { type MediaRequestInit } from './request-init';
2
- import type { GetSink } from './video-extraction/get-frames-since-keyframe';
3
- export declare const sinkPromises: Record<string, Promise<GetSink>>;
4
2
  export declare const getSinkCacheKey: ({ src, credentials, requestInit, }: {
5
3
  src: string;
6
4
  credentials: RequestCredentials | undefined;
7
5
  requestInit: MediaRequestInit | undefined;
8
6
  }) => string;
9
- export declare const getSink: (src: string, logLevel: "error" | "info" | "trace" | "verbose" | "warn", credentials: RequestCredentials | undefined, requestInit: MediaRequestInit | undefined) => Promise<{
10
- getVideo: () => Promise<import("./video-extraction/get-frames-since-keyframe").VideoSinkResult>;
11
- getAudio: (index: number | null) => Promise<import("./video-extraction/get-frames-since-keyframe").AudioSinkResult>;
12
- actualMatroskaTimestamps: {
13
- observeTimestamp: (startTime: number) => void;
14
- getRealTimestamp: (observedTimestamp: number) => number | null;
15
- };
16
- isMatroska: boolean;
17
- getDuration: () => Promise<number>;
18
- }>;
7
+ export declare const makeSinkManager: () => {
8
+ getSink: (src: string, logLevel: "error" | "info" | "trace" | "verbose" | "warn", credentials: RequestCredentials | undefined, requestInit: MediaRequestInit | undefined) => Promise<{
9
+ getVideo: () => Promise<import("./video-extraction/get-frames-since-keyframe").VideoSinkResult>;
10
+ getAudio: (index: number | null) => Promise<import("./video-extraction/get-frames-since-keyframe").AudioSinkResult>;
11
+ actualMatroskaTimestamps: {
12
+ observeTimestamp: (startTime: number) => void;
13
+ getRealTimestamp: (observedTimestamp: number) => number | null;
14
+ };
15
+ isMatroska: boolean;
16
+ getDuration: () => Promise<number>;
17
+ }>;
18
+ dispose: () => void;
19
+ };
20
+ export type SinkManager = ReturnType<typeof makeSinkManager>;
@@ -0,0 +1,3 @@
1
+ export declare const getMaxVideoCacheSize: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => number;
2
+ export declare const getMaxSourceCacheSizeFromBudget: (budget: number) => number;
3
+ export declare const getMaxSourceCacheSize: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => number;
@@ -19,7 +19,7 @@ export type ExtractFrameViaBroadcastChannelResult = {
19
19
  } | {
20
20
  type: 'unknown-container-format';
21
21
  };
22
- export declare const extractFrameViaBroadcastChannel: ({ src, timeInSeconds, logLevel, durationInSeconds, playbackRate, includeAudio, includeVideo, isClientSideRendering, loop, audioStreamIndex, trimAfter, trimBefore, fps, maxCacheSize, credentials, requestInit, }: {
22
+ export declare const extractFrameViaBroadcastChannel: ({ src, timeInSeconds, logLevel, durationInSeconds, playbackRate, includeAudio, includeVideo, isClientSideRendering, loop, audioStreamIndex, trimAfter, trimBefore, fps, maxCacheSize, credentials, requestInit, mediaCache, }: {
23
23
  src: string;
24
24
  timeInSeconds: number;
25
25
  durationInSeconds: number;
@@ -36,4 +36,98 @@ export declare const extractFrameViaBroadcastChannel: ({ src, timeInSeconds, log
36
36
  maxCacheSize: number;
37
37
  credentials: RequestCredentials | undefined;
38
38
  requestInit?: MediaRequestInit | undefined;
39
+ mediaCache: {
40
+ sinkManager: {
41
+ getSink: (src: string, logLevel: "error" | "info" | "trace" | "verbose" | "warn", credentials: RequestCredentials | undefined, requestInit: MediaRequestInit | undefined) => Promise<{
42
+ getVideo: () => Promise<import("./get-frames-since-keyframe").VideoSinkResult>;
43
+ getAudio: (index: number | null) => Promise<import("./get-frames-since-keyframe").AudioSinkResult>;
44
+ actualMatroskaTimestamps: {
45
+ observeTimestamp: (startTime: number) => void;
46
+ getRealTimestamp: (observedTimestamp: number) => number | null;
47
+ };
48
+ isMatroska: boolean;
49
+ getDuration: () => Promise<number>;
50
+ }>;
51
+ dispose: () => void;
52
+ };
53
+ keyframeManager: {
54
+ requestKeyframeBank: ({ timestamp, videoSampleSink, src, logLevel, maxCacheSize, fps, }: {
55
+ timestamp: number;
56
+ videoSampleSink: import("mediabunny").VideoSampleSink;
57
+ src: string;
58
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
59
+ maxCacheSize: number;
60
+ fps: number;
61
+ }) => Promise<import("./keyframe-bank").KeyframeBank | null>;
62
+ getCacheStats: () => {
63
+ count: number;
64
+ totalSize: number;
65
+ };
66
+ clearAll: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
67
+ dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
68
+ };
69
+ audioManager: {
70
+ getIterator: ({ src, timeInSeconds, audioSampleSink, isMatroska, actualMatroskaTimestamps, logLevel, maxCacheSize, }: {
71
+ src: string;
72
+ timeInSeconds: number;
73
+ audioSampleSink: import("mediabunny").AudioSampleSink;
74
+ isMatroska: boolean;
75
+ actualMatroskaTimestamps: {
76
+ observeTimestamp: (startTime: number) => void;
77
+ getRealTimestamp: (observedTimestamp: number) => number | null;
78
+ };
79
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
80
+ maxCacheSize: number;
81
+ }) => Promise<{
82
+ src: string;
83
+ getSamples: (ts: number, dur: number) => Promise<import("mediabunny").AudioSample[]>;
84
+ waitForCompletion: () => Promise<boolean>;
85
+ canSatisfyRequestedTime: (timestamp: number) => boolean;
86
+ logOpenFrames: () => void;
87
+ getCacheStats: () => {
88
+ count: number;
89
+ size: number;
90
+ };
91
+ getLastUsed: () => number;
92
+ prepareForDeletion: () => void;
93
+ startTimestamp: number;
94
+ clearBeforeThreshold: (threshold: number) => void;
95
+ getOldestTimestamp: () => number;
96
+ getNewestTimestamp: () => number | null;
97
+ }>;
98
+ getCacheStats: () => {
99
+ count: number;
100
+ totalSize: number;
101
+ };
102
+ getIteratorMostInThePast: () => {
103
+ src: string;
104
+ getSamples: (ts: number, dur: number) => Promise<import("mediabunny").AudioSample[]>;
105
+ waitForCompletion: () => Promise<boolean>;
106
+ canSatisfyRequestedTime: (timestamp: number) => boolean;
107
+ logOpenFrames: () => void;
108
+ getCacheStats: () => {
109
+ count: number;
110
+ size: number;
111
+ };
112
+ getLastUsed: () => number;
113
+ prepareForDeletion: () => void;
114
+ startTimestamp: number;
115
+ clearBeforeThreshold: (threshold: number) => void;
116
+ getOldestTimestamp: () => number;
117
+ getNewestTimestamp: () => number | null;
118
+ } | null;
119
+ logOpenFrames: () => void;
120
+ deleteDuplicateIterators: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
121
+ clearAll: () => void;
122
+ dispose: () => void;
123
+ };
124
+ getTotalCacheStats: () => {
125
+ count: number;
126
+ totalSize: number;
127
+ };
128
+ isDisposed: () => boolean;
129
+ queueFrameExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
130
+ queueAudioExtraction: <T>(extract: () => Promise<T>) => Promise<T>;
131
+ dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
132
+ };
39
133
  }) => Promise<ExtractFrameViaBroadcastChannelResult>;
@@ -1,4 +1,5 @@
1
1
  import { type LogLevel } from 'remotion';
2
+ import type { MediaCache } from '../caches';
2
3
  import type { MediaRequestInit } from '../request-init';
3
4
  type ExtractFrameResult = {
4
5
  type: 'success';
@@ -31,6 +32,7 @@ type ExtractFrameParams = {
31
32
  maxCacheSize: number;
32
33
  credentials: RequestCredentials | undefined;
33
34
  requestInit?: MediaRequestInit;
35
+ mediaCache: MediaCache;
34
36
  };
35
37
  export declare const extractFrame: (params: ExtractFrameParams) => Promise<ExtractFrameResult>;
36
38
  export {};
@@ -8,15 +8,18 @@ type AudioSinks = {
8
8
  };
9
9
  export type AudioSinkResult = AudioSinks | 'no-audio-track' | 'cannot-decode-audio' | 'unknown-container-format' | 'network-error';
10
10
  export type VideoSinkResult = VideoSinks | 'no-video-track' | 'cannot-decode' | 'cannot-decode-prores' | 'cannot-decode-alpha' | 'unknown-container-format' | 'network-error';
11
- export declare const getSinks: (src: string, logLevel: "error" | "info" | "trace" | "verbose" | "warn", credentials: RequestCredentials | undefined, requestInit?: MediaRequestInit | undefined) => Promise<{
12
- getVideo: () => Promise<VideoSinkResult>;
13
- getAudio: (index: number | null) => Promise<AudioSinkResult>;
14
- actualMatroskaTimestamps: {
15
- observeTimestamp: (startTime: number) => void;
16
- getRealTimestamp: (observedTimestamp: number) => number | null;
17
- };
18
- isMatroska: boolean;
19
- getDuration: () => Promise<number>;
20
- }>;
21
- export type GetSink = Awaited<ReturnType<typeof getSinks>>;
11
+ export declare const makeSinks: (src: string, logLevel: "error" | "info" | "trace" | "verbose" | "warn", credentials: RequestCredentials | undefined, requestInit?: MediaRequestInit | undefined) => {
12
+ promise: Promise<{
13
+ getVideo: () => Promise<VideoSinkResult>;
14
+ getAudio: (index: number | null) => Promise<AudioSinkResult>;
15
+ actualMatroskaTimestamps: {
16
+ observeTimestamp: (startTime: number) => void;
17
+ getRealTimestamp: (observedTimestamp: number) => number | null;
18
+ };
19
+ isMatroska: boolean;
20
+ getDuration: () => Promise<number>;
21
+ }>;
22
+ dispose: () => void;
23
+ };
24
+ export type GetSink = Awaited<ReturnType<typeof makeSinks>['promise']>;
22
25
  export {};
@@ -18,6 +18,7 @@ export type KeyframeBank = {
18
18
  timestamps: number[];
19
19
  };
20
20
  getLastUsed: () => number;
21
+ isBusy: () => boolean;
21
22
  canSatisfyTimestamp: (timestamp: number) => boolean;
22
23
  getRangeOfTimestamps: () => {
23
24
  firstTimestamp: number;
@@ -1,6 +1,11 @@
1
1
  import type { VideoSampleSink } from 'mediabunny';
2
2
  import { type KeyframeBank } from './keyframe-bank';
3
- export declare const makeKeyframeManager: () => {
3
+ export declare const makeKeyframeManager: ({ getTotalCacheStats, }: {
4
+ getTotalCacheStats: () => {
5
+ count: number;
6
+ totalSize: number;
7
+ };
8
+ }) => {
4
9
  requestKeyframeBank: ({ timestamp, videoSampleSink, src, logLevel, maxCacheSize, fps, }: {
5
10
  timestamp: number;
6
11
  videoSampleSink: VideoSampleSink;
@@ -8,11 +13,12 @@ export declare const makeKeyframeManager: () => {
8
13
  logLevel: "error" | "info" | "trace" | "verbose" | "warn";
9
14
  maxCacheSize: number;
10
15
  fps: number;
11
- }) => Promise<KeyframeBank>;
16
+ }) => Promise<KeyframeBank | null>;
12
17
  getCacheStats: () => {
13
18
  count: number;
14
19
  totalSize: number;
15
20
  };
16
21
  clearAll: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
22
+ dispose: (logLevel: "error" | "info" | "trace" | "verbose" | "warn") => void;
17
23
  };
18
24
  export type KeyframeManager = Awaited<ReturnType<typeof makeKeyframeManager>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/media",
3
- "version": "4.0.506",
3
+ "version": "4.0.508",
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.506",
26
+ "remotion": "4.0.508",
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.506",
35
- "@remotion/player": "4.0.506",
34
+ "@remotion/eslint-config-internal": "4.0.508",
35
+ "@remotion/player": "4.0.508",
36
36
  "@vitest/browser-webdriverio": "4.0.9",
37
37
  "eslint": "9.19.0",
38
38
  "react": "19.2.3",