使用FFMPEG在节点中处理屏幕录制的帧

Processing Frames of Screen Recording in Node Usin FFMPEG

我正在尝试使用 Node.JS 和 FFMPEG 捕获我的屏幕,我已经保存了一个 flv 文件,但我无法实时处理帧。

到目前为止我的代码是

const ffmpeg = require('ffmpeg-static');
const {spawn} = require('child_process');
const {createWriteStream} = require('fs');

const canvas = document.querySelector('#canvas');
const ctx = canvas.getContext('2d');

const process = spawn(
  ffmpeg,
  ["-f", "gdigrab", "-framerate", "30", "-i", "desktop", '-crf', '0', '-preset', 'ultrafast', '-f', 'flv', '-'],
  { stdio: "pipe" }
);


const stream = process.stdout;

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

stream.on('data', chunk => {
  const base64 = chunk.toString('base64');
  const data = `data:image/png;base64,${base64}`;

  const image = new Image();
  image.src = data;
  ctx.drawImage(image, 0, 0);
});

创建的 output.flv 文件没有问题,但在流中创建的图像似乎不是有效图像。当我记录 base64 并尝试将单个字符串转换为图像时,它似乎是无效的图像数据。我想使用流来捕获流的每一帧。

我找到了解决办法。将 -f 标志从 flv 更改为 mjpeg 就可以了。这将它作为一系列 jpeg 图像进行流式传输,因此可以将块转换为 base64 字符串,然后转换为 jpg 图像。