@remotion/webcodecs 4.0.230 → 4.0.232
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/README.md +12 -1
- package/dist/audio-decoder.js +6 -0
- package/dist/audio-encoder-config.d.ts +4 -1
- package/dist/audio-encoder-config.js +6 -0
- package/dist/audio-encoder.d.ts +4 -3
- package/dist/audio-encoder.js +5 -1
- package/dist/browser-quirks.d.ts +2 -0
- package/dist/browser-quirks.js +11 -0
- package/dist/can-copy-audio-track.d.ts +1 -1
- package/dist/can-copy-audio-track.js +3 -0
- package/dist/can-copy-video-track.d.ts +1 -1
- package/dist/can-copy-video-track.js +4 -1
- package/dist/can-reencode-audio-track.d.ts +1 -1
- package/dist/can-reencode-audio-track.js +3 -0
- package/dist/can-reencode-video-track.d.ts +1 -1
- package/dist/codec-id.d.ts +2 -2
- package/dist/codec-id.js +8 -2
- package/dist/convert-media.d.ts +9 -5
- package/dist/convert-media.js +55 -42
- package/dist/convert-to-correct-videoframe.d.ts +9 -0
- package/dist/convert-to-correct-videoframe.js +32 -0
- package/dist/default-on-video-track-handler.js +4 -0
- package/dist/esm/index.mjs +347 -110
- package/dist/generate-output-filename.d.ts +2 -0
- package/dist/generate-output-filename.js +14 -0
- package/dist/get-available-audio-codecs.d.ts +7 -0
- package/dist/get-available-audio-codecs.js +18 -0
- package/dist/get-available-containers.d.ts +4 -0
- package/dist/get-available-containers.js +8 -0
- package/dist/get-available-video-codecs.d.ts +7 -0
- package/dist/get-available-video-codecs.js +18 -0
- package/dist/get-default-audio-codec.d.ts +2 -1
- package/dist/get-default-audio-codec.js +3 -0
- package/dist/get-default-video-codec.d.ts +3 -2
- package/dist/get-default-video-codec.js +7 -1
- package/dist/index.d.ts +8 -6
- package/dist/index.js +9 -5
- package/dist/io-manager/io-synchronizer.js +12 -6
- package/dist/on-audio-track-handler.d.ts +2 -1
- package/dist/on-audio-track.d.ts +5 -5
- package/dist/on-audio-track.js +22 -8
- package/dist/on-frame.d.ts +4 -4
- package/dist/on-frame.js +11 -11
- package/dist/on-video-track-handler.d.ts +2 -1
- package/dist/on-video-track.d.ts +6 -5
- package/dist/on-video-track.js +15 -7
- package/dist/select-container-creator.d.ts +2 -0
- package/dist/select-container-creator.js +17 -0
- package/dist/set-remotion-imported.d.ts +6 -0
- package/dist/set-remotion-imported.js +25 -0
- package/dist/throttled-state-update.d.ts +13 -0
- package/dist/throttled-state-update.js +49 -0
- package/dist/video-encoder-config.d.ts +1 -1
- package/dist/video-encoder-config.js +2 -0
- package/dist/video-encoder.d.ts +3 -1
- package/dist/video-encoder.js +8 -4
- package/dist/wav-audio-encoder.d.ts +2 -0
- package/dist/wav-audio-encoder.js +26 -0
- package/package.json +4 -3
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateOutputFilename = void 0;
|
|
4
|
+
const generateOutputFilename = (source, container) => {
|
|
5
|
+
const filename = typeof source === 'string'
|
|
6
|
+
? source
|
|
7
|
+
: source instanceof File
|
|
8
|
+
? source.name
|
|
9
|
+
: 'converted';
|
|
10
|
+
const behindSlash = filename.split('/').pop();
|
|
11
|
+
const withoutExtension = behindSlash.split('.').slice(0, -1).join('.');
|
|
12
|
+
return `${withoutExtension}.${container}`;
|
|
13
|
+
};
|
|
14
|
+
exports.generateOutputFilename = generateOutputFilename;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ConvertMediaContainer } from './get-available-containers';
|
|
2
|
+
declare const availableAudioCodecs: readonly ["opus", "aac", "wav"];
|
|
3
|
+
export declare const getAvailableAudioCodecs: ({ container, }: {
|
|
4
|
+
container: ConvertMediaContainer;
|
|
5
|
+
}) => ConvertMediaAudioCodec[];
|
|
6
|
+
export type ConvertMediaAudioCodec = (typeof availableAudioCodecs)[number];
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAvailableAudioCodecs = void 0;
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
5
|
+
const availableAudioCodecs = ['opus', 'aac', 'wav'];
|
|
6
|
+
const getAvailableAudioCodecs = ({ container, }) => {
|
|
7
|
+
if (container === 'mp4') {
|
|
8
|
+
return ['aac'];
|
|
9
|
+
}
|
|
10
|
+
if (container === 'webm') {
|
|
11
|
+
return ['opus'];
|
|
12
|
+
}
|
|
13
|
+
if (container === 'wav') {
|
|
14
|
+
return ['wav'];
|
|
15
|
+
}
|
|
16
|
+
throw new Error(`Unsupported container: ${container}`);
|
|
17
|
+
};
|
|
18
|
+
exports.getAvailableAudioCodecs = getAvailableAudioCodecs;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAvailableContainers = void 0;
|
|
4
|
+
const availableContainers = ['webm', 'mp4', 'wav'];
|
|
5
|
+
const getAvailableContainers = () => {
|
|
6
|
+
return availableContainers;
|
|
7
|
+
};
|
|
8
|
+
exports.getAvailableContainers = getAvailableContainers;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ConvertMediaContainer } from './get-available-containers';
|
|
2
|
+
declare const availableVideoCodecs: readonly ["vp8", "vp9", "h264"];
|
|
3
|
+
export type ConvertMediaVideoCodec = (typeof availableVideoCodecs)[number];
|
|
4
|
+
export declare const getAvailableVideoCodecs: ({ container, }: {
|
|
5
|
+
container: ConvertMediaContainer;
|
|
6
|
+
}) => ConvertMediaVideoCodec[];
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAvailableVideoCodecs = void 0;
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
5
|
+
const availableVideoCodecs = ['vp8', 'vp9', 'h264'];
|
|
6
|
+
const getAvailableVideoCodecs = ({ container, }) => {
|
|
7
|
+
if (container === 'mp4') {
|
|
8
|
+
return ['h264'];
|
|
9
|
+
}
|
|
10
|
+
if (container === 'webm') {
|
|
11
|
+
return ['vp8', 'vp9'];
|
|
12
|
+
}
|
|
13
|
+
if (container === 'wav') {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
throw new Error(`Unsupported container: ${container}`);
|
|
17
|
+
};
|
|
18
|
+
exports.getAvailableVideoCodecs = getAvailableVideoCodecs;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { ConvertMediaAudioCodec
|
|
1
|
+
import type { ConvertMediaAudioCodec } from './get-available-audio-codecs';
|
|
2
|
+
import type { ConvertMediaContainer } from './get-available-containers';
|
|
2
3
|
export declare const getDefaultAudioCodec: ({ container, }: {
|
|
3
4
|
container: ConvertMediaContainer;
|
|
4
5
|
}) => ConvertMediaAudioCodec;
|
|
@@ -8,6 +8,9 @@ const getDefaultAudioCodec = ({ container, }) => {
|
|
|
8
8
|
if (container === 'mp4') {
|
|
9
9
|
return 'aac';
|
|
10
10
|
}
|
|
11
|
+
if (container === 'wav') {
|
|
12
|
+
return 'wav';
|
|
13
|
+
}
|
|
11
14
|
throw new Error(`Unhandled container: ${container}`);
|
|
12
15
|
};
|
|
13
16
|
exports.getDefaultAudioCodec = getDefaultAudioCodec;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { ConvertMediaContainer
|
|
1
|
+
import type { ConvertMediaContainer } from './get-available-containers';
|
|
2
|
+
import type { ConvertMediaVideoCodec } from './get-available-video-codecs';
|
|
2
3
|
export declare const getDefaultVideoCodec: ({ container, }: {
|
|
3
4
|
container: ConvertMediaContainer;
|
|
4
|
-
}) => ConvertMediaVideoCodec;
|
|
5
|
+
}) => ConvertMediaVideoCodec | null;
|
|
@@ -5,6 +5,12 @@ const getDefaultVideoCodec = ({ container, }) => {
|
|
|
5
5
|
if (container === 'webm') {
|
|
6
6
|
return 'vp8';
|
|
7
7
|
}
|
|
8
|
-
|
|
8
|
+
if (container === 'mp4') {
|
|
9
|
+
return 'h264';
|
|
10
|
+
}
|
|
11
|
+
if (container === 'wav') {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
throw new Error(`Unhandled container: ${container}`);
|
|
9
15
|
};
|
|
10
16
|
exports.getDefaultVideoCodec = getDefaultVideoCodec;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { createAudioDecoder, WebCodecsAudioDecoder } from './audio-decoder';
|
|
2
|
+
export { createAudioEncoder, WebCodecsAudioEncoder } from './audio-encoder';
|
|
3
3
|
export { canCopyAudioTrack } from './can-copy-audio-track';
|
|
4
4
|
export { canCopyVideoTrack } from './can-copy-video-track';
|
|
5
5
|
export { canReencodeAudioTrack } from './can-reencode-audio-track';
|
|
6
6
|
export { canReencodeVideoTrack } from './can-reencode-video-track';
|
|
7
|
-
export {
|
|
8
|
-
export { ConvertMediaOnMediaStateUpdate, ConvertMediaOnVideoFrame, ConvertMediaResult, ConvertMediaState, convertMedia, } from './convert-media';
|
|
7
|
+
export { convertMedia, ConvertMediaOnProgress, ConvertMediaOnVideoFrame, ConvertMediaProgress, ConvertMediaResult, } from './convert-media';
|
|
9
8
|
export { defaultOnAudioTrackHandler } from './default-on-audio-track-handler';
|
|
10
9
|
export { defaultOnVideoTrackHandler } from './default-on-video-track-handler';
|
|
10
|
+
export { ConvertMediaAudioCodec, getAvailableAudioCodecs, } from './get-available-audio-codecs';
|
|
11
|
+
export { ConvertMediaContainer, getAvailableContainers, } from './get-available-containers';
|
|
12
|
+
export { ConvertMediaVideoCodec, getAvailableVideoCodecs, } from './get-available-video-codecs';
|
|
11
13
|
export { getDefaultAudioCodec } from './get-default-audio-codec';
|
|
12
14
|
export { getDefaultVideoCodec } from './get-default-video-codec';
|
|
13
15
|
export { AudioOperation, ConvertMediaOnAudioTrackHandler, } from './on-audio-track-handler';
|
|
14
16
|
export { ConvertMediaOnVideoTrackHandler, VideoOperation, } from './on-video-track-handler';
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
17
|
+
export { createVideoDecoder, WebCodecsVideoDecoder } from './video-decoder';
|
|
18
|
+
export { createVideoEncoder, WebCodecsVideoEncoder } from './video-encoder';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createVideoEncoder = exports.createVideoDecoder = exports.getDefaultVideoCodec = exports.getDefaultAudioCodec = exports.
|
|
3
|
+
exports.createVideoEncoder = exports.createVideoDecoder = exports.getDefaultVideoCodec = exports.getDefaultAudioCodec = exports.getAvailableVideoCodecs = exports.getAvailableContainers = exports.getAvailableAudioCodecs = exports.defaultOnVideoTrackHandler = exports.defaultOnAudioTrackHandler = exports.convertMedia = exports.canReencodeVideoTrack = exports.canReencodeAudioTrack = exports.canCopyVideoTrack = exports.canCopyAudioTrack = exports.createAudioEncoder = exports.createAudioDecoder = void 0;
|
|
4
|
+
const set_remotion_imported_1 = require("./set-remotion-imported");
|
|
4
5
|
var audio_decoder_1 = require("./audio-decoder");
|
|
5
6
|
Object.defineProperty(exports, "createAudioDecoder", { enumerable: true, get: function () { return audio_decoder_1.createAudioDecoder; } });
|
|
6
7
|
var audio_encoder_1 = require("./audio-encoder");
|
|
@@ -13,16 +14,18 @@ var can_reencode_audio_track_1 = require("./can-reencode-audio-track");
|
|
|
13
14
|
Object.defineProperty(exports, "canReencodeAudioTrack", { enumerable: true, get: function () { return can_reencode_audio_track_1.canReencodeAudioTrack; } });
|
|
14
15
|
var can_reencode_video_track_1 = require("./can-reencode-video-track");
|
|
15
16
|
Object.defineProperty(exports, "canReencodeVideoTrack", { enumerable: true, get: function () { return can_reencode_video_track_1.canReencodeVideoTrack; } });
|
|
16
|
-
var codec_id_1 = require("./codec-id");
|
|
17
|
-
Object.defineProperty(exports, "getAvailableAudioCodecs", { enumerable: true, get: function () { return codec_id_1.getAvailableAudioCodecs; } });
|
|
18
|
-
Object.defineProperty(exports, "getAvailableContainers", { enumerable: true, get: function () { return codec_id_1.getAvailableContainers; } });
|
|
19
|
-
Object.defineProperty(exports, "getAvailableVideoCodecs", { enumerable: true, get: function () { return codec_id_1.getAvailableVideoCodecs; } });
|
|
20
17
|
var convert_media_1 = require("./convert-media");
|
|
21
18
|
Object.defineProperty(exports, "convertMedia", { enumerable: true, get: function () { return convert_media_1.convertMedia; } });
|
|
22
19
|
var default_on_audio_track_handler_1 = require("./default-on-audio-track-handler");
|
|
23
20
|
Object.defineProperty(exports, "defaultOnAudioTrackHandler", { enumerable: true, get: function () { return default_on_audio_track_handler_1.defaultOnAudioTrackHandler; } });
|
|
24
21
|
var default_on_video_track_handler_1 = require("./default-on-video-track-handler");
|
|
25
22
|
Object.defineProperty(exports, "defaultOnVideoTrackHandler", { enumerable: true, get: function () { return default_on_video_track_handler_1.defaultOnVideoTrackHandler; } });
|
|
23
|
+
var get_available_audio_codecs_1 = require("./get-available-audio-codecs");
|
|
24
|
+
Object.defineProperty(exports, "getAvailableAudioCodecs", { enumerable: true, get: function () { return get_available_audio_codecs_1.getAvailableAudioCodecs; } });
|
|
25
|
+
var get_available_containers_1 = require("./get-available-containers");
|
|
26
|
+
Object.defineProperty(exports, "getAvailableContainers", { enumerable: true, get: function () { return get_available_containers_1.getAvailableContainers; } });
|
|
27
|
+
var get_available_video_codecs_1 = require("./get-available-video-codecs");
|
|
28
|
+
Object.defineProperty(exports, "getAvailableVideoCodecs", { enumerable: true, get: function () { return get_available_video_codecs_1.getAvailableVideoCodecs; } });
|
|
26
29
|
var get_default_audio_codec_1 = require("./get-default-audio-codec");
|
|
27
30
|
Object.defineProperty(exports, "getDefaultAudioCodec", { enumerable: true, get: function () { return get_default_audio_codec_1.getDefaultAudioCodec; } });
|
|
28
31
|
var get_default_video_codec_1 = require("./get-default-video-codec");
|
|
@@ -31,3 +34,4 @@ var video_decoder_1 = require("./video-decoder");
|
|
|
31
34
|
Object.defineProperty(exports, "createVideoDecoder", { enumerable: true, get: function () { return video_decoder_1.createVideoDecoder; } });
|
|
32
35
|
var video_encoder_1 = require("./video-encoder");
|
|
33
36
|
Object.defineProperty(exports, "createVideoEncoder", { enumerable: true, get: function () { return video_encoder_1.createVideoEncoder; } });
|
|
37
|
+
(0, set_remotion_imported_1.setRemotionImported)();
|
|
@@ -69,12 +69,18 @@ const makeIoSynchronizer = (logLevel, label) => {
|
|
|
69
69
|
return promise;
|
|
70
70
|
};
|
|
71
71
|
const waitFor = async ({ _unprocessed, unemitted, }) => {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
await Promise.all([
|
|
73
|
+
async () => {
|
|
74
|
+
while (getUnemittedItems() > unemitted) {
|
|
75
|
+
await waitForOutput();
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
async () => {
|
|
79
|
+
while (getUnprocessed() > _unprocessed) {
|
|
80
|
+
await waitForProcessed();
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
]);
|
|
78
84
|
};
|
|
79
85
|
const waitForFinish = async () => {
|
|
80
86
|
await waitFor({ _unprocessed: 0, unemitted: 0 });
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AudioTrack, LogLevel } from '@remotion/media-parser';
|
|
2
|
-
import type { ConvertMediaAudioCodec
|
|
2
|
+
import type { ConvertMediaAudioCodec } from './get-available-audio-codecs';
|
|
3
|
+
import type { ConvertMediaContainer } from './get-available-containers';
|
|
3
4
|
export type AudioOperation = {
|
|
4
5
|
type: 'reencode';
|
|
5
6
|
bitrate: number;
|
package/dist/on-audio-track.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { LogLevel, MediaFn, OnAudioTrack } from '@remotion/media-parser';
|
|
2
|
-
import type { ConvertMediaAudioCodec, ConvertMediaContainer } from './codec-id';
|
|
3
|
-
import type { ConvertMediaState } from './convert-media';
|
|
4
2
|
import Error from './error-cause';
|
|
3
|
+
import type { ConvertMediaAudioCodec } from './get-available-audio-codecs';
|
|
4
|
+
import type { ConvertMediaContainer } from './get-available-containers';
|
|
5
5
|
import type { ConvertMediaOnAudioTrackHandler } from './on-audio-track-handler';
|
|
6
|
-
|
|
6
|
+
import type { ConvertMediaProgressFn } from './throttled-state-update';
|
|
7
|
+
export declare const makeAudioTrackHandler: ({ state, defaultAudioCodec: audioCodec, controller, abortConversion, onMediaStateUpdate, onAudioTrack, logLevel, container, }: {
|
|
7
8
|
state: MediaFn;
|
|
8
9
|
defaultAudioCodec: ConvertMediaAudioCodec | null;
|
|
9
|
-
convertMediaState: ConvertMediaState;
|
|
10
10
|
controller: AbortController;
|
|
11
11
|
abortConversion: (errCause: Error) => void;
|
|
12
|
-
onMediaStateUpdate: null |
|
|
12
|
+
onMediaStateUpdate: null | ConvertMediaProgressFn;
|
|
13
13
|
onAudioTrack: ConvertMediaOnAudioTrackHandler | null;
|
|
14
14
|
logLevel: LogLevel;
|
|
15
15
|
container: ConvertMediaContainer;
|
package/dist/on-audio-track.js
CHANGED
|
@@ -12,7 +12,7 @@ const convert_encoded_chunk_1 = require("./convert-encoded-chunk");
|
|
|
12
12
|
const default_on_audio_track_handler_1 = require("./default-on-audio-track-handler");
|
|
13
13
|
const error_cause_1 = __importDefault(require("./error-cause"));
|
|
14
14
|
const log_1 = require("./log");
|
|
15
|
-
const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec,
|
|
15
|
+
const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, controller, abortConversion, onMediaStateUpdate, onAudioTrack, logLevel, container, }) => async (track) => {
|
|
16
16
|
const audioOperation = await (onAudioTrack !== null && onAudioTrack !== void 0 ? onAudioTrack : default_on_audio_track_handler_1.defaultOnAudioTrackHandler)({
|
|
17
17
|
defaultAudioCodec: audioCodec,
|
|
18
18
|
track,
|
|
@@ -43,8 +43,12 @@ const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, convertMe
|
|
|
43
43
|
timescale: track.timescale,
|
|
44
44
|
codecPrivate: track.codecPrivate,
|
|
45
45
|
});
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate((prevState) => {
|
|
47
|
+
return {
|
|
48
|
+
...prevState,
|
|
49
|
+
encodedAudioFrames: prevState.encodedAudioFrames + 1,
|
|
50
|
+
};
|
|
51
|
+
});
|
|
48
52
|
};
|
|
49
53
|
}
|
|
50
54
|
const audioEncoderConfig = await (0, audio_encoder_config_1.getAudioEncoderConfig)({
|
|
@@ -70,7 +74,9 @@ const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, convertMe
|
|
|
70
74
|
const codecPrivate = audioOperation.audioCodec === 'aac' ? new Uint8Array([17, 144]) : null;
|
|
71
75
|
const { trackNumber } = await state.addTrack({
|
|
72
76
|
type: 'audio',
|
|
73
|
-
codec: audioOperation.audioCodec
|
|
77
|
+
codec: audioOperation.audioCodec === 'wav'
|
|
78
|
+
? 'pcm-s16'
|
|
79
|
+
: audioOperation.audioCodec,
|
|
74
80
|
numberOfChannels: track.numberOfChannels,
|
|
75
81
|
sampleRate: track.sampleRate,
|
|
76
82
|
codecPrivate,
|
|
@@ -92,8 +98,12 @@ const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, convertMe
|
|
|
92
98
|
timescale: track.timescale,
|
|
93
99
|
codecPrivate,
|
|
94
100
|
});
|
|
95
|
-
|
|
96
|
-
|
|
101
|
+
onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate((prevState) => {
|
|
102
|
+
return {
|
|
103
|
+
...prevState,
|
|
104
|
+
encodedAudioFrames: prevState.encodedAudioFrames + 1,
|
|
105
|
+
};
|
|
106
|
+
});
|
|
97
107
|
},
|
|
98
108
|
onError: (err) => {
|
|
99
109
|
abortConversion(new error_cause_1.default(`Audio encoder of ${track.trackId} failed (see .cause of this error)`, {
|
|
@@ -108,8 +118,12 @@ const makeAudioTrackHandler = ({ state, defaultAudioCodec: audioCodec, convertMe
|
|
|
108
118
|
const audioDecoder = (0, audio_decoder_1.createAudioDecoder)({
|
|
109
119
|
onFrame: async (frame) => {
|
|
110
120
|
await audioEncoder.encodeFrame(frame);
|
|
111
|
-
|
|
112
|
-
|
|
121
|
+
onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate((prevState) => {
|
|
122
|
+
return {
|
|
123
|
+
...prevState,
|
|
124
|
+
decodedAudioFrames: prevState.decodedAudioFrames + 1,
|
|
125
|
+
};
|
|
126
|
+
});
|
|
113
127
|
frame.close();
|
|
114
128
|
},
|
|
115
129
|
onError(error) {
|
package/dist/on-frame.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { VideoTrack } from '@remotion/media-parser';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ConvertMediaOnVideoFrame } from './convert-media';
|
|
3
|
+
import type { ConvertMediaVideoCodec } from './get-available-video-codecs';
|
|
3
4
|
import type { WebCodecsVideoEncoder } from './video-encoder';
|
|
4
|
-
export declare const onFrame: ({ frame, onVideoFrame, videoEncoder,
|
|
5
|
+
export declare const onFrame: ({ frame, onVideoFrame, videoEncoder, track, outputCodec, }: {
|
|
5
6
|
frame: VideoFrame;
|
|
6
7
|
onVideoFrame: ConvertMediaOnVideoFrame | null;
|
|
7
8
|
videoEncoder: WebCodecsVideoEncoder;
|
|
8
|
-
onMediaStateUpdate: ConvertMediaOnMediaStateUpdate | null;
|
|
9
9
|
track: VideoTrack;
|
|
10
|
-
|
|
10
|
+
outputCodec: ConvertMediaVideoCodec;
|
|
11
11
|
}) => Promise<void>;
|
package/dist/on-frame.js
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.onFrame = void 0;
|
|
4
|
-
const
|
|
4
|
+
const convert_to_correct_videoframe_1 = require("./convert-to-correct-videoframe");
|
|
5
|
+
const onFrame = async ({ frame, onVideoFrame, videoEncoder, track, outputCodec, }) => {
|
|
5
6
|
const newFrame = onVideoFrame ? await onVideoFrame({ frame, track }) : frame;
|
|
6
|
-
if (newFrame.codedHeight !== frame.codedHeight) {
|
|
7
|
-
throw new Error(`Returned VideoFrame of track ${track.trackId} has different codedHeight (${newFrame.codedHeight}) than the input frame (${frame.codedHeight})`);
|
|
8
|
-
}
|
|
9
|
-
if (newFrame.codedWidth !== frame.codedWidth) {
|
|
10
|
-
throw new Error(`Returned VideoFrame of track ${track.trackId} has different codedWidth (${newFrame.codedWidth}) than the input frame (${frame.codedWidth})`);
|
|
11
|
-
}
|
|
12
7
|
if (newFrame.displayWidth !== frame.displayWidth) {
|
|
13
8
|
throw new Error(`Returned VideoFrame of track ${track.trackId} has different displayWidth (${newFrame.displayWidth}) than the input frame (${newFrame.displayHeight})`);
|
|
14
9
|
}
|
|
@@ -21,12 +16,17 @@ const onFrame = async ({ frame, onVideoFrame, videoEncoder, onMediaStateUpdate,
|
|
|
21
16
|
if (newFrame.duration !== frame.duration) {
|
|
22
17
|
throw new Error(`Returned VideoFrame of track ${track.trackId} has different duration (${newFrame.duration}) than the input frame (${newFrame.duration}). When calling new VideoFrame(), pass {duration: frame.duration} as second argument`);
|
|
23
18
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
const fixedFrame = (0, convert_to_correct_videoframe_1.convertToCorrectVideoFrame)({
|
|
20
|
+
videoFrame: newFrame,
|
|
21
|
+
outputCodec,
|
|
22
|
+
});
|
|
23
|
+
await videoEncoder.encodeFrame(fixedFrame, fixedFrame.timestamp);
|
|
24
|
+
fixedFrame.close();
|
|
28
25
|
if (frame !== newFrame) {
|
|
29
26
|
frame.close();
|
|
30
27
|
}
|
|
28
|
+
if (fixedFrame !== newFrame) {
|
|
29
|
+
fixedFrame.close();
|
|
30
|
+
}
|
|
31
31
|
};
|
|
32
32
|
exports.onFrame = onFrame;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { LogLevel, VideoTrack } from '@remotion/media-parser';
|
|
2
|
-
import type { ConvertMediaContainer
|
|
2
|
+
import type { ConvertMediaContainer } from './get-available-containers';
|
|
3
|
+
import type { ConvertMediaVideoCodec } from './get-available-video-codecs';
|
|
3
4
|
export type VideoOperation = {
|
|
4
5
|
type: 'reencode';
|
|
5
6
|
videoCodec: ConvertMediaVideoCodec;
|
package/dist/on-video-track.d.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import type { LogLevel, MediaFn, OnVideoTrack } from '@remotion/media-parser';
|
|
2
|
-
import type {
|
|
3
|
-
import type { ConvertMediaOnMediaStateUpdate, ConvertMediaOnVideoFrame, ConvertMediaState } from './convert-media';
|
|
2
|
+
import type { ConvertMediaOnVideoFrame } from './convert-media';
|
|
4
3
|
import Error from './error-cause';
|
|
4
|
+
import type { ConvertMediaContainer } from './get-available-containers';
|
|
5
|
+
import type { ConvertMediaVideoCodec } from './get-available-video-codecs';
|
|
5
6
|
import type { ConvertMediaOnVideoTrackHandler } from './on-video-track-handler';
|
|
6
|
-
|
|
7
|
+
import type { ConvertMediaProgressFn } from './throttled-state-update';
|
|
8
|
+
export declare const makeVideoTrackHandler: ({ state, onVideoFrame, onMediaStateUpdate, abortConversion, controller, defaultVideoCodec, onVideoTrack, logLevel, container, }: {
|
|
7
9
|
state: MediaFn;
|
|
8
10
|
onVideoFrame: null | ConvertMediaOnVideoFrame;
|
|
9
|
-
onMediaStateUpdate: null |
|
|
11
|
+
onMediaStateUpdate: null | ConvertMediaProgressFn;
|
|
10
12
|
abortConversion: (errCause: Error) => void;
|
|
11
|
-
convertMediaState: ConvertMediaState;
|
|
12
13
|
controller: AbortController;
|
|
13
14
|
defaultVideoCodec: ConvertMediaVideoCodec | null;
|
|
14
15
|
onVideoTrack: ConvertMediaOnVideoTrackHandler | null;
|
package/dist/on-video-track.js
CHANGED
|
@@ -14,7 +14,7 @@ const video_decoder_1 = require("./video-decoder");
|
|
|
14
14
|
const video_decoder_config_1 = require("./video-decoder-config");
|
|
15
15
|
const video_encoder_1 = require("./video-encoder");
|
|
16
16
|
const video_encoder_config_1 = require("./video-encoder-config");
|
|
17
|
-
const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortConversion,
|
|
17
|
+
const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortConversion, controller, defaultVideoCodec, onVideoTrack, logLevel, container, }) => async (track) => {
|
|
18
18
|
if (controller.signal.aborted) {
|
|
19
19
|
throw new error_cause_1.default('Aborted');
|
|
20
20
|
}
|
|
@@ -49,8 +49,12 @@ const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortC
|
|
|
49
49
|
timescale: track.timescale,
|
|
50
50
|
codecPrivate: track.codecPrivate,
|
|
51
51
|
});
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate((prevState) => {
|
|
53
|
+
return {
|
|
54
|
+
...prevState,
|
|
55
|
+
decodedVideoFrames: prevState.decodedVideoFrames + 1,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
54
58
|
};
|
|
55
59
|
}
|
|
56
60
|
const videoEncoderConfig = await (0, video_encoder_config_1.getVideoEncoderConfig)({
|
|
@@ -88,8 +92,12 @@ const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortC
|
|
|
88
92
|
timescale: track.timescale,
|
|
89
93
|
codecPrivate: (0, arraybuffer_to_uint8_array_1.arrayBufferToUint8Array)(((_b = (_a = metadata === null || metadata === void 0 ? void 0 : metadata.decoderConfig) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : null)),
|
|
90
94
|
});
|
|
91
|
-
|
|
92
|
-
|
|
95
|
+
onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate((prevState) => {
|
|
96
|
+
return {
|
|
97
|
+
...prevState,
|
|
98
|
+
encodedVideoFrames: prevState.encodedVideoFrames + 1,
|
|
99
|
+
};
|
|
100
|
+
});
|
|
93
101
|
},
|
|
94
102
|
onError: (err) => {
|
|
95
103
|
abortConversion(new error_cause_1.default(`Video encoder of track ${track.trackId} failed (see .cause of this error)`, {
|
|
@@ -99,17 +107,17 @@ const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortC
|
|
|
99
107
|
signal: controller.signal,
|
|
100
108
|
config: videoEncoderConfig,
|
|
101
109
|
logLevel,
|
|
110
|
+
outputCodec: videoOperation.videoCodec,
|
|
102
111
|
});
|
|
103
112
|
const videoDecoder = (0, video_decoder_1.createVideoDecoder)({
|
|
104
113
|
config: videoDecoderConfig,
|
|
105
114
|
onFrame: async (frame) => {
|
|
106
115
|
await (0, on_frame_1.onFrame)({
|
|
107
|
-
convertMediaState,
|
|
108
116
|
frame,
|
|
109
|
-
onMediaStateUpdate,
|
|
110
117
|
track,
|
|
111
118
|
videoEncoder,
|
|
112
119
|
onVideoFrame,
|
|
120
|
+
outputCodec: videoOperation.videoCodec,
|
|
113
121
|
});
|
|
114
122
|
},
|
|
115
123
|
onError: (err) => {
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import type { ConvertMediaContainer } from './get-available-containers';
|
|
2
|
+
export declare const selectContainerCreator: (container: ConvertMediaContainer) => ({ writer, onBytesProgress, onMillisecondsProgress, logLevel, filename, }: import("@remotion/media-parser/dist/create/media-fn").MediaFnGeneratorInput) => Promise<import("@remotion/media-parser").MediaFn>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.selectContainerCreator = void 0;
|
|
4
|
+
const media_parser_1 = require("@remotion/media-parser");
|
|
5
|
+
const selectContainerCreator = (container) => {
|
|
6
|
+
if (container === 'mp4') {
|
|
7
|
+
return media_parser_1.MediaParserInternals.createIsoBaseMedia;
|
|
8
|
+
}
|
|
9
|
+
if (container === 'wav') {
|
|
10
|
+
return media_parser_1.MediaParserInternals.createWav;
|
|
11
|
+
}
|
|
12
|
+
if (container === 'webm') {
|
|
13
|
+
return media_parser_1.MediaParserInternals.createMatroskaMedia;
|
|
14
|
+
}
|
|
15
|
+
throw new Error(`Unsupported container: ${container}`);
|
|
16
|
+
};
|
|
17
|
+
exports.selectContainerCreator = selectContainerCreator;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setRemotionImported = void 0;
|
|
4
|
+
const media_parser_1 = require("@remotion/media-parser");
|
|
5
|
+
// We set the `window.remotion_imported` variable for the sole purpose
|
|
6
|
+
// of being picked up by Wappalyzer.
|
|
7
|
+
// The Wappalyzer Chrome extension is used to detect the technologies
|
|
8
|
+
// used on websites, and it looks for this variable.
|
|
9
|
+
// Remotion is a customer of Wappalyzer and buys a list of domains
|
|
10
|
+
// where Remotion is used from time to time.
|
|
11
|
+
// Remotion uses this data to ensure companies which are required to get
|
|
12
|
+
// a company license for this pacakge are actually doing so.
|
|
13
|
+
const setRemotionImported = () => {
|
|
14
|
+
if (typeof globalThis === 'undefined') {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (globalThis.remotion_imported) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
globalThis.remotion_imported = media_parser_1.VERSION;
|
|
21
|
+
if (typeof window !== 'undefined') {
|
|
22
|
+
window.remotion_imported = `${media_parser_1.VERSION}-webcodecs`;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
exports.setRemotionImported = setRemotionImported;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ConvertMediaOnProgress, ConvertMediaProgress } from './convert-media';
|
|
2
|
+
export type ConvertMediaProgressFn = (state: (prevState: ConvertMediaProgress) => ConvertMediaProgress) => void;
|
|
3
|
+
type ReturnType = {
|
|
4
|
+
get: () => ConvertMediaProgress;
|
|
5
|
+
update: ConvertMediaProgressFn | null;
|
|
6
|
+
stopAndGetLastProgress: () => void;
|
|
7
|
+
};
|
|
8
|
+
export declare const throttledStateUpdate: ({ updateFn, everyMilliseconds, signal, }: {
|
|
9
|
+
updateFn: ConvertMediaOnProgress | null;
|
|
10
|
+
everyMilliseconds: number;
|
|
11
|
+
signal: AbortSignal;
|
|
12
|
+
}) => ReturnType;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.throttledStateUpdate = void 0;
|
|
4
|
+
const throttledStateUpdate = ({ updateFn, everyMilliseconds, signal, }) => {
|
|
5
|
+
let currentState = {
|
|
6
|
+
decodedAudioFrames: 0,
|
|
7
|
+
decodedVideoFrames: 0,
|
|
8
|
+
encodedVideoFrames: 0,
|
|
9
|
+
encodedAudioFrames: 0,
|
|
10
|
+
bytesWritten: 0,
|
|
11
|
+
millisecondsWritten: 0,
|
|
12
|
+
expectedOutputDurationInMs: null,
|
|
13
|
+
overallProgress: 0,
|
|
14
|
+
};
|
|
15
|
+
if (!updateFn) {
|
|
16
|
+
return {
|
|
17
|
+
get: () => currentState,
|
|
18
|
+
update: null,
|
|
19
|
+
stopAndGetLastProgress: () => { },
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
let lastUpdated = null;
|
|
23
|
+
const callUpdateIfChanged = () => {
|
|
24
|
+
if (currentState === lastUpdated) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
updateFn(currentState);
|
|
28
|
+
lastUpdated = currentState;
|
|
29
|
+
};
|
|
30
|
+
const interval = setInterval(() => {
|
|
31
|
+
callUpdateIfChanged();
|
|
32
|
+
}, everyMilliseconds);
|
|
33
|
+
const onAbort = () => {
|
|
34
|
+
clearInterval(interval);
|
|
35
|
+
};
|
|
36
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
37
|
+
return {
|
|
38
|
+
get: () => currentState,
|
|
39
|
+
update: (fn) => {
|
|
40
|
+
currentState = fn(currentState);
|
|
41
|
+
},
|
|
42
|
+
stopAndGetLastProgress: () => {
|
|
43
|
+
clearInterval(interval);
|
|
44
|
+
signal.removeEventListener('abort', onAbort);
|
|
45
|
+
return currentState;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
exports.throttledStateUpdate = throttledStateUpdate;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getVideoEncoderConfig = void 0;
|
|
4
|
+
const browser_quirks_1 = require("./browser-quirks");
|
|
4
5
|
const choose_correct_avc1_profile_1 = require("./choose-correct-avc1-profile");
|
|
5
6
|
const getVideoEncoderConfig = async ({ codec, height, width, fps, }) => {
|
|
6
7
|
if (typeof VideoEncoder === 'undefined') {
|
|
@@ -14,6 +15,7 @@ const getVideoEncoderConfig = async ({ codec, height, width, fps, }) => {
|
|
|
14
15
|
: codec,
|
|
15
16
|
height,
|
|
16
17
|
width,
|
|
18
|
+
bitrate: (0, browser_quirks_1.isSafari)() ? 3000000 : undefined,
|
|
17
19
|
};
|
|
18
20
|
const hardware = {
|
|
19
21
|
...config,
|