@remotion/renderer
Version:
Render Remotion videos using Node.js or Bun
73 lines (72 loc) • 2.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.calculateAssetPositions = void 0;
const filter_asset_types_1 = require("../filter-asset-types");
const resolve_asset_src_1 = require("../resolve-asset-src");
const flatten_volume_array_1 = require("./flatten-volume-array");
const types_1 = require("./types");
const areEqual = (a, b) => {
return a.id === b.id;
};
const findFrom = (target, renderAsset) => {
const index = target.findIndex((a) => areEqual(a, renderAsset));
if (index === -1) {
return false;
}
target.splice(index, 1);
return true;
};
const copyAndDeduplicateAssets = (renderAssets) => {
const onlyAudioAndVideo = (0, filter_asset_types_1.onlyAudioAndVideoAssets)(renderAssets);
const deduplicated = [];
for (const renderAsset of onlyAudioAndVideo) {
if (!deduplicated.find((d) => d.id === renderAsset.id)) {
deduplicated.push(renderAsset);
}
}
return deduplicated;
};
const calculateAssetPositions = (frames) => {
var _a, _b;
const assets = [];
const flattened = frames.flat(1);
for (let frame = 0; frame < frames.length; frame++) {
const prev = copyAndDeduplicateAssets((_a = frames[frame - 1]) !== null && _a !== void 0 ? _a : []);
const current = copyAndDeduplicateAssets(frames[frame]);
const next = copyAndDeduplicateAssets((_b = frames[frame + 1]) !== null && _b !== void 0 ? _b : []);
for (const asset of current) {
if (!findFrom(prev, asset)) {
assets.push({
src: (0, resolve_asset_src_1.resolveAssetSrc)((0, types_1.uncompressMediaAsset)(flattened, asset).src),
type: asset.type,
duration: null,
id: asset.id,
startInVideo: frame,
trimLeft: asset.mediaFrame,
volume: [],
playbackRate: asset.playbackRate,
toneFrequency: asset.toneFrequency,
audioStartFrame: asset.audioStartFrame,
audioStreamIndex: asset.audioStreamIndex,
});
}
const found = assets.find((a) => a.duration === null && areEqual(a, asset));
if (!found)
throw new Error('something wrong');
if (!findFrom(next, asset)) {
// Duration calculation:
// start 0, range 0-59:
// 59 - 0 + 1 ==> 60 frames duration
found.duration = frame - found.startInVideo + 1;
}
found.volume = [...found.volume, asset.volume];
}
}
for (const asset of assets) {
if (asset.duration === null) {
throw new Error('duration is unexpectedly null');
}
}
return assets.map((a) => (0, flatten_volume_array_1.convertAssetToFlattenedVolume)(a));
};
exports.calculateAssetPositions = calculateAssetPositions;