2012-01-10 14 views
12

Zaman girdisi (muhtemelen URL yolunun bir kısmı) alacak ve daha sonra bir jpeg resmi olarak o zaman dizisindeki video karesini sağlayabilecek bir nodejs sunucusu yazmaya çalışıyorum.Düğümlerde videonun anlık görüntüsünü nasıl alabilirim?

Bunu basit bir Javascript ile kolayca yapabilirim, ancak bunu nodejs'de yapmanın bir yolunu göremiyorum. Sanırım enstantane yapmak için düğüm tuvali gibi bir tuval eklentisi kullanmam gerekecek.

Herhangi bir fikir kabul edilir.

aşağıdaki

şu anda JavaScript böyle yaparız:

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 video işleme aracına sahip değildir ve web uygulaması tarafından video işlenmesi önerilmez. Videoyu sunucu tarafında işlemek istiyorsanız, bunun için uygun bir araç ve bunun için bazı sıra gerçekleştirme (belki de düğümünde) gerekir. –

cevap

26

node-fluent-ffmpeg güzel takeScreenshots işlevi vardır. (Aynı zamanda benim için çalışma değildi) video-thumb ait koduna göre - 'düğüm-akıcı-ffmpeg' olarak

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

Bunu denemek isterim, exec ffmpeg'den daha zarif görünüyor, ancak şu anda onu yüklemek için npm alamıyorum: S – MYR

+0

npm install fluent-ffmpeg npm http GET https://registry.npmjs.org/fluent-ffmpeg npm ERR! Hata: kayıt defterinden getirilemedi: fluent-ffmpeg ... Bu aldığım hata, proxy ayarlarını vb. :( – MYR

+0

Peki o zaman bu sorunu npm ile düzeltmeye çalışın çünkü kullanıcı arayüzündeki tüm modülleri tekerleği yeniden icat etmek zorunda kalmadan kullanmak daha iyidir. – fent

1

nedense benim için çalışmıyor değildi, kendimi bu anladım. Bu kodu kullanabilmeniz için önce FFMPEG yüklemeniz gerekiyor, here Mac için nasıl yapılacağı ile ilgili öğreticidir.

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

Bunun için node-fluent-ffmpeg modülünü kullanabilirsiniz. Ffmpeg yüklemeniz gerekecek; MacOS'ta Homebrew'u yükleyin ve brew install ffmpeg komutunu kullanın.

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