2017-10-10 69 views
6

Używam biblioteki fluent-ffmpeg z node.js do transkodowania filmów oryginalnie w formacie flash do formatu mp3 z wieloma rozdzielczościach, 1080p itd. Po zakończeniu transkodowania Chciałbym przenieść transkodowany film wideo do kubełka s3.Przesyłanie wyników FFmpeg bezpośrednio do Amazon S3

Wyciągam oryginalny plik .flv z źródłowego wiadra s3 i przesyłam strumień do funkcji konstruktora ffmpeg. Problem jest po zakończeniu transkodowania, w jaki sposób otrzymam strumień danych mp4 do wysłania do s3.

Oto kod mam tak daleko:

 var params = { 
      Bucket: process.env.SOURCE_BUCKET, 
      Key: fileName 
     }; 
     s3.getObject(params, function(err, data) { 
      if (err) console.log(err, err.stack); // an error occurred 

      var format = ffmpeg(data) 
      .size('854x480') 
      .videoCodec('libx264') 
      .format('flv') 
      .toFormat('mp4'); 
      .on('end', function() { 
       //Ideally, I would like to do the uploading here 

       var params = { 
        Body: //{This is my confusion, how do I get the stream to add here?}, 
        Bucket: process.env.TRANSCODED_BUCKET, 
        Key: fileName 
       }; 
       s3.putObject(params, function (err, data) { 

       }); 
      }) 
      .on('error', function (err) { 
       console.log('an error happened: ' + err.message); 
      }); 

     }); 

Na powyższym kodzie, gdzie mogę uzyskać transkodowanie strumienia dodać do „ciała” właściwości obiektu params?

Aktualizacja:

Oto przegląd tego, co próbuję zrobić:

var outputStream: MemoryStream = new MemoryStream(); 

     var proc = ffmpeg(currentStream) 
      .size('1920x1080') 
      .videoCodec('libx264') 
      .format('avi') 
      .toFormat('mp4') 
      .output(outputStream) 
      // setup event handlers 
      .on('end', function() { 
       uploadFile(outputStream, "").then(function(){ 
        resolve(); 
       }) 
      }) 
      .on('error', function (err) { 
       console.log('an error happened: ' + err.message); 
      }); 

Chciałbym uniknąć kopiowania pliku w lokalnym systemie plików z S3, raczej wolałbym przetwarzać plik w pamięci i prześlij go z powrotem do s3 po zakończeniu. Czy fluent-ffmpeg zezwoliłoby na ten scenariusz?

Odpowiedz

2

Wydaje się, że nie zachowujesz wyjściowego transkodowania w dowolnym miejscu.

  1. Zapisz wyjście transkodowania (Twój nowy .flv pliku) przy użyciu output do lokalnego systemu plików.
  2. Podaj zawartość nowego pliku do putObject. Według the putObject documentation parametr Body akceptuje:

    Body - (Buffer, Typed Array, Blob, String, ReadableStream) danych obiektu.

Oto niektóre poprawione przykładowy kod:

// Generate a filename for the `.flv` version 
var flvFileName = fileName.substring(0, fileName.length - path.extname(fileName).length) + '.flv'; 

// Perform transcoding, save new video to new file name 
var format = ffmpeg(data) 
    .size('854x480') 
    .videoCodec('libx264') 
    .format('flv') 
    .toFormat('mp4'); 
    .output(flvFileName) 
    .on('end', function() { 
     // Provide `ReadableStream` of new video as `Body` for `pubObject` 
     var params = { 
      Body: fs.createReadStream(flvFileName) 
      Bucket: process.env.TRANSCODED_BUCKET, 
      Key: flvFileName 
     }; 

     s3.putObject(params, function (err, data) { 

     }); 
    }) 

Uwaga: Możesz być w stanie stworzyć strumień wyjściowy z fluent-ffmpeg i przesłać ten strumień do AWS S3, jeśli wolisz, ale będzie komplikować logikę i obsługę błędów.

+0

Czy istnieje sposób tymczasowego zapisu w buforze pamięci, a następnie wysłania bufora w parametrze Body? – user1790300

+0

Czy istnieje sposób na uniknięcie konieczności tymczasowego zapisywania pliku w systemie plików? – user1790300

Powiązane problemy