UNPKG

@remotion/renderer

Version:

Render Remotion videos using Node.js or Bun

128 lines (127 loc) 5.03 kB
"use strict"; 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;