@remotion/renderer
Version:
Render Remotion videos using Node.js or Bun
128 lines (127 loc) • 5.03 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createAudio = void 0;
const path_1 = __importDefault(require("path"));
const calculate_asset_positions_1 = require("./assets/calculate-asset-positions");
const convert_assets_to_file_urls_1 = require("./assets/convert-assets-to-file-urls");
const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
const compress_audio_1 = require("./compress-audio");
const delete_directory_1 = require("./delete-directory");
const logger_1 = require("./logger");
const merge_audio_track_1 = require("./merge-audio-track");
const audio_codec_1 = require("./options/audio-codec");
const preprocess_audio_track_1 = require("./preprocess-audio-track");
const truthy_1 = require("./truthy");
const createAudio = async ({ assets, onDownload, fps, logLevel, onProgress, downloadMap, remotionRoot, indent, binariesDirectory, audioBitrate, audioCodec, cancelSignal, chunkLengthInSeconds, trimLeftOffset, trimRightOffset, forSeamlessAacConcatenation, }) => {
const fileUrlAssets = await (0, convert_assets_to_file_urls_1.convertAssetsToFileUrls)({
assets,
onDownload: onDownload !== null && onDownload !== void 0 ? onDownload : (() => () => undefined),
downloadMap,
indent,
logLevel,
binariesDirectory,
});
(0, download_and_map_assets_to_file_1.markAllAssetsAsDownloaded)(downloadMap);
const assetPositions = (0, calculate_asset_positions_1.calculateAssetPositions)(fileUrlAssets);
logger_1.Log.verbose({ indent, logLevel, tag: 'audio' }, 'asset positions', JSON.stringify(assetPositions));
const preprocessProgress = new Array(assetPositions.length).fill(0);
let mergeProgress = 0;
let compressProgress = 0;
const updateProgress = () => {
const preprocessProgressSum = preprocessProgress.length === 0
? 1
: preprocessProgress.reduce((a, b) => a + b, 0) / assetPositions.length;
const totalProgress = preprocessProgressSum * 0.7 +
mergeProgress * 0.1 +
compressProgress * 0.2;
onProgress(totalProgress);
};
const audioTracks = await Promise.all(assetPositions.map(async (asset, index) => {
const filterFile = path_1.default.join(downloadMap.audioMixing, `${index}.wav`);
const result = await (0, preprocess_audio_track_1.preprocessAudioTrack)({
outName: filterFile,
asset,
fps,
downloadMap,
indent,
logLevel,
binariesDirectory,
cancelSignal,
onProgress: (progress) => {
preprocessProgress[index] = progress;
updateProgress();
},
chunkLengthInSeconds,
trimLeftOffset,
trimRightOffset,
forSeamlessAacConcatenation,
audioStreamIndex: asset.audioStreamIndex,
});
preprocessProgress[index] = 1;
updateProgress();
return result;
}));
await downloadMap.inlineAudioMixing.finish({
indent,
logLevel,
binariesDirectory,
cancelSignal,
});
const inlinedAudio = downloadMap.inlineAudioMixing.getListOfAssets();
const preprocessed = [
...audioTracks.filter(truthy_1.truthy),
...inlinedAudio.map((asset) => ({
outName: asset,
filter: {
filter: null,
pad_start: null,
pad_end: null,
},
})),
];
const merged = path_1.default.join(downloadMap.audioPreprocessing, 'merged.wav');
const extension = (0, audio_codec_1.getExtensionFromAudioCodec)(audioCodec);
const outName = path_1.default.join(downloadMap.audioPreprocessing, `audio.${extension}`);
await (0, merge_audio_track_1.mergeAudioTrack)({
files: preprocessed,
outName: merged,
downloadMap,
remotionRoot,
indent,
logLevel,
binariesDirectory,
cancelSignal,
fps,
onProgress: (progress) => {
mergeProgress = progress;
updateProgress();
},
chunkLengthInSeconds,
});
await (0, compress_audio_1.compressAudio)({
audioBitrate,
audioCodec,
binariesDirectory,
indent,
logLevel,
inName: merged,
outName,
cancelSignal,
chunkLengthInSeconds,
fps,
onProgress: (progress) => {
compressProgress = progress;
updateProgress();
},
});
(0, delete_directory_1.deleteDirectory)(merged);
(0, delete_directory_1.deleteDirectory)(downloadMap.audioMixing);
preprocessed.forEach((p) => {
(0, delete_directory_1.deleteDirectory)(p.outName);
});
return outName;
};
exports.createAudio = createAudio;