UNPKG

sp-streams

Version:

Streamplace Streams for Piping Video Around and Stuff

96 lines (80 loc) 2.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.killall = killall; exports.framehash = framehash; exports.default = ffmpeg; var _fluentFfmpeg = require("fluent-ffmpeg"); var _fluentFfmpeg2 = _interopRequireDefault(_fluentFfmpeg); var _debug = require("debug"); var _debug2 = _interopRequireDefault(_debug); var _fsExtra = require("fs-extra"); var _fsExtra2 = _interopRequireDefault(_fsExtra); var _tmpPromise = require("tmp-promise"); var _tmpPromise2 = _interopRequireDefault(_tmpPromise); var _crypto = require("crypto"); var _crypto2 = _interopRequireDefault(_crypto); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var log = (0, _debug2.default)("sp:ffmpeg"); var allFfmpegs = []; function killall() { allFfmpegs.forEach(function (proc) { return proc.kill(); }); allFfmpegs = []; } /** * Get a hash of all the frame content of a file. Useful for ensuring stuff is unchanged after * muxing. */ function framehash(path) { var tmpPath = void 0; return _tmpPromise2.default.file().then(function (o) { tmpPath = o.path; return new Promise(function (resolve, reject) { var hasher = ffmpeg().input(path).inputFormat("mpegts").outputFormat("framehash").output(tmpPath); hasher.run(); hasher.on("error", reject); hasher.on("end", resolve); }); }).then(function () { return _fsExtra2.default.readFile(tmpPath, "utf8"); }).then(function (data) { return _crypto2.default.createHash("sha256").update(data).digest("hex"); }); } function ffmpeg() { var logCounter = 0; var thisFfmpeg = (0, _fluentFfmpeg2.default)().on("error", function (err, stdout, stderr) { if (err.toString() === "Error: ffmpeg was killed with signal SIGKILL") { return; } log("ffmpeg error", { err: err.toString() }); log(stdout); log(stderr); }).on("codecData", function (data) { log("ffmpeg codecData", data); }).on("end", function () { log("ffmpeg end"); allFfmpegs = allFfmpegs.filter(function (x) { return x !== thisFfmpeg; }); }).on("progress", function (data) { if (logCounter === 0) { log("[" + data.timemark + "] " + data.currentFps + "FPS " + data.currentKbps + "Kbps"); } logCounter = (logCounter + 1) % 15; }).on("start", function (command) { var sanitizedCommand = command; log("ffmpeg start: " + sanitizedCommand); // thisFfmpeg.ffmpegProc.stdout.on("data", data => { // log(data.toString()); // }); // thisFfmpeg.ffmpegProc.stderr.on("data", data => { // log(data.toString()); // }); }); allFfmpegs.push(thisFfmpeg); return thisFfmpeg; }