2012-01-10 14 views
12

Estoy tratando de escribir un servidor nodejs que tomará una entrada de tiempo (posiblemente parte de la ruta url) y luego proporciono una imagen fija del fotograma de video en ese momento como una imagen JPEG.¿Cómo obtengo una instantánea de un video en nodejs?

Puedo hacer esto fácilmente en Javascript, pero no veo la manera de hacerlo en nodejs. Sé que probablemente necesite usar un complemento de canvas como node-canvas para hacer la instantánea.

Cualquier idea bienvenida.

El siguiente es cómo lo hago en Javascript en la actualidad

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 no tiene herramienta de procesamiento de video y no se recomienda procesar video por aplicación web. Si desea procesar el video en el lado del servidor, necesita una herramienta adecuada para eso y cierta realización de cola (tal vez en el nodo) para ello. –

Respuesta

26

node-fluent-ffmpeg tiene una buena función 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

Me encantaría probar esto, parece más elegante que exec ffmpeg, pero no puedo conseguir npm para instalarlo o cualquier otra cosa en este momento: S – MYR

+0

npm instalar fluent-ffmpeg npm http GET https://registry.npmjs.org/fluent-ffmpeg npm ERR! Error: no se pudo recuperar desde el registro: fluent-ffmpeg ... Este es el error que recibo, comprobé la configuración del proxy, etc., todo bien! :( – MYR

+0

Bueno, entonces intenta solucionar ese problema con npm porque definitivamente es mejor tener todos los módulos en el dominio de usuario disponibles que tener que reinventar la rueda. – fent

1

Como 'nodo fluidez-ffmpeg' no no funcionaba para mí por alguna razón, me di cuenta de esto a mí mismo - basado en el código de video-thumb (que también no funcionaba para mí). Necesita instalar FFMPEG antes de poder usar este código, here es un tutorial sobre cómo hacerlo para 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

Puede utilizar el módulo node-fluent-ffmpeg para esto. Necesitarás instalar ffmpeg; en MacOS, instale Homebrew y luego use el 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' 
    }); 
Cuestiones relacionadas