在NodeJS中以高帧速率记录和处理屏幕捕获

时间:2018-04-02 08:24:08

标签: node.js

如标题所述,我希望每秒捕获60次屏幕并通过nodejs函数运行它。

npm上的大多数库只保存到磁盘。

我尝试使用robotjs截取屏幕截图,但只获得了11fps。

我尝试启动RTMP服务器并使用OBS但延迟了。

我在世界上做什么?

2 个答案:

答案 0 :(得分:9)

您可以使用ffmpeg达到60fps。请查看ffmpeg docs,了解更多详细信息。

const ffmpeg = require("ffmpeg-static").path;
const { spawn } = require("child_process");

const process = spawn(
    ffmpeg,
  ["-probesize", "10M", "-f", "gdigrab", "-framerate", "60", "-i", "desktop", "-f", "flv", "-"],
  { stdio: "pipe" }
);
const stream = process.stdout;

这里有视频流。进行处理。

例如,您可以将流写入可写流

const { createWriteStream } = require("fs");

const file = createWriteStream("capture.flv");
stream.pipe(file);

或者您可以订阅大量数据并进行一些处理

stream.on("data", chunk => {
  console.log(chunk);
});

有关Node.JS streams

的更多信息

注意:

此示例仅适用于Windows用户。 Mac和Linux用户应按照ffmpeg文档中的说明更改用于产生该过程的ffmpeg选项。

答案 1 :(得分:3)

您最好的选择可能是使用特定于平台的API创建一个执行捕获的本机进程,然后将其包装在NAN(节点的本机抽象:https://github.com/nodejs/nan)中。有一些学习曲线,但还不错。我已经建立了解码JPEG,对其进行处理以及以h.264进行编码的系统。

因为您可以在本机级别上控制捕获,所以可以创建任何您喜欢的界面来将屏幕抓图带入Node。例如,您可能要避免在本机javascript界面​​上封送图像,而是维护它们的句柄,而仅在需要时才拉图像。

然后,您可以将其全部转换为一个很酷的npm模块,并受到所有人的喜爱。