@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.
@@ -25,7 +25,6 @@ type InnerAudioProps = {
25
25
  readonly toneFrequency?: number;
26
26
  readonly audioStreamIndex?: number;
27
27
  readonly fallbackHtml5AudioProps?: FallbackHtml5AudioProps;
28
- readonly debugAudioScheduling?: boolean;
29
28
  readonly onError?: MediaOnError;
30
29
  readonly credentials?: RequestCredentials;
31
30
  };
@@ -1,6 +1,6 @@
1
- import type { WrappedAudioBuffer } from 'mediabunny';
2
- import type { SharedAudioContextForMediaPlayer } from '../shared-audio-context-for-media-player';
1
+ import type { AudioBufferSink } from 'mediabunny';
3
2
  export declare const HEALTHY_BUFFER_THRESHOLD_SECONDS = 1;
3
+ export declare const ALLOWED_GLOBAL_TIME_ANCHOR_SHIFT = 0.1;
4
4
  export type QueuedNode = {
5
5
  node: AudioBufferSourceNode;
6
6
  timestamp: number;
@@ -13,57 +13,31 @@ export type QueuedPeriod = {
13
13
  from: number;
14
14
  until: number;
15
15
  };
16
- export declare const makeAudioIterator: ({ startFromSecond, maximumTimestamp, cache, debugAudioScheduling, }: {
16
+ export declare const makeAudioIterator: ({ startFromSecond, maximumTimestamp, audioSink, loop, playbackRate, sequenceDurationInSeconds, unscheduleAudioNode, }: {
17
17
  startFromSecond: number;
18
18
  maximumTimestamp: number;
19
- cache: {
20
- prewarmIteratorForLooping: ({ timeToSeek, maximumTimestamp, }: {
21
- timeToSeek: number;
22
- maximumTimestamp: number;
23
- }) => void;
24
- makeIteratorOrUsePrewarmed: (timeToSeek: number, maximumTimestamp: number) => AsyncGenerator<WrappedAudioBuffer, void, unknown>;
25
- destroy: () => void;
26
- };
27
- debugAudioScheduling: boolean;
19
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
20
+ audioSink: AudioBufferSink;
21
+ loop: boolean;
22
+ playbackRate: number;
23
+ sequenceDurationInSeconds: number;
24
+ unscheduleAudioNode: (node: AudioBufferSourceNode) => void;
28
25
  }) => {
29
- destroy: (audioContext: SharedAudioContextForMediaPlayer) => void;
30
- getNext: () => Promise<IteratorResult<WrappedAudioBuffer, void>>;
26
+ destroy: () => void;
27
+ getNextFn: () => Promise<IteratorResult<import("../make-iterator-with-priming").BufferWithMediaTimestamp, void>>;
31
28
  isDestroyed: () => boolean;
32
- addQueuedAudioNode: ({ node, timestamp, buffer, scheduledTime, playbackRate, scheduledAtAnchor, }: {
29
+ addQueuedAudioNode: ({ node, timestamp, buffer, scheduledTime, scheduledAtAnchor, }: {
33
30
  node: AudioBufferSourceNode;
34
31
  timestamp: number;
35
32
  buffer: AudioBuffer;
36
33
  scheduledTime: number;
37
- playbackRate: number;
38
34
  scheduledAtAnchor: number;
39
35
  }) => void;
40
- removeQueuedAudioNode: (node: AudioBufferSourceNode) => void;
41
- getAndClearAudioChunksForAfterResuming: () => {
42
- buffer: AudioBuffer;
43
- timestamp: number;
44
- }[];
36
+ guessNextTimestamp: () => number;
45
37
  getQueuedPeriod: () => {
46
38
  from: number;
47
39
  until: number;
48
40
  } | null;
49
- tryToSatisfySeek: (time: number, onBufferScheduled: (buffer: WrappedAudioBuffer) => void) => Promise<{
50
- type: "not-satisfied";
51
- reason: string;
52
- } | {
53
- type: "ended";
54
- } | {
55
- type: "satisfied";
56
- }>;
57
- bufferAsFarAsPossible: (onBufferScheduled: (buffer: WrappedAudioBuffer) => void, maxTimestamp: number) => Promise<{
58
- type: "ended";
59
- } | {
60
- type: "waiting";
61
- } | {
62
- type: "max-reached";
63
- }>;
64
- addChunkForAfterResuming: (buffer: AudioBuffer, timestamp: number) => void;
65
- moveQueuedChunksToPauseQueue: () => void;
66
- getNumberOfChunksAfterResuming: () => number;
67
41
  };
68
42
  export type AudioIterator = ReturnType<typeof makeAudioIterator>;
69
43
  export declare const isAlreadyQueued: (time: number, queuedPeriod: {
@@ -4,11 +4,11 @@ export declare const getScheduledTime: ({ mediaTimestamp, targetTime, currentTim
4
4
  currentTime: number;
5
5
  sequenceStartTime: number;
6
6
  }) => number;
7
- export declare const getDurationOfNode: ({ mediaTimestamp, bufferDuration, sequenceEndTime, offset, }: {
8
- mediaTimestamp: number;
7
+ export declare const getDurationOfNode: ({ bufferDuration, loopSegmentMediaEndTimestamp, offset, originalUnloopedMediaTimestamp, }: {
9
8
  bufferDuration: number;
10
- sequenceEndTime: number;
9
+ loopSegmentMediaEndTimestamp: number;
11
10
  offset: number;
11
+ originalUnloopedMediaTimestamp: number;
12
12
  }) => number;
13
13
  export declare const getOffset: ({ mediaTimestamp, targetTime, sequenceStartTime, }: {
14
14
  mediaTimestamp: number;
@@ -39,7 +39,6 @@ export type AudioProps = {
39
39
  toneFrequency?: number;
40
40
  delayRenderRetries?: number;
41
41
  delayRenderTimeoutInMilliseconds?: number;
42
- debugAudioScheduling?: boolean;
43
42
  onError?: MediaOnError;
44
43
  credentials?: RequestCredentials;
45
44
  };
@@ -1,6 +1,7 @@
1
1
  export declare class StaleWaiterError extends Error {
2
2
  constructor();
3
3
  }
4
+ export declare const processNext: () => void;
4
5
  export declare const waitForTurn: <T>({ getPriority, fn, onDone, onError, }: {
5
6
  getPriority: () => number | null;
6
7
  fn: () => Promise<T>;
@@ -1,92 +1,86 @@
1
- import type { InputAudioTrack, WrappedAudioBuffer } from 'mediabunny';
1
+ import { type InputAudioTrack } from 'mediabunny';
2
2
  import { type ScheduleAudioNodeResult } from 'remotion';
3
3
  import type { DelayPlaybackIfNotPremounting } from './delay-playback-if-not-premounting';
4
+ import type { BufferWithMediaTimestamp } from './make-iterator-with-priming';
4
5
  import type { Nonce } from './nonce-manager';
5
6
  import type { SharedAudioContextForMediaPlayer } from './shared-audio-context-for-media-player';
6
- type ScheduleAudioNode = (node: AudioBufferSourceNode, mediaTimestamp: number) => ScheduleAudioNodeResult;
7
- export declare const audioIteratorManager: ({ audioTrack, delayPlaybackHandleIfNotPremounting, sharedAudioContext, getIsLooping, getEndTime, getStartTime, initialMuted, drawDebugOverlay, }: {
7
+ type ScheduleAudioNode = (node: AudioBufferSourceNode, mediaTimestamp: number, originalUnloopedMediaTimestamp: number, currentTime: number) => ScheduleAudioNodeResult;
8
+ export declare const audioIteratorManager: ({ audioTrack, delayPlaybackHandleIfNotPremounting, sharedAudioContext, getSequenceEndTimestamp, getSequenceDurationInSeconds, getMediaEndTimestamp, getStartTime, initialMuted, drawDebugOverlay, initialPlaybackRate, initialTrimBefore, initialTrimAfter, initialSequenceOffset, initialSequenceDurationInFrames, initialLoop, initialFps, }: {
8
9
  audioTrack: InputAudioTrack;
9
10
  delayPlaybackHandleIfNotPremounting: () => DelayPlaybackIfNotPremounting;
10
11
  sharedAudioContext: SharedAudioContextForMediaPlayer;
11
- getIsLooping: () => boolean;
12
- getEndTime: () => number;
12
+ getSequenceEndTimestamp: () => number;
13
+ getSequenceDurationInSeconds: () => number;
14
+ getMediaEndTimestamp: () => number;
13
15
  getStartTime: () => number;
14
16
  initialMuted: boolean;
15
17
  drawDebugOverlay: () => void;
18
+ initialPlaybackRate: number;
19
+ initialTrimBefore: number | undefined;
20
+ initialTrimAfter: number | undefined;
21
+ initialSequenceOffset: number;
22
+ initialSequenceDurationInFrames: number;
23
+ initialLoop: boolean;
24
+ initialFps: number;
16
25
  }) => {
17
- startAudioIterator: ({ nonce, playbackRate, startFromSecond, getIsPlaying, scheduleAudioNode, debugAudioScheduling, }: {
26
+ startAudioIterator: ({ nonce, playbackRate, startFromSecond, scheduleAudioNode, getTargetTime, logLevel, loop, unscheduleAudioNode, getAudioContextCurrentTimeMockedInTest, }: {
18
27
  startFromSecond: number;
19
28
  nonce: Nonce;
20
29
  playbackRate: number;
21
- getIsPlaying: () => boolean;
22
30
  scheduleAudioNode: ScheduleAudioNode;
23
- debugAudioScheduling: boolean;
24
- }) => Promise<void>;
25
- resumeScheduledAudioChunks: ({ playbackRate, scheduleAudioNode, debugAudioScheduling, }: {
26
- playbackRate: number;
27
- scheduleAudioNode: ScheduleAudioNode;
28
- debugAudioScheduling: boolean;
31
+ getTargetTime: (mediaTimestamp: number, currentTime: number) => number | null;
32
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
33
+ loop: boolean;
34
+ unscheduleAudioNode: (node: AudioBufferSourceNode) => void;
35
+ getAudioContextCurrentTimeMockedInTest: () => number;
29
36
  }) => void;
30
- pausePlayback: () => void;
31
37
  getAudioBufferIterator: () => {
32
- destroy: (audioContext: SharedAudioContextForMediaPlayer) => void;
33
- getNext: () => Promise<IteratorResult<WrappedAudioBuffer, void>>;
38
+ destroy: () => void;
39
+ getNextFn: () => Promise<IteratorResult<BufferWithMediaTimestamp, void>>;
34
40
  isDestroyed: () => boolean;
35
- addQueuedAudioNode: ({ node, timestamp, buffer, scheduledTime, playbackRate, scheduledAtAnchor, }: {
41
+ addQueuedAudioNode: ({ node, timestamp, buffer, scheduledTime, scheduledAtAnchor, }: {
36
42
  node: AudioBufferSourceNode;
37
43
  timestamp: number;
38
44
  buffer: AudioBuffer;
39
45
  scheduledTime: number;
40
- playbackRate: number;
41
46
  scheduledAtAnchor: number;
42
47
  }) => void;
43
- removeQueuedAudioNode: (node: AudioBufferSourceNode) => void;
44
- getAndClearAudioChunksForAfterResuming: () => {
45
- buffer: AudioBuffer;
46
- timestamp: number;
47
- }[];
48
+ guessNextTimestamp: () => number;
48
49
  getQueuedPeriod: () => {
49
50
  from: number;
50
51
  until: number;
51
52
  } | null;
52
- tryToSatisfySeek: (time: number, onBufferScheduled: (buffer: WrappedAudioBuffer) => void) => Promise<{
53
- type: "not-satisfied";
54
- reason: string;
55
- } | {
56
- type: "ended";
57
- } | {
58
- type: "satisfied";
59
- }>;
60
- bufferAsFarAsPossible: (onBufferScheduled: (buffer: WrappedAudioBuffer) => void, maxTimestamp: number) => Promise<{
61
- type: "ended";
62
- } | {
63
- type: "waiting";
64
- } | {
65
- type: "max-reached";
66
- }>;
67
- addChunkForAfterResuming: (buffer: AudioBuffer, timestamp: number) => void;
68
- moveQueuedChunksToPauseQueue: () => void;
69
- getNumberOfChunksAfterResuming: () => number;
70
53
  } | null;
71
54
  destroyIterator: () => void;
72
- seek: ({ newTime, nonce, playbackRate, getIsPlaying, scheduleAudioNode, debugAudioScheduling, }: {
55
+ seek: ({ newTime, nonce, playbackRate, scheduleAudioNode, getTargetTime, logLevel, loop, trimBefore, trimAfter, sequenceOffset, sequenceDurationInFrames, fps, getAudioContextCurrentTimeMockedInTest, }: {
73
56
  newTime: number;
74
57
  nonce: Nonce;
75
58
  playbackRate: number;
76
- getIsPlaying: () => boolean;
77
59
  scheduleAudioNode: ScheduleAudioNode;
78
- debugAudioScheduling: boolean;
79
- }) => Promise<void>;
60
+ getTargetTime: (mediaTimestamp: number, currentTime: number) => number | null;
61
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
62
+ loop: boolean;
63
+ trimBefore: number | undefined;
64
+ trimAfter: number | undefined;
65
+ sequenceOffset: number;
66
+ sequenceDurationInFrames: number;
67
+ fps: number;
68
+ getAudioContextCurrentTimeMockedInTest: () => number;
69
+ }) => void;
80
70
  getAudioIteratorsCreated: () => number;
71
+ getTotalAudioScheduledInSeconds: () => number;
81
72
  setMuted: (newMuted: boolean) => void;
82
73
  setVolume: (volume: number) => void;
83
- scheduleAudioChunk: ({ buffer, mediaTimestamp, playbackRate, scheduleAudioNode, debugAudioScheduling, }: {
74
+ scheduleAudioChunk: ({ buffer, mediaTimestamp, originalUnloopedMediaTimestamp, playbackRate, scheduleAudioNode, logLevel, currentTime, }: {
84
75
  buffer: AudioBuffer;
85
76
  mediaTimestamp: number;
86
77
  playbackRate: number;
87
78
  scheduleAudioNode: ScheduleAudioNode;
88
- debugAudioScheduling: boolean;
79
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
80
+ originalUnloopedMediaTimestamp: number;
81
+ currentTime: number;
89
82
  }) => void;
83
+ waitForNScheduledNodes: (n: number) => Promise<void>;
90
84
  };
91
85
  export type AudioIteratorManager = ReturnType<typeof audioIteratorManager>;
92
86
  export {};
@@ -0,0 +1,13 @@
1
+ import type { CanvasSink, WrappedCanvas } from 'mediabunny';
2
+ export type CanvasAheadOfTimeNext = {
3
+ type: 'ready';
4
+ frame: WrappedCanvas | null;
5
+ } | {
6
+ type: 'pending';
7
+ wait: () => Promise<WrappedCanvas | null>;
8
+ };
9
+ export declare const canvasesAheadOfTime: (videoSink: CanvasSink, startTimestamp?: number | undefined) => {
10
+ next: () => CanvasAheadOfTimeNext;
11
+ closeIterator: () => Promise<void>;
12
+ };
13
+ export type CanvasAheadOfTimeIterator = ReturnType<typeof canvasesAheadOfTime>;
@@ -7,79 +7,64 @@ export declare const drawPreviewOverlay: ({ context, audioTime, audioContextStat
7
7
  } | null;
8
8
  playing: boolean;
9
9
  audioIteratorManager: {
10
- startAudioIterator: ({ nonce, playbackRate, startFromSecond, getIsPlaying, scheduleAudioNode, debugAudioScheduling, }: {
10
+ startAudioIterator: ({ nonce, playbackRate, startFromSecond, scheduleAudioNode, getTargetTime, logLevel, loop, unscheduleAudioNode, getAudioContextCurrentTimeMockedInTest, }: {
11
11
  startFromSecond: number;
12
12
  nonce: import("../nonce-manager").Nonce;
13
13
  playbackRate: number;
14
- getIsPlaying: () => boolean;
15
- scheduleAudioNode: (node: AudioBufferSourceNode, mediaTimestamp: number) => import("remotion").ScheduleAudioNodeResult;
16
- debugAudioScheduling: boolean;
17
- }) => Promise<void>;
18
- resumeScheduledAudioChunks: ({ playbackRate, scheduleAudioNode, debugAudioScheduling, }: {
19
- playbackRate: number;
20
- scheduleAudioNode: (node: AudioBufferSourceNode, mediaTimestamp: number) => import("remotion").ScheduleAudioNodeResult;
21
- debugAudioScheduling: boolean;
14
+ scheduleAudioNode: (node: AudioBufferSourceNode, mediaTimestamp: number, originalUnloopedMediaTimestamp: number, currentTime: number) => import("remotion").ScheduleAudioNodeResult;
15
+ getTargetTime: (mediaTimestamp: number, currentTime: number) => number | null;
16
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
17
+ loop: boolean;
18
+ unscheduleAudioNode: (node: AudioBufferSourceNode) => void;
19
+ getAudioContextCurrentTimeMockedInTest: () => number;
22
20
  }) => void;
23
- pausePlayback: () => void;
24
21
  getAudioBufferIterator: () => {
25
- destroy: (audioContext: import("../shared-audio-context-for-media-player").SharedAudioContextForMediaPlayer) => void;
26
- getNext: () => Promise<IteratorResult<import("mediabunny").WrappedAudioBuffer, void>>;
22
+ destroy: () => void;
23
+ getNextFn: () => Promise<IteratorResult<import("../make-iterator-with-priming").BufferWithMediaTimestamp, void>>;
27
24
  isDestroyed: () => boolean;
28
- addQueuedAudioNode: ({ node, timestamp, buffer, scheduledTime, playbackRate, scheduledAtAnchor, }: {
25
+ addQueuedAudioNode: ({ node, timestamp, buffer, scheduledTime, scheduledAtAnchor, }: {
29
26
  node: AudioBufferSourceNode;
30
27
  timestamp: number;
31
28
  buffer: AudioBuffer;
32
29
  scheduledTime: number;
33
- playbackRate: number;
34
30
  scheduledAtAnchor: number;
35
31
  }) => void;
36
- removeQueuedAudioNode: (node: AudioBufferSourceNode) => void;
37
- getAndClearAudioChunksForAfterResuming: () => {
38
- buffer: AudioBuffer;
39
- timestamp: number;
40
- }[];
32
+ guessNextTimestamp: () => number;
41
33
  getQueuedPeriod: () => {
42
34
  from: number;
43
35
  until: number;
44
36
  } | null;
45
- tryToSatisfySeek: (time: number, onBufferScheduled: (buffer: import("mediabunny").WrappedAudioBuffer) => void) => Promise<{
46
- type: "not-satisfied";
47
- reason: string;
48
- } | {
49
- type: "ended";
50
- } | {
51
- type: "satisfied";
52
- }>;
53
- bufferAsFarAsPossible: (onBufferScheduled: (buffer: import("mediabunny").WrappedAudioBuffer) => void, maxTimestamp: number) => Promise<{
54
- type: "ended";
55
- } | {
56
- type: "waiting";
57
- } | {
58
- type: "max-reached";
59
- }>;
60
- addChunkForAfterResuming: (buffer: AudioBuffer, timestamp: number) => void;
61
- moveQueuedChunksToPauseQueue: () => void;
62
- getNumberOfChunksAfterResuming: () => number;
63
37
  } | null;
64
38
  destroyIterator: () => void;
65
- seek: ({ newTime, nonce, playbackRate, getIsPlaying, scheduleAudioNode, debugAudioScheduling, }: {
39
+ seek: ({ newTime, nonce, playbackRate, scheduleAudioNode, getTargetTime, logLevel, loop, trimBefore, trimAfter, sequenceOffset, sequenceDurationInFrames, fps, getAudioContextCurrentTimeMockedInTest, }: {
66
40
  newTime: number;
67
41
  nonce: import("../nonce-manager").Nonce;
68
42
  playbackRate: number;
69
- getIsPlaying: () => boolean;
70
- scheduleAudioNode: (node: AudioBufferSourceNode, mediaTimestamp: number) => import("remotion").ScheduleAudioNodeResult;
71
- debugAudioScheduling: boolean;
72
- }) => Promise<void>;
43
+ scheduleAudioNode: (node: AudioBufferSourceNode, mediaTimestamp: number, originalUnloopedMediaTimestamp: number, currentTime: number) => import("remotion").ScheduleAudioNodeResult;
44
+ getTargetTime: (mediaTimestamp: number, currentTime: number) => number | null;
45
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
46
+ loop: boolean;
47
+ trimBefore: number | undefined;
48
+ trimAfter: number | undefined;
49
+ sequenceOffset: number;
50
+ sequenceDurationInFrames: number;
51
+ fps: number;
52
+ getAudioContextCurrentTimeMockedInTest: () => number;
53
+ }) => void;
73
54
  getAudioIteratorsCreated: () => number;
55
+ getTotalAudioScheduledInSeconds: () => number;
74
56
  setMuted: (newMuted: boolean) => void;
75
57
  setVolume: (volume: number) => void;
76
- scheduleAudioChunk: ({ buffer, mediaTimestamp, playbackRate, scheduleAudioNode, debugAudioScheduling, }: {
58
+ scheduleAudioChunk: ({ buffer, mediaTimestamp, originalUnloopedMediaTimestamp, playbackRate, scheduleAudioNode, logLevel, currentTime, }: {
77
59
  buffer: AudioBuffer;
78
60
  mediaTimestamp: number;
79
61
  playbackRate: number;
80
- scheduleAudioNode: (node: AudioBufferSourceNode, mediaTimestamp: number) => import("remotion").ScheduleAudioNodeResult;
81
- debugAudioScheduling: boolean;
62
+ scheduleAudioNode: (node: AudioBufferSourceNode, mediaTimestamp: number, originalUnloopedMediaTimestamp: number, currentTime: number) => import("remotion").ScheduleAudioNodeResult;
63
+ logLevel: "error" | "info" | "trace" | "verbose" | "warn";
64
+ originalUnloopedMediaTimestamp: number;
65
+ currentTime: number;
82
66
  }) => void;
67
+ waitForNScheduledNodes: (n: number) => Promise<void>;
83
68
  } | null;
84
69
  videoIteratorManager: {
85
70
  startVideoIterator: (timeToSeek: number, nonce: import("../nonce-manager").Nonce) => Promise<void>;
@@ -93,13 +78,13 @@ export declare const drawPreviewOverlay: ({ context, audioTime, audioContextStat
93
78
  destroy: () => void;
94
79
  initialFrame: import("mediabunny").WrappedCanvas | null;
95
80
  isDestroyed: () => boolean;
96
- tryToSatisfySeek: (time: number) => Promise<{
81
+ tryToSatisfySeek: (time: number) => {
97
82
  type: "not-satisfied";
98
83
  reason: string;
99
84
  } | {
100
85
  type: "satisfied";
101
86
  frame: import("mediabunny").WrappedCanvas;
102
- }>;
87
+ };
103
88
  } | null;
104
89
  drawFrame: (frame: import("mediabunny").WrappedCanvas) => void;
105
90
  getFramesRendered: () => number;