使用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 图像。
我正在尝试使用 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 图像。