@remotion/media 4.0.354 → 4.0.355

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 (65) hide show
  1. package/dist/audio-extraction/extract-audio.js +2 -6
  2. package/dist/esm/index.mjs +223 -13130
  3. package/dist/get-sink-weak.d.ts +18 -0
  4. package/dist/get-sink-weak.js +23 -0
  5. package/dist/video-extraction/extract-frame.d.ts +0 -2
  6. package/dist/video-extraction/extract-frame.js +3 -6
  7. package/dist/video-extraction/get-frames-since-keyframe.d.ts +2 -2
  8. package/dist/video-extraction/get-frames-since-keyframe.js +2 -2
  9. package/package.json +5 -5
  10. package/dist/audio-for-rendering.d.ts +0 -3
  11. package/dist/audio-for-rendering.js +0 -94
  12. package/dist/audio.d.ts +0 -3
  13. package/dist/audio.js +0 -60
  14. package/dist/audiodata-to-array.d.ts +0 -0
  15. package/dist/audiodata-to-array.js +0 -1
  16. package/dist/convert-audiodata/data-types.d.ts +0 -1
  17. package/dist/convert-audiodata/data-types.js +0 -22
  18. package/dist/convert-audiodata/is-planar-format.d.ts +0 -1
  19. package/dist/convert-audiodata/is-planar-format.js +0 -3
  20. package/dist/convert-audiodata/log-audiodata.d.ts +0 -1
  21. package/dist/convert-audiodata/log-audiodata.js +0 -8
  22. package/dist/convert-audiodata/trim-audiodata.d.ts +0 -0
  23. package/dist/convert-audiodata/trim-audiodata.js +0 -1
  24. package/dist/deserialized-audiodata.d.ts +0 -15
  25. package/dist/deserialized-audiodata.js +0 -26
  26. package/dist/extract-audio.d.ts +0 -7
  27. package/dist/extract-audio.js +0 -98
  28. package/dist/extract-frame-via-broadcast-channel.d.ts +0 -15
  29. package/dist/extract-frame-via-broadcast-channel.js +0 -104
  30. package/dist/extract-frame.d.ts +0 -27
  31. package/dist/extract-frame.js +0 -21
  32. package/dist/extrct-audio.d.ts +0 -7
  33. package/dist/extrct-audio.js +0 -94
  34. package/dist/get-frames-since-keyframe.d.ts +0 -22
  35. package/dist/get-frames-since-keyframe.js +0 -41
  36. package/dist/keyframe-bank.d.ts +0 -25
  37. package/dist/keyframe-bank.js +0 -120
  38. package/dist/keyframe-manager.d.ts +0 -23
  39. package/dist/keyframe-manager.js +0 -170
  40. package/dist/new-video-for-rendering.d.ts +0 -3
  41. package/dist/new-video-for-rendering.js +0 -108
  42. package/dist/new-video.d.ts +0 -3
  43. package/dist/new-video.js +0 -37
  44. package/dist/props.d.ts +0 -29
  45. package/dist/props.js +0 -1
  46. package/dist/remember-actual-matroska-timestamps.d.ts +0 -4
  47. package/dist/remember-actual-matroska-timestamps.js +0 -19
  48. package/dist/serialize-videoframe.d.ts +0 -0
  49. package/dist/serialize-videoframe.js +0 -1
  50. package/dist/video/media-player.d.ts +0 -62
  51. package/dist/video/media-player.js +0 -361
  52. package/dist/video/new-video-for-preview.d.ts +0 -10
  53. package/dist/video/new-video-for-preview.js +0 -108
  54. package/dist/video/timeout-utils.d.ts +0 -2
  55. package/dist/video/timeout-utils.js +0 -18
  56. package/dist/video/video-for-preview.d.ts +0 -11
  57. package/dist/video/video-for-preview.js +0 -113
  58. package/dist/video-extraction/media-player.d.ts +0 -64
  59. package/dist/video-extraction/media-player.js +0 -501
  60. package/dist/video-extraction/new-video-for-preview.d.ts +0 -10
  61. package/dist/video-extraction/new-video-for-preview.js +0 -114
  62. package/dist/video-for-rendering.d.ts +0 -3
  63. package/dist/video-for-rendering.js +0 -108
  64. package/dist/video.d.ts +0 -3
  65. package/dist/video.js +0 -37
@@ -1,114 +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 { Log } from '../log';
5
- import { MediaPlayer } from '../video/media-player';
6
- const { useUnsafeVideoConfig, Timeline, SharedAudioContext } = Internals;
7
- export const NewVideoForPreview = ({ src, style, playbackRate = 1, logLevel = 'info', }) => {
8
- const canvasRef = useRef(null);
9
- const videoConfig = useUnsafeVideoConfig();
10
- const frame = useCurrentFrame();
11
- const lastCurrentTimeRef = useRef(-1);
12
- const mediaPlayerRef = useRef(null);
13
- const [mediaPlayerReady, setMediaPlayerReady] = useState(false);
14
- const [playing] = Timeline.usePlayingState();
15
- const sharedAudioContext = useContext(SharedAudioContext);
16
- const buffer = useBufferState();
17
- const delayHandleRef = useRef(null);
18
- if (!videoConfig) {
19
- throw new Error('No video config found');
20
- }
21
- if (!src) {
22
- throw new TypeError('No `src` was passed to <NewVideoForPreview>.');
23
- }
24
- const actualFps = videoConfig.fps / playbackRate;
25
- const currentTime = frame / actualFps;
26
- const [initialTimestamp] = useState(currentTime);
27
- useEffect(() => {
28
- if (!canvasRef.current)
29
- return;
30
- if (!sharedAudioContext)
31
- return;
32
- if (!sharedAudioContext.audioContext)
33
- return;
34
- try {
35
- Log.trace(logLevel, `[NewVideoForPreview] Creating MediaPlayer for src: ${src}`);
36
- const player = new MediaPlayer({
37
- canvas: canvasRef.current,
38
- src,
39
- logLevel,
40
- sharedAudioContext: sharedAudioContext.audioContext,
41
- });
42
- mediaPlayerRef.current = player;
43
- player
44
- .initialize(initialTimestamp)
45
- .then(() => {
46
- setMediaPlayerReady(true);
47
- Log.trace(logLevel, `[NewVideoForPreview] MediaPlayer initialized successfully`);
48
- })
49
- .catch((error) => {
50
- Log.error('[NewVideoForPreview] Failed to initialize MediaPlayer', error);
51
- });
52
- }
53
- catch (error) {
54
- Log.error('[NewVideoForPreview] MediaPlayer initialization failed', error);
55
- }
56
- return () => {
57
- if (delayHandleRef.current) {
58
- delayHandleRef.current.unblock();
59
- delayHandleRef.current = null;
60
- }
61
- if (mediaPlayerRef.current) {
62
- Log.trace(logLevel, `[NewVideoForPreview] Disposing MediaPlayer`);
63
- mediaPlayerRef.current.dispose();
64
- mediaPlayerRef.current = null;
65
- }
66
- setMediaPlayerReady(false);
67
- };
68
- }, [src, logLevel, sharedAudioContext, initialTimestamp]);
69
- // sync play/pause state with Remotion timeline (like old VideoForPreview video does)
70
- useEffect(() => {
71
- const mediaPlayer = mediaPlayerRef.current;
72
- if (!mediaPlayer)
73
- return;
74
- if (playing) {
75
- Log.trace(logLevel, `[NewVideoForPreview] Remotion playing - calling MediaPlayer.play()`);
76
- mediaPlayer.play().catch((error) => {
77
- Log.error('[NewVideoForPreview] Failed to play', error);
78
- });
79
- }
80
- else {
81
- Log.trace(logLevel, `[NewVideoForPreview] Remotion paused - calling MediaPlayer.pause()`);
82
- mediaPlayer.pause();
83
- }
84
- }, [playing, logLevel, mediaPlayerReady]);
85
- // sync target time with MediaPlayer
86
- useEffect(() => {
87
- const mediaPlayer = mediaPlayerRef.current;
88
- if (!mediaPlayer || !mediaPlayerReady)
89
- return;
90
- mediaPlayer.seekTo(currentTime);
91
- Log.trace(logLevel, `[NewVideoForPreview] Updating target time to ${currentTime.toFixed(3)}s`);
92
- lastCurrentTimeRef.current = currentTime;
93
- }, [currentTime, logLevel, mediaPlayerReady]);
94
- // sync MediaPlayer stalling with Remotion buffering
95
- useEffect(() => {
96
- const mediaPlayer = mediaPlayerRef.current;
97
- if (!mediaPlayer || !mediaPlayerReady)
98
- return;
99
- mediaPlayer.onStalledChange((isStalled) => {
100
- if (isStalled && !delayHandleRef.current) {
101
- // Start blocking Remotion playback
102
- delayHandleRef.current = buffer.delayPlayback();
103
- Log.trace(logLevel, '[NewVideoForPreview] MediaPlayer stalled - blocking Remotion playback');
104
- }
105
- else if (!isStalled && delayHandleRef.current) {
106
- // Unblock Remotion playback
107
- delayHandleRef.current.unblock();
108
- delayHandleRef.current = null;
109
- Log.trace(logLevel, '[NewVideoForPreview] MediaPlayer unstalled - unblocking Remotion playback');
110
- }
111
- });
112
- }, [mediaPlayerReady, buffer, logLevel]);
113
- return (_jsx("canvas", { ref: canvasRef, width: videoConfig.width, height: videoConfig.height, style: style }));
114
- };
@@ -1,3 +0,0 @@
1
- import React from 'react';
2
- import type { VideoProps } from './video/props';
3
- export declare const VideoForRendering: React.FC<VideoProps>;
@@ -1,108 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useContext, useLayoutEffect, useMemo, useRef, useState, } from 'react';
3
- import { cancelRender, Internals, useCurrentFrame, useDelayRender, useRemotionEnvironment, } from 'remotion';
4
- import { extractFrameViaBroadcastChannel } from './extract-frame-via-broadcast-channel';
5
- export const VideoForRendering = ({ volume: volumeProp, playbackRate, src, muted, loopVolumeCurveBehavior, delayRenderRetries, delayRenderTimeoutInMilliseconds,
6
- // call when a frame of the video, i.e. frame drawn on canvas
7
- onVideoFrame, logLevel = window.remotion_logLevel, }) => {
8
- const absoluteFrame = Internals.useTimelinePosition();
9
- const videoConfig = Internals.useUnsafeVideoConfig();
10
- const canvasRef = useRef(null);
11
- const { registerRenderAsset, unregisterRenderAsset } = useContext(Internals.RenderAssetManager);
12
- const frame = useCurrentFrame();
13
- const volumePropsFrame = Internals.useFrameForVolumeProp(loopVolumeCurveBehavior ?? 'repeat');
14
- const environment = useRemotionEnvironment();
15
- const [id] = useState(() => `${Math.random()}`.replace('0.', ''));
16
- if (!videoConfig) {
17
- throw new Error('No video config found');
18
- }
19
- if (!src) {
20
- throw new TypeError('No `src` was passed to <Video>.');
21
- }
22
- const volume = Internals.evaluateVolume({
23
- volume: volumeProp,
24
- frame: volumePropsFrame,
25
- mediaVolume: 1,
26
- });
27
- Internals.warnAboutTooHighVolume(volume);
28
- const shouldRenderAudio = useMemo(() => {
29
- if (!window.remotion_audioEnabled) {
30
- return false;
31
- }
32
- if (muted) {
33
- return false;
34
- }
35
- if (volume <= 0) {
36
- return false;
37
- }
38
- return true;
39
- }, [muted, volume]);
40
- const { fps } = videoConfig;
41
- const { delayRender, continueRender } = useDelayRender();
42
- useLayoutEffect(() => {
43
- if (!canvasRef.current) {
44
- return;
45
- }
46
- const actualFps = playbackRate ? fps / playbackRate : fps;
47
- const timestamp = frame / actualFps;
48
- const durationInSeconds = 1 / actualFps;
49
- const newHandle = delayRender(`Extracting frame number ${frame}`, {
50
- retries: delayRenderRetries ?? undefined,
51
- timeoutInMilliseconds: delayRenderTimeoutInMilliseconds ?? undefined,
52
- });
53
- extractFrameViaBroadcastChannel({
54
- src,
55
- timeInSeconds: timestamp,
56
- durationInSeconds,
57
- logLevel: logLevel ?? 'info',
58
- shouldRenderAudio,
59
- isClientSideRendering: environment.isClientSideRendering,
60
- })
61
- .then(({ frame: imageBitmap, audio }) => {
62
- if (!imageBitmap) {
63
- cancelRender(new Error('No video frame found'));
64
- }
65
- onVideoFrame?.(imageBitmap);
66
- canvasRef.current?.getContext('2d')?.drawImage(imageBitmap, 0, 0);
67
- imageBitmap.close();
68
- if (audio) {
69
- registerRenderAsset({
70
- type: 'inline-audio',
71
- id,
72
- audio: Array.from(audio.data),
73
- sampleRate: audio.sampleRate,
74
- numberOfChannels: audio.numberOfChannels,
75
- frame: absoluteFrame,
76
- timestamp: audio.timestamp,
77
- duration: (audio.numberOfFrames / audio.sampleRate) * 1000000,
78
- });
79
- }
80
- continueRender(newHandle);
81
- })
82
- .catch((error) => {
83
- cancelRender(error);
84
- });
85
- return () => {
86
- continueRender(newHandle);
87
- unregisterRenderAsset(id);
88
- };
89
- }, [
90
- absoluteFrame,
91
- continueRender,
92
- delayRender,
93
- delayRenderRetries,
94
- delayRenderTimeoutInMilliseconds,
95
- environment.isClientSideRendering,
96
- fps,
97
- frame,
98
- id,
99
- logLevel,
100
- onVideoFrame,
101
- playbackRate,
102
- registerRenderAsset,
103
- shouldRenderAudio,
104
- src,
105
- unregisterRenderAsset,
106
- ]);
107
- return (_jsx("canvas", { ref: canvasRef, width: videoConfig.width, height: videoConfig.height }));
108
- };
package/dist/video.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import React from 'react';
2
- import type { VideoProps } from './props';
3
- export declare const Video: React.FC<VideoProps>;
package/dist/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 './video-for-rendering';
5
- const { validateMediaTrimProps, resolveTrimProps, validateMediaProps, VideoForPreview, } = Internals;
6
- export const Video = (props) => {
7
- // Should only destruct `trimBefore` and `trimAfter` 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
- };