2012-10-29 15 views
6

próbuję tworzyć miniatury wideo z płynną-ffmpeg Oto mój kodbiegle-ffmpeg błąd tworzenie miniatur

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

ale wciąż otrzymuję ten błąd

"mate data contains no duration, aborting screenshot creation" 

pojęcia dlaczego,

przy okazji jestem w oknach, i umieściłem folder ffmpeg w c/ffmpeg, i dodałem ffmpeg/bin do mojego środowiska zmiennego, nie wiem czy fluent-ffmpeg potrzebuje znać ścieżkę ffmpeg, ale ja może sukces lly utworzyć miniaturę z kodem poniżej

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

proszę mi pomóc!

+0

Na co warto, użyłem child_process.spawn do tarła proces ffmpeg bezpośrednio i miał absolutnie żadnych problemów. Łączenie strumieni do stdin, stdout i stderr było proste. –

Odpowiedz

0

FFmpeg musi znać czas trwania pliku wideo, podczas gdy większość filmów ma tę informację w nagłówku pliku, ale niektóre pliki nie, w większości surowe wideo, takie jak surowy strumień H.264.

Prostym rozwiązaniem mogłoby być remux wideo uprzedniej wziąć migawkę, komenda FFmpeg 0.5 dla tego zadania jest dość prosta:

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

Komenda ta mówi FFmpeg do zapoznania się z „input.m4v” plik , aby użyć tego samego kodera audio i kodera wideo (bez kodowania w ogóle) dla wyjścia i wyprowadzić dane do pliku output.m4v.

FFmpeg automatycznie dodaje wszystkie dodatkowe informacje dotyczące metadanych/nagłówków potrzebne do wykonania migawki później.

0

Spróbuj tego kodu do tworzenia miniaturek z wideo

// 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

Myślę, że problem może być spowodowany przez .withSize („...”) wywołanie metody. Dokumentacja mówi:

Nie współdziała ona dobrze z filtrami. W szczególności nie używaj metody size() do zmiany rozmiaru miniatur, użyj zamiast tego opcji rozmiaru.

A metoda size() jest aliasem metody withSize().

Również - ale nie jest to problemem w twoim przypadku - nie musisz ustawiać licznika i oznaczeń czasu w tym samym czasie. Dokument mówi:

liczba jest ignorowana, gdy określone są znaczniki czasu lub znaczniki czasu.

to prawdopodobnie może rozwiązać z:

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

Wystarczy popatrzeć na Doc: https://github.com/fluent-ffmpeg/node-fluent-ffmpeg#screenshotsoptions-dirname-generate-thumbnails

Powiązane problemy