Come posso ottenere un’istantanea di un video in nodejs?

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.

Posso farlo facilmente in un 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.

Qualche idea benvenuta.

Il seguente è come lo faccio in Javascript al momento:

myjavascript.js

    function capture(video, scaleFactor) { if(scaleFactor == null){ scaleFactor = 1; } var w = video.videoWidth * scaleFactor; var h = video.videoHeight * scaleFactor; stdout("
    w: "+ w+ "
    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

       video snap    

    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') }); 

    Dato che “node-fluent-ffmpeg” non funzionava per me per qualche motivo, l’ho capito da solo – basato sul codice del video-pollice (che non funzionava anche per me). È necessario installare FFMPEG prima di poter utilizzare questo codice, ecco 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); }); 

    Puoi usare il modulo node-fluent-ffmpeg per questo. Dovrai installare ffmpeg; su MacOS, installa Homebrew quindi usa 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' });