@remotion/renderer
Version:
Render Remotion videos using Node.js or Bun
76 lines (75 loc) • 3.09 kB
JavaScript
;
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;