2017-10-10 19 views
6

私はnode.jsでfluent-ffmpegライブラリを使用して、もともとフラッシュムービー形式のビデオを複数の解像度、1080pなどのmp3形式にトランスコードしています。トランスコードが完了したら、トランスコードされたビデオをs3バケットに移動したいと思います。FFmpeg出力をAmazon S3に直接アップロード

元の.flvファイルをソースs3バケットから取り出し、ストリームをffmpegコンストラクタ関数に渡します。問題は、トランスコードが完了した後、mp3データのストリームをs3に送信する方法を教えてください。上記のコードの場合

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

     }); 

、私はトランスコードストリームのparamsオブジェクトの「ボディ」プロパティに追加して得ることができます?ここ

は、私がこれまで持っているコードですか。

アップデート:ここで

は私がやろうとしています何の改訂版である:

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

私はむしろ、私はプロセスに好む、S3からローカルファイルシステムにファイルをコピー避けたいです終了時にメモリ内のファイルをアップロードしてs3に戻します。 fluent-ffmpegはこのシナリオを許しますか?

答えて

2

トランスコードの出力をどこにも保存していないようです。

  1. ローカルのファイルシステムにoutputを使用してトランスコーディング(新しい.flvファイル)の出力を保存します。
  2. 新しいファイルの内容をputObjectに入力してください。 the putObject documentationによれば、Bodyパラメータが受け入れ:

    Body - (BufferTyped ArrayBlobStringReadableStream)オブジェクトデータを。

ここではいくつかの改訂版のサンプルコードです:

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

     }); 
    }) 

注:fluent-ffmpegからの出力ストリームを作成することができ、あなたが好む場合、AWS S3にそのストリームをアップロードすることができるが、この意志はロジックとエラー処理が複雑になります。

+0

一時的にメモリバッファに書き込む方法はありますか?次に、ボディパラメータにバッファを送りますか? – user1790300

+0

一時的にファイルシステムにファイルを書き込まなくてもいい方法はありますか? – user1790300

関連する問題