2012-01-10 12 views
12

Próbuję napisać serwer nodejs, który zajmie trochę czasu (prawdopodobnie część ścieżki URL), a następnie udostępnić klatkę wideo w tym indeksie czasu jako obraz jpeg.Jak uzyskać migawkę wideo w Nodejs?

Mogę to zrobić z łatwością w prostym JavaScript, ale nie widzę sposobu, aby to zrobić w nodejs. Wiem, że prawdopodobnie będę musiał użyć plugin canvas, jak węzeł-canvas, aby zrobić migawkę.

Wszelkie pomysły mile widziane.

Oto jak to zrobić w JavaScript w tej chwili:

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 nie ma narzędzia do przetwarzania wideo i nie zaleca się przetwarzania wideo przez aplikację internetową. Jeśli chcesz przetwarzać wideo po stronie serwera, potrzebujesz odpowiedniego narzędzia do tego i niektórych realizacji kolejki (być może w węźle). –

Odpowiedz

26

node-fluent-ffmpeg ma ładny takeScreenshots funkcję.

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

Chciałbym spróbować tego, wydaje się bardziej elegancki niż exec ffmpeg, jednak nie mogę uzyskać npm, aby go zainstalować lub cokolwiek innego w tej chwili: S – MYR

+0

npm zainstalować fluent-ffmpeg npm http GET https://registry.npmjs.org/fluent-ffmpeg npm ERR! Błąd: nie udało się pobrać z rejestru: fluent-ffmpeg ... To jest błąd, który dostaję, sprawdzone ustawienia proxy itp. Wszystko w porządku! :( – MYR

+0

A więc spróbuj rozwiązać ten problem z npm, ponieważ zdecydowanie lepiej mieć wszystkie moduły dostępne w przestrzeni użytkownika niż konieczność ponownego odkrywania koła – fent

1

jako „węzłów biegle-ffmpeg” nie nie działa na mnie z jakiegoś powodu, I zdobione ten sam - na podstawie kodeksu video-thumb (który też nie pracował dla mnie). Musisz zainstalować FFMPEG zanim będziesz mógł użyć tego kodu, here jest tutorialem, jak to zrobić dla 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

Możesz użyć do tego modułu node-fluent-ffmpeg. Musisz zainstalować ffmpeg; w systemie MacOS zainstaluj Homebrew, a następnie użyj polecenia 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' 
    }); 
Powiązane problemy