Domanda

Sto cercando di scrivere un server di nodejs che avrà un ingresso di tempo (forse parte del percorso URL) e quindi fornire un fermo del fotogramma video in quel indice temporale come immagine jpeg.

posso farlo facilmente in pianura Javascript, ma non posso vedere un modo per fare questo in nodejs. So che probabilmente ho bisogno di utilizzare un plugin di tela come nodo-tela per fare lo snapshot.

Tutte le idee di benvenuto.

Di seguito è come lo faccio in Javascript in questo momento:

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>
È stato utile?

Soluzione

nodo-fluente-ffmpeg ha una funzione bella 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')
  });

Altri suggerimenti

'nodo-fluente-ffmpeg' non è stato non funziona per me, per qualche motivo, ho pensato che questo io stesso - in base al codice di video-thumb (che pure non stava lavorando per me). Si ha bisogno di installare FFMPEG prima di poter utilizzare questo codice, qui IS tutorial su come farlo per 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);

});

È possibile utilizzare la nodo-fluente-ffmpeg modulo per questo. È necessario installare ffmpeg; su MacOS, installare Homebrew quindi utilizzare il comando 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'
  });
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top