76 lines
3.0 KiB
JavaScript
76 lines
3.0 KiB
JavaScript
"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;
|