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