FFmpeg通过Nodejs将流媒体webm视频传输到多个http客户端

时间:2017-10-11 08:32:34

标签: node.js express ffmpeg streaming webm

我正在尝试通过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);
};

它适用于一个客户端,但我无法同时流式传输到多个客户端(可能与丢失的关键帧有关)。

0 个答案:

没有答案