我正在尝试通过ExpressJS服务器共享屏幕的实时流。 出于性能原因,我无法将ffmpeg输出保存到文件或启动多个ffmpeg实例。 我目前的解决方案是管道ffmpeg的stdout并将其流式传输到每个连接的客户端。
index.js
const express = require('express');
const app = express();
const request = require('request');
const FFmpeg = require('./FFmpeg');
const APP_PORT = 3500;
app.get('/stream', function (req, res) {
const recorder = FFmpeg.getInstance();
res.writeHead(200, {
"content-type": "video/webm",
});
recorder.stdout.on('data', res.write);
req.on('close', FFmpeg.killInstance);
});
app.listen(APP_PORT, function () {
console.log(`App is listening on port ${APP_PORT}!`)
});
FFmpeg.js
const spawn = require('child_process').spawn;
const ffmpegPath = 'ffmpeg';
const ffmpegOptions = [
'-loglevel', 'panic',
'-y',
'-f',
'alsa',
'-ac',
'2',
'-i',
'pulse',
'-f',
'x11grab',
'-r',
'25',
'-i',
':0.0+0,0',
'-acodec',
'libvorbis',
'-preset',
'ultrafast',
'-vf',
'scale=320:-1',
"-vcodec", "libvpx-vp9",
'-f', 'webm',
'pipe:1',
];
module.exports = {
start,
getInstance,
killInstance,
};
let instance = null;
let connections = 0;
function killInstance() {
connections -= 1;
if (connections < 1) {
instance.kill();
instance = null;
}
};
function getInstance() {
connections += 1;
if (!instance) instance = start();
return instance;
};
function start() {
return spawn(ffmpegPath, ffmpegOptions);
};
它适用于一个客户端,但我无法同时流式传输到多个客户端(可能与丢失的关键帧有关)。