2012-10-29 8 views
6

ich versuche, ein Video-Thumbnail mit fließend-ffmpeg zu erstellen hier ist mein Codefließend-ffmpeg Thumbnail-Erstellung Fehler

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

aber ich halte diesen Fehler

"mate data contains no duration, aborting screenshot creation" 

eine Ahnung, warum,

übrigens bin auf Windows, und ich legte den Ordner ffmpeg in c/ffmpeg, und ich habe die ffmpeg/bin in meiner Umgebung Variablen, ich weiß nicht, ob fließend-ffmpeg muss den Pfad von ffmpeg wissen, aber ich kann Erfolg haben Erstellen Sie ein Thumbnail mit dem Code unter

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") 

bitte helfen Sie mir !!!

+0

Für was es wert ist, habe ich child_process.spawn ein ffmpeg Prozess direkt zum Laichen und hatte absolut keine Probleme. Das Verbinden von Streams mit stdin, stdout und stderr war ganz einfach. –

Antwort

0

FFmpeg muss die Dauer einer Videodatei kennen, während die meisten Videos diese Informationen im Dateiheader enthalten, manche Dateien nicht, meistens rohe Videos wie ein roher H.264-Stream.

Eine einfache Lösung vor dem Video muxen sein könnte, den Snapshot nehmen, es ist der FFmpeg 0.5 Befehl für diese Aufgabe ganz einfach:

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

Dieser Befehl FFmpeg die „input.m4v“ Datei zu lesen, sagt , um den gleichen Audio-Encoder und Video-Encoder (keine Kodierung) für die Ausgabe zu verwenden und die Daten in die Datei output.m4v auszugeben.

FFmpeg fügt automatisch alle zusätzlichen Metadaten/Header-Informationen hinzu, die für die spätere Erstellung des Snapshots erforderlich sind.

0

diesen Code Versuchen Thumbnails von 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

ich das Problem denken zu schaffen, durch die .withSize ('...') Methodenaufruf verursacht werden. Das Dokument sagt:

Es interagiert nicht gut mit Filtern. Verwenden Sie insbesondere nicht die Größe() -Methode, um die Größe von Miniaturansichten zu ändern, sondern verwenden Sie stattdessen die Größenoption.

Und die Methode size() ist ein Alias ​​von withSize().

Auch - aber das ist nicht das Problem in Ihrem Fall - Sie müssen weder die Anzahl und die timemarks zur gleichen Zeit einstellen. Das Dokument sagt:

count wird ignoriert, wenn timemarks oder timestamps angegeben ist.

Dann könnten Sie wahrscheinlich lösen mit:

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

einen Blick auf die doc: https://github.com/fluent-ffmpeg/node-fluent-ffmpeg#screenshotsoptions-dirname-generate-thumbnails