UNPKG

sp-streams

Version:

Streamplace Streams for Piping Video Around and Stuff

59 lines (52 loc) 1.61 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = constantFpsStream; var _mpegMungerStream = require("./mpeg-munger-stream"); var _mpegMungerStream2 = _interopRequireDefault(_mpegMungerStream); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Takes in a mpegts stream and emits e.g. 30 frames per real-time second. Like * ffmpeg's "-re" flag. * @param {{fps}} fps */ function constantFpsStream() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, fps = _ref.fps; if (typeof fps !== "number") { throw new Error(fps + " is not a valid fps"); } var mpegMunger = (0, _mpegMungerStream2.default)(); var frames = 0; var firstFrameTime = void 0; mpegMunger.on("pts", function (_ref2) { var pts = _ref2.pts, streamId = _ref2.streamId; if (!(0, _mpegMungerStream.streamIsVideo)(streamId)) { return; } if (!firstFrameTime) { firstFrameTime = Date.now(); } frames += 1; check(); }); var check = function check() { if (firstFrameTime === undefined) { return; } var expectedFrames = Math.ceil((Date.now() - firstFrameTime) / 1000 * fps); // console.log(`Expected ${expectedFrames}, found ${frames}`); if (expectedFrames > frames) { mpegMunger.resume(); } else if (expectedFrames < frames) { mpegMunger.pause(); } }; var interval = setInterval(check, 250); mpegMunger.on("end", function () { clearInterval(interval); }); return mpegMunger; }