ffmpegでエンコードした動画をそのまま垂れ流すサーバー

More than 1 year has passed since last update.
var express = require('express'),
  spawn = require('child_process').spawn,
  app = express();

app.get('/', function(req, res, next) {
    ffmpeg = spawn('ffmpeg', [
      '-i', 'input.mp4',
      '-vf','scale=320:240',
      '-f', 'mp4', '-movflags', 'frag_keyframe+empty_moov', 'pipe:1'
    ]);

  res.set('Content-Type', 'video/mp4');
  ffmpeg.stdout.pipe(res);
});

app.listen(3000);

これで http://localhost:3000 にアクセスすると、この.jsファイルの同階層にあるinput.mp4ファイルを320x240にサイズ変更した動画が再生されます。

ポイントはffmpegの出力ファイル名にpipe:1を指定すると標準出力にエンコードした結果を書き出すということです。
その出力結果をNode.jsのStream#pipeでそのままHTTPレスポンスとして返しています。

-movflags frag_keyframe+empty_moov についてはよくわかりませんが、mp4形式で出力をパイプするのに必要なオプションです。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.