sp-streams
Version:
Streamplace Streams for Piping Video Around and Stuff
96 lines (80 loc) • 2.7 kB
JavaScript
;
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;
}