framo
Version:
Glorious media processing right in your browser with Typescript support
57 lines • 2.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FilmstripService = void 0;
const tslib_1 = require("tslib");
const utility_1 = require("../utility/utility");
const ffmpeg_service_1 = require("./ffmpeg.service");
class FilmstripService {
constructor() {
this.ffmpegService = ffmpeg_service_1.FfmpegService.getInstance();
this.makeFilmstrip = (config) => tslib_1.__awaiter(this, void 0, void 0, function* () {
try {
const fileBlob = yield this.ffmpegService.fetchFile(config.filename, config.file);
const mediainfo = yield this.ffmpegService.getMediaInfo(fileBlob);
const { parameters, outputFilename } = this.getParameters(config, mediainfo);
yield this.ffmpegService.ffmpeg.run(...parameters);
const data = this.ffmpegService.ffmpeg.FS("readFile", outputFilename);
return new Blob([data.buffer]);
}
catch (error) {
throw new Error(error);
}
});
this.getParameters = (config, mediainfo) => {
const auxillaryParameters = ["-y"];
const parametersResponse = this.getTimeIntervalBasedParameters(config, mediainfo);
const response = {
parameters: [...parametersResponse.parameters, ...auxillaryParameters],
outputFilename: parametersResponse.outputFilename,
};
return response;
};
this.getTimeIntervalBasedParameters = (config, mediainfo) => {
const outputFilename = utility_1.Utility.getOutputFilename(1, config.outputExtension);
const duration = utility_1.Utility.getVideoDuration(mediainfo);
const totalFramesInFilmstrip = Math.floor(duration / config.timeInterval);
const selectTime = `select=not(mod(n\\,${config.timeInterval})),`;
const scale = config.resolution ? `${utility_1.Utility.getScale(config.resolution)},` : '';
const tiles = utility_1.Utility.getFilmstripTileString(totalFramesInFilmstrip, config);
const vfString = `${selectTime}${scale}${tiles}`;
const inParameters = ['-i', config.filename, '-frames', '1', '-vf', vfString];
const outParameters = [outputFilename];
const response = {
parameters: [...inParameters, ...outParameters],
outputFilename,
};
return response;
};
}
static getInstance() {
if (!FilmstripService.instance) {
FilmstripService.instance = new FilmstripService();
}
return FilmstripService.instance;
}
}
exports.FilmstripService = FilmstripService;
//# sourceMappingURL=filmstrip.service.js.map