2012-01-10 9 views
12

Sto provando a scrivere un server nodejs che richiederà un input temporale (probabilmente parte del percorso url) e quindi fornirà una foto del frame video in quel momento come immagine jpeg.Come si ottiene lo snapshot di un video in nodejs?

Posso farlo facilmente in semplice Javascript, ma non riesco a vedere un modo per farlo in nodejs. So che probabilmente avrò bisogno di usare un plugin canvas come node-canvas per fare lo snapshot.

Tutte le idee sono benvenute.

Quello che segue è 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> 
+2

Node.js non ha lo strumento di elaborazione video e non è consigliabile elaborare video tramite applicazione web. Se si desidera elaborare il video sul lato server, è necessario uno strumento appropriato per questo e qualche realizzazione della coda (forse sul nodo) per esso. –

risposta

26

node-fluent-ffmpeg ha una bella funzione di 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') 
    }); 
+0

Mi piacerebbe provare questo, sembra più elegante di exec ffmpeg, tuttavia non riesco a ottenere npm per installarlo o altro al momento: S – MYR

+0

npm install fluent-ffmpeg npm http GET https://registry.npmjs.org/fluent-ffmpeg npm ERR! Errore: impossibile recuperare dal registro: fluent-ffmpeg ... Questo è l'errore che ottengo, le impostazioni proxy controllate ecc. Tutto bene! :( – MYR

+0

Allora prova a risolvere il problema con npm perché è decisamente meglio avere tutti i moduli in userland disponibili che dover reinventare la ruota – fent

1

come '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). È necessario installare FFMPEG prima di poter utilizzare questo codice, here è un 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); 

}); 
0

Per questo è possibile utilizzare il modulo node-fluent-ffmpeg. Dovrai 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' 
    }); 
Problemi correlati