@remotion/media 4.0.354 → 4.0.356

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.
Files changed (86) hide show
  1. package/dist/audio/audio-for-rendering.js +37 -3
  2. package/dist/audio/audio.js +1 -1
  3. package/dist/audio/props.d.ts +15 -0
  4. package/dist/audio-extraction/audio-iterator.d.ts +3 -2
  5. package/dist/audio-extraction/audio-iterator.js +13 -2
  6. package/dist/audio-extraction/audio-manager.d.ts +6 -5
  7. package/dist/audio-extraction/audio-manager.js +5 -3
  8. package/dist/audio-extraction/extract-audio.d.ts +3 -2
  9. package/dist/audio-extraction/extract-audio.js +12 -9
  10. package/dist/caches.d.ts +6 -5
  11. package/dist/convert-audiodata/apply-tonefrequency.d.ts +2 -0
  12. package/dist/convert-audiodata/apply-tonefrequency.js +44 -0
  13. package/dist/convert-audiodata/wsola.d.ts +13 -0
  14. package/dist/convert-audiodata/wsola.js +197 -0
  15. package/dist/esm/index.mjs +1519 -13269
  16. package/dist/extract-frame-and-audio.d.ts +3 -2
  17. package/dist/extract-frame-and-audio.js +60 -26
  18. package/dist/get-sink-weak.d.ts +13 -0
  19. package/dist/get-sink-weak.js +23 -0
  20. package/dist/index.d.ts +12 -3
  21. package/dist/index.js +11 -2
  22. package/dist/video/media-player.d.ts +8 -0
  23. package/dist/video/media-player.js +77 -19
  24. package/dist/video/props.d.ts +36 -18
  25. package/dist/video/video-for-preview.d.ts +13 -7
  26. package/dist/video/video-for-preview.js +115 -10
  27. package/dist/video/video-for-rendering.d.ts +23 -2
  28. package/dist/video/video-for-rendering.js +47 -4
  29. package/dist/video/video.js +13 -14
  30. package/dist/video-extraction/extract-frame-via-broadcast-channel.d.ts +3 -2
  31. package/dist/video-extraction/extract-frame-via-broadcast-channel.js +53 -4
  32. package/dist/video-extraction/extract-frame.d.ts +2 -3
  33. package/dist/video-extraction/extract-frame.js +11 -8
  34. package/dist/video-extraction/get-frames-since-keyframe.d.ts +14 -9
  35. package/dist/video-extraction/get-frames-since-keyframe.js +72 -19
  36. package/package.json +5 -5
  37. package/dist/audio-for-rendering.d.ts +0 -3
  38. package/dist/audio-for-rendering.js +0 -94
  39. package/dist/audio.d.ts +0 -3
  40. package/dist/audio.js +0 -60
  41. package/dist/audiodata-to-array.d.ts +0 -0
  42. package/dist/audiodata-to-array.js +0 -1
  43. package/dist/convert-audiodata/data-types.d.ts +0 -1
  44. package/dist/convert-audiodata/data-types.js +0 -22
  45. package/dist/convert-audiodata/is-planar-format.d.ts +0 -1
  46. package/dist/convert-audiodata/is-planar-format.js +0 -3
  47. package/dist/convert-audiodata/log-audiodata.d.ts +0 -1
  48. package/dist/convert-audiodata/log-audiodata.js +0 -8
  49. package/dist/convert-audiodata/trim-audiodata.d.ts +0 -0
  50. package/dist/convert-audiodata/trim-audiodata.js +0 -1
  51. package/dist/deserialized-audiodata.d.ts +0 -15
  52. package/dist/deserialized-audiodata.js +0 -26
  53. package/dist/extract-audio.d.ts +0 -7
  54. package/dist/extract-audio.js +0 -98
  55. package/dist/extract-frame-via-broadcast-channel.d.ts +0 -15
  56. package/dist/extract-frame-via-broadcast-channel.js +0 -104
  57. package/dist/extract-frame.d.ts +0 -27
  58. package/dist/extract-frame.js +0 -21
  59. package/dist/extrct-audio.d.ts +0 -7
  60. package/dist/extrct-audio.js +0 -94
  61. package/dist/get-frames-since-keyframe.d.ts +0 -22
  62. package/dist/get-frames-since-keyframe.js +0 -41
  63. package/dist/keyframe-bank.d.ts +0 -25
  64. package/dist/keyframe-bank.js +0 -120
  65. package/dist/keyframe-manager.d.ts +0 -23
  66. package/dist/keyframe-manager.js +0 -170
  67. package/dist/new-video-for-rendering.d.ts +0 -3
  68. package/dist/new-video-for-rendering.js +0 -108
  69. package/dist/new-video.d.ts +0 -3
  70. package/dist/new-video.js +0 -37
  71. package/dist/props.d.ts +0 -29
  72. package/dist/props.js +0 -1
  73. package/dist/remember-actual-matroska-timestamps.d.ts +0 -4
  74. package/dist/remember-actual-matroska-timestamps.js +0 -19
  75. package/dist/serialize-videoframe.d.ts +0 -0
  76. package/dist/serialize-videoframe.js +0 -1
  77. package/dist/video/new-video-for-preview.d.ts +0 -10
  78. package/dist/video/new-video-for-preview.js +0 -108
  79. package/dist/video-extraction/media-player.d.ts +0 -64
  80. package/dist/video-extraction/media-player.js +0 -501
  81. package/dist/video-extraction/new-video-for-preview.d.ts +0 -10
  82. package/dist/video-extraction/new-video-for-preview.js +0 -114
  83. package/dist/video-for-rendering.d.ts +0 -3
  84. package/dist/video-for-rendering.js +0 -108
  85. package/dist/video.d.ts +0 -3
  86. package/dist/video.js +0 -37
package/dist/new-video.js DELETED
@@ -1,37 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useCallback } from 'react';
3
- import { Internals, Sequence, useRemotionEnvironment } from 'remotion';
4
- import { VideoForRendering } from './new-video-for-rendering';
5
- const { validateMediaTrimProps, resolveTrimProps, validateMediaProps, VideoForPreview, } = Internals;
6
- export const Video = (props) => {
7
- // Should only destruct `startFrom` and `endAt` from props,
8
- // rest gets drilled down
9
- const { trimBefore, trimAfter, name, pauseWhenBuffering, stack, showInTimeline, ...otherProps } = props;
10
- const environment = useRemotionEnvironment();
11
- const onDuration = useCallback(() => undefined, []);
12
- if (typeof props.src !== 'string') {
13
- throw new TypeError(`The \`<Video>\` tag requires a string for \`src\`, but got ${JSON.stringify(props.src)} instead.`);
14
- }
15
- validateMediaTrimProps({
16
- startFrom: undefined,
17
- endAt: undefined,
18
- trimBefore,
19
- trimAfter,
20
- });
21
- const { trimBeforeValue, trimAfterValue } = resolveTrimProps({
22
- startFrom: undefined,
23
- endAt: undefined,
24
- trimBefore,
25
- trimAfter,
26
- });
27
- if (typeof trimBeforeValue !== 'undefined' ||
28
- typeof trimAfterValue !== 'undefined') {
29
- return (_jsx(Sequence, { layout: "none", from: 0 - (trimBeforeValue ?? 0), showInTimeline: false, durationInFrames: trimAfterValue, name: name, children: _jsx(Video, { pauseWhenBuffering: pauseWhenBuffering ?? false, ...otherProps }) }));
30
- }
31
- validateMediaProps(props, 'Video');
32
- if (environment.isRendering) {
33
- return _jsx(VideoForRendering, { ...otherProps });
34
- }
35
- const { onAutoPlayError, onVideoFrame, crossOrigin, delayRenderRetries, delayRenderTimeoutInMilliseconds, ...propsForPreview } = otherProps;
36
- return (_jsx(VideoForPreview, { _remotionInternalStack: stack ?? null, _remotionInternalNativeLoopPassed: false, onDuration: onDuration, onlyWarnForMediaSeekingError: true, pauseWhenBuffering: pauseWhenBuffering ?? false, showInTimeline: showInTimeline ?? true, onAutoPlayError: onAutoPlayError ?? undefined, onVideoFrame: onVideoFrame ?? null, crossOrigin: crossOrigin, ...propsForPreview }));
37
- };
package/dist/props.d.ts DELETED
@@ -1,29 +0,0 @@
1
- import type { LoopVolumeCurveBehavior, VolumeProp } from 'remotion';
2
- import type { LogLevel } from './log';
3
- export type AudioProps = {
4
- src: string;
5
- trimBefore?: number;
6
- trimAfter?: number;
7
- volume?: VolumeProp;
8
- loopVolumeCurveBehavior?: LoopVolumeCurveBehavior;
9
- name?: string;
10
- pauseWhenBuffering?: boolean;
11
- showInTimeline?: boolean;
12
- onAutoPlayError?: null | (() => void);
13
- playbackRate?: number;
14
- muted?: boolean;
15
- delayRenderRetries?: number;
16
- delayRenderTimeoutInMilliseconds?: number;
17
- crossOrigin?: '' | 'anonymous' | 'use-credentials';
18
- style?: React.CSSProperties;
19
- onError?: (err: Error) => void;
20
- useWebAudioApi?: boolean;
21
- acceptableTimeShiftInSeconds?: number;
22
- /**
23
- * @deprecated For internal use only
24
- */
25
- stack?: string;
26
- logLevel?: LogLevel;
27
- loop?: boolean;
28
- _remotionInternalNativeLoopPassed?: boolean;
29
- };
package/dist/props.js DELETED
@@ -1 +0,0 @@
1
- export {};
@@ -1,4 +0,0 @@
1
- export declare const rememberActualMatroskaTimestamps: (isMatroska: boolean) => {
2
- observeTimestamp: (startTime: number) => void;
3
- getRealTimestamp: (observedTimestamp: number) => number | null;
4
- };
@@ -1,19 +0,0 @@
1
- export const rememberActualMatroskaTimestamps = (isMatroska) => {
2
- const observations = [];
3
- const observeTimestamp = (startTime) => {
4
- if (!isMatroska) {
5
- return;
6
- }
7
- observations.push(startTime);
8
- };
9
- const getRealTimestamp = (observedTimestamp) => {
10
- if (!isMatroska) {
11
- return observedTimestamp;
12
- }
13
- return (observations.find((observation) => Math.abs(observedTimestamp - observation) < 0.001) ?? null);
14
- };
15
- return {
16
- observeTimestamp,
17
- getRealTimestamp,
18
- };
19
- };
File without changes
@@ -1 +0,0 @@
1
- "use strict";
@@ -1,10 +0,0 @@
1
- import React from 'react';
2
- import type { LogLevel } from 'remotion';
3
- type NewVideoForPreviewProps = {
4
- readonly src: string;
5
- readonly style?: React.CSSProperties;
6
- readonly playbackRate?: number;
7
- readonly logLevel?: LogLevel;
8
- };
9
- export declare const NewVideoForPreview: React.FC<NewVideoForPreviewProps>;
10
- export {};
@@ -1,108 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useContext, useEffect, useRef, useState } from 'react';
3
- import { Internals, useBufferState, useCurrentFrame } from 'remotion';
4
- import { MediaPlayer } from './media-player';
5
- const { useUnsafeVideoConfig, Timeline, SharedAudioContext } = Internals;
6
- export const NewVideoForPreview = ({ src, style, playbackRate = 1, logLevel = 'info', }) => {
7
- const canvasRef = useRef(null);
8
- const videoConfig = useUnsafeVideoConfig();
9
- const frame = useCurrentFrame();
10
- const mediaPlayerRef = useRef(null);
11
- const [mediaPlayerReady, setMediaPlayerReady] = useState(false);
12
- const [playing] = Timeline.usePlayingState();
13
- const sharedAudioContext = useContext(SharedAudioContext);
14
- const buffer = useBufferState();
15
- const delayHandleRef = useRef(null);
16
- if (!videoConfig) {
17
- throw new Error('No video config found');
18
- }
19
- if (!src) {
20
- throw new TypeError('No `src` was passed to <NewVideoForPreview>.');
21
- }
22
- const actualFps = videoConfig.fps / playbackRate;
23
- const currentTime = frame / actualFps;
24
- const [initialTimestamp] = useState(currentTime);
25
- useEffect(() => {
26
- if (!canvasRef.current)
27
- return;
28
- if (!sharedAudioContext)
29
- return;
30
- if (!sharedAudioContext.audioContext)
31
- return;
32
- try {
33
- const player = new MediaPlayer({
34
- canvas: canvasRef.current,
35
- src,
36
- logLevel,
37
- sharedAudioContext: sharedAudioContext.audioContext,
38
- });
39
- mediaPlayerRef.current = player;
40
- player
41
- .initialize(initialTimestamp)
42
- .then(() => {
43
- setMediaPlayerReady(true);
44
- Internals.Log.trace({ logLevel, tag: '@remotion/media' }, `[NewVideoForPreview] MediaPlayer initialized successfully`);
45
- })
46
- .catch((error) => {
47
- Internals.Log.error({ logLevel, tag: '@remotion/media' }, '[NewVideoForPreview] Failed to initialize MediaPlayer', error);
48
- });
49
- }
50
- catch (error) {
51
- Internals.Log.error({ logLevel, tag: '@remotion/media' }, '[NewVideoForPreview] MediaPlayer initialization failed', error);
52
- }
53
- return () => {
54
- if (delayHandleRef.current) {
55
- delayHandleRef.current.unblock();
56
- delayHandleRef.current = null;
57
- }
58
- if (mediaPlayerRef.current) {
59
- Internals.Log.trace({ logLevel, tag: '@remotion/media' }, `[NewVideoForPreview] Disposing MediaPlayer`);
60
- mediaPlayerRef.current.dispose();
61
- mediaPlayerRef.current = null;
62
- }
63
- setMediaPlayerReady(false);
64
- };
65
- }, [src, logLevel, sharedAudioContext, initialTimestamp]);
66
- // sync play/pause state with Remotion timeline (like old VideoForPreview video does)
67
- useEffect(() => {
68
- const mediaPlayer = mediaPlayerRef.current;
69
- if (!mediaPlayer)
70
- return;
71
- if (playing) {
72
- mediaPlayer.play().catch((error) => {
73
- Internals.Log.error({ logLevel, tag: '@remotion/media' }, '[NewVideoForPreview] Failed to play', error);
74
- });
75
- }
76
- else {
77
- mediaPlayer.pause();
78
- }
79
- }, [playing, logLevel, mediaPlayerReady]);
80
- // sync target time with MediaPlayer
81
- useEffect(() => {
82
- const mediaPlayer = mediaPlayerRef.current;
83
- if (!mediaPlayer || !mediaPlayerReady)
84
- return;
85
- mediaPlayer.seekTo(currentTime);
86
- Internals.Log.trace({ logLevel, tag: '@remotion/media' }, `[NewVideoForPreview] Updating target time to ${currentTime.toFixed(3)}s`);
87
- }, [currentTime, logLevel, mediaPlayerReady]);
88
- // sync MediaPlayer buffering with Remotion buffering
89
- useEffect(() => {
90
- const mediaPlayer = mediaPlayerRef.current;
91
- if (!mediaPlayer || !mediaPlayerReady)
92
- return;
93
- mediaPlayer.onBufferingChange((newBufferingState) => {
94
- if (newBufferingState && !delayHandleRef.current) {
95
- // Start blocking Remotion playback
96
- delayHandleRef.current = buffer.delayPlayback();
97
- Internals.Log.trace({ logLevel, tag: '@remotion/media' }, '[NewVideoForPreview] MediaPlayer buffering - blocking Remotion playback');
98
- }
99
- else if (!newBufferingState && delayHandleRef.current) {
100
- // Unblock Remotion playback
101
- delayHandleRef.current.unblock();
102
- delayHandleRef.current = null;
103
- Internals.Log.trace({ logLevel, tag: '@remotion/media' }, '[NewVideoForPreview] MediaPlayer unbuffering - unblocking Remotion playback');
104
- }
105
- });
106
- }, [mediaPlayerReady, buffer, logLevel]);
107
- return (_jsx("canvas", { ref: canvasRef, width: videoConfig.width, height: videoConfig.height, style: style }));
108
- };
@@ -1,64 +0,0 @@
1
- import { type LogLevel } from '../log';
2
- export declare class MediaPlayer {
3
- private canvas;
4
- private context;
5
- private src;
6
- private logLevel;
7
- private canvasSink;
8
- private videoFrameIterator;
9
- private nextFrame;
10
- private audioSink;
11
- private audioBufferIterator;
12
- private queuedAudioNodes;
13
- private gainNode;
14
- private expectedAudioTime;
15
- private sharedAudioContext;
16
- private mediaTimeOffset;
17
- private playing;
18
- private animationFrameId;
19
- private asyncId;
20
- private initialized;
21
- private totalDuration;
22
- private actualFps;
23
- private isStalled;
24
- private onStalledChangeCallback?;
25
- private lastAudioProgressAtMs;
26
- private lastNetworkActivityAtMs;
27
- private isNetworkActive;
28
- private isSeeking;
29
- private canStartAudio;
30
- constructor({ canvas, src, logLevel, sharedAudioContext, }: {
31
- canvas: HTMLCanvasElement;
32
- src: string;
33
- logLevel: LogLevel;
34
- sharedAudioContext?: AudioContext | null;
35
- });
36
- initialize(startTime?: number): Promise<void>;
37
- seekTo(time: number): void;
38
- drawInitialFrame(time?: number): Promise<void>;
39
- play(): Promise<void>;
40
- pause(): void;
41
- dispose(): void;
42
- get currentTime(): number;
43
- private getPlaybackTime;
44
- get duration(): number;
45
- get isPlaying(): boolean;
46
- get stalled(): boolean;
47
- onStalledChange(callback: (isStalled: boolean) => void): void;
48
- private renderSingleFrame;
49
- private startRenderLoop;
50
- private stopRenderLoop;
51
- private render;
52
- private startVideoIterator;
53
- private updateNextFrame;
54
- private tryStartAudio;
55
- private getCurrentTimeMs;
56
- private resetAudioProgressStopwatch;
57
- private getAudioLookaheadSec;
58
- private calculateAudioStallThresholdSec;
59
- private isNetworkStalled;
60
- private checkVideoStall;
61
- private checkIfStalled;
62
- private updateStalledState;
63
- private runAudioIterator;
64
- }