2012-10-29 2 views
6

cerco di creare un video miniatura con fluente-ffmpeg qui è il mio codicefluente-ffmpeg errore di creazione delle miniature

var ffmpeg = require('fluent-ffmpeg'); 

exports.thumbnail = function(){ 
    var proc = new ffmpeg({ source: 'Video/express2.mp4',nolog: true }) 
    .withSize('150x100') 
    .takeScreenshots({ count: 1, timemarks: [ '00:00:02.000' ] }, 'Video/', function(err, filenames) { 
    console.log(filenames); 
    console.log('screenshots were saved'); 
    }); 
} 

ma continuo a ricevere questo errore

"mate data contains no duration, aborting screenshot creation" 

idea del perché,

proposito del mattino sulle finestre, e ho messo la cartella ffmpeg in c/ffmpeg, e ho aggiunto l'ffmpeg/bin al mio ambiente varable, non so se necessario fluente-ffmpeg di conoscere il percorso di ffmpeg, ma io può successo crea una miniatura con il codice sottostante

exec("C:/ffmpeg/bin/ffmpeg -i Video/" + Name + " -ss 00:01:00.00 -r 1 -an -vframes 1 -s 300x200 -f mjpeg Video/" + Name + ".jpg") 

per favore aiutami !!!

+0

Per quello che vale, ho usato child_process.spawn per deporre le uova direttamente un processo di ffmpeg e aveva assolutamente nessun problema. Connettere stream a stdin, stdout e stderr era semplice. –

risposta

0

FFmpeg deve conoscere la durata di un file video, mentre la maggior parte dei video hanno queste informazioni nell'intestazione del file, alcuni file non lo fanno, per lo più video grezzi come un flusso H.264 crudo.

Una soluzione semplice potrebbe essere quella di remux il video prima di prendere l'istantanea, il comando FFmpeg 0.5 per questo compito è abbastanza semplice:

ffmpeg -i input.m4v -acodec copy -vcodec copy output.m4v 

Questo comando dice FFmpeg per leggere il file "input.m4v" , per utilizzare lo stesso codificatore audio e codificatore video (nessuna codifica) per l'output e per inviare i dati nel file output.m4v.

FFmpeg aggiunge automaticamente tutte le informazioni supplementari metadati/intestazione necessaria per scattare l'istantanea successiva.

0

provare questo codice per creare le miniature da video

// You have to Install Below packages First 
var ffmpegPath = require('@ffmpeg-installer/ffmpeg').path; 
var ffprobePath = require('@ffprobe-installer/ffprobe').path; 
var ffmpeg = require('fluent-ffmpeg'); 
ffmpeg.setFfmpegPath(ffmpegPath); 
ffmpeg.setFfprobePath(ffprobePath); 



      var proc = ffmpeg(sourceFilePath) 
      .on('filenames', function(filenames) { 
      console.log('screenshots are ' + filenames.join(', ')); 
      }) 
      .on('end', function() { 
      console.log('screenshots were saved'); 
      }) 
      .on('error', function(err) { 
      console.log('an error happened: ' + err.message); 
      }) 
      // take 1 screenshots at predefined timemarks and size 
      .takeScreenshots({ count: 1, timemarks: [ '00:00:01.000' ], size: '200x200' }, "Video/"); 
0

Credo che il problema può essere causato dal .withSize ('...') chiamata al metodo. Il documento dice:

Non si interrompe correttamente con i filtri. In particolare, non utilizzare il metodo size() per ridimensionare le miniature, utilizzare l'opzione di dimensione, invece.

E il metodo size() è un alias di withSize().

Inoltre, ma questo non è il problema nel tuo caso: non è necessario impostare contemporaneamente il conteggio e il timestamp. Il documento dice:

il conteggio viene ignorato quando vengono specificati timestamp o timestamp.

allora probabilmente potrebbe risolvere con:

const ffmpeg = require('fluent-ffmpeg'); 

exports.thumbnail = function(){ 
    const proc = new ffmpeg({ source: 'Video/express2.mp4',nolog: true }) 
    .takeScreenshots({ timemarks: [ '00:00:02.000' ], size: '150x100' }, 'Video/', function(err, filenames) { 
    console.log(filenames); 
    console.log('screenshots were saved'); 
    }); 
} 

Dai un'occhiata alla doc: https://github.com/fluent-ffmpeg/node-fluent-ffmpeg#screenshotsoptions-dirname-generate-thumbnails