web-dev-qa-db-ja.com

nodejsでビデオのスナップショットを取得するにはどうすればよいですか?

時間入力(おそらくURLパスの一部)を取り、その時間インデックスでのビデオフレームの静止画をjpeg画像として提供するnodejsサーバーを作成しようとしています。

プレーンなJavascriptでこれを簡単に行うことができますが、nodejsでこれを行う方法がわかりません。スナップショットを作成するには、おそらくnode-canvasのようなキャンバスプラグインを使用する必要があることはわかっています。

どんなアイデアでも大歓迎です。

以下は、現時点でJavascriptでそれを行う方法です。

myjavascript.js

function capture(video, scaleFactor) {
    if(scaleFactor == null){
        scaleFactor = 1;
    }
    var w = video.videoWidth * scaleFactor;
    var h = video.videoHeight * scaleFactor;
    stdout("<br/> w: "+ w+ "<br/> h: "+ h);
    var canvas = document.createElement('canvas');
        canvas.width  = w;
        canvas.height = h;
    var ctx = canvas.getContext('2d');
        ctx.drawImage(video, 0, 0, w, h);
    return canvas;
}

function shoot(){
 var video  = document.getElementById("videoTag");
 var output = document.getElementById("output");
 var canvas = capture(video, 1);
 output.innerHTML = '';
 output.appendChild(canvas);
}

index.html

<html>
<head>
    <title>video snap</title>   
    <script type="text/javascript" src="myjavascript.js"></script>
</head>
<body>

<div id="video_container" >
        <video id="videoTag" width="640" height="360" autobuffer="" controls="true">
            <source src="frozenplanet.mp4" type="video/mp4">
            <source src="frozenplanet.ogv" type="video/ogg">
        </video>
</div>

<div id="output"></div>

</body>
</html>
16
MYR

node-fluent-ffmpeg にはNice takeScreenshots関数があります。

var proc = new ffmpeg('/path/to/your_movie.avi')
  .takeScreenshots({
      count: 1,
      timemarks: [ '600' ] // number of seconds
    }, '/path/to/thumbnail/folder', function(err) {
    console.log('screenshots were saved')
  });
36
fent

'node-fluent-ffmpeg'が何らかの理由で機能していなかったので、私はこれを自分で理解しました video-thumb のコードに基づいて(これも私のために機能していませんでした) 。このコードを使用する前にFFMPEGをインストールする必要があります。 ここ はMacでインストールする方法のチュートリアルです。

var path = require('path'), // Default node module
    pathToFile = path.join(__dirname, 'folder', 'file.mov'),
    pathToSnapshot = path.join(__dirname, 'folder', 'file-snapshot.jpg');

// Also a default node module
require('child_process').exec(('ffmpeg -ss 00:00:25 -i ' + pathToFile + ' -vframes 1 -q:v 2 ' + pathToSnapshot), function () {

    console.log('Saved the thumb to:', pathToSnapshot);

});
3

これには node-fluent-ffmpeg モジュールを使用できます。 ffmpegをインストールする必要があります。 MacOSでは、 Homebrew をインストールしてから、brew install ffmpegコマンドを使用します。

var ffmpeg = require('fluent-ffmpeg');

ffmpeg('/path/to/video.mp4')
  .on('end', function() {
    console.log('Screenshots taken');
  })
  .on('error', function(err) {
    console.error(err);
  })
  .screenshots({
    // Will take screenshots at 20%, 40%, 60% and 80% of the video
    count: 4,
    folder: '/path/to/output'
  });
2