UNPKG

@remotion/renderer

Version:

Render Remotion videos using Node.js or Bun

76 lines (75 loc) 3.09 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.combineVideoStreams = void 0; const fs_1 = require("fs"); const path_1 = require("path"); const version_1 = require("remotion/version"); const call_ffmpeg_1 = require("./call-ffmpeg"); const convert_number_of_gif_loops_to_ffmpeg_1 = require("./convert-number-of-gif-loops-to-ffmpeg"); const logger_1 = require("./logger"); const parse_ffmpeg_progress_1 = require("./parse-ffmpeg-progress"); const truthy_1 = require("./truthy"); const combineVideoStreams = async ({ fps, codec, filelistDir, numberOfGifLoops, output, indent, logLevel, onProgress, files, addRemotionMetadata, binariesDirectory, cancelSignal, }) => { var _a; const fileList = files.map((p) => `file '${p}'`).join('\n'); const fileListTxt = (0, path_1.join)(filelistDir, 'video-files.txt'); (0, fs_1.writeFileSync)(fileListTxt, fileList); const encoder = codec === 'gif' ? 'gif' : 'copy'; const command = [ '-hide_banner', '-r', String(fps), '-f', 'concat', '-safe', '0', '-i', fileListTxt, numberOfGifLoops === null ? null : '-loop', numberOfGifLoops === null ? null : (0, convert_number_of_gif_loops_to_ffmpeg_1.convertNumberOfGifLoopsToFfmpegSyntax)(numberOfGifLoops), codec === 'gif' ? '-filter_complex' : null, codec === 'gif' ? 'split[v],palettegen,[v]paletteuse' : null, '-an', '-c:v', encoder, codec === 'h265' ? '-tag:v' : null, codec === 'h265' ? 'hvc1' : null, addRemotionMetadata ? `-metadata` : null, addRemotionMetadata ? `comment=Made with Remotion ${version_1.VERSION}` : null, '-y', output, ].filter(truthy_1.truthy); const doesReencode = encoder !== 'copy'; const startTime = Date.now(); logger_1.Log.verbose({ indent, logLevel }, `Combining video ${doesReencode ? 'with reencoding' : 'without reencoding'}, command: ${command.join(' ')}`); try { const task = (0, call_ffmpeg_1.callFf)({ args: command, bin: 'ffmpeg', indent, logLevel, binariesDirectory, cancelSignal, }); (_a = task.stderr) === null || _a === void 0 ? void 0 : _a.on('data', (data) => { const parsed = (0, parse_ffmpeg_progress_1.parseFfmpegProgress)(data.toString('utf8'), fps); if (parsed === undefined) { logger_1.Log.verbose({ indent, logLevel }, data.toString('utf8')); } else { logger_1.Log.verbose({ indent, logLevel }, `Encoded ${parsed} video frames`); onProgress(parsed); } }); await task; logger_1.Log.verbose({ indent, logLevel }, `Finished combining video in ${Date.now() - startTime}ms`); return output; } catch (e) { (0, fs_1.rmSync)(fileListTxt, { recursive: true }); throw e; } }; exports.combineVideoStreams = combineVideoStreams;