2017-10-10 27 views
6

node.js와 함께 fluent-ffmpeg 라이브러리를 사용하여 원래 플래시 무비 포맷의 비디오를 다중 해상도, 1080p 등의 mp3 포맷으로 코드 변환합니다. 트랜스 코딩이 완료되면, 트랜스 코딩 된 비디오를 s3 버켓으로 옮기고 싶습니다.FFmpeg 출력을 Amazon S3에 직접 업로드

원본 s3 버킷에서 원본 .flv 파일을 가져 와서 스트림을 ffmpeg 생성자 함수에 전달합니다. 문제는 트랜스 코딩이 완료된 후 어떻게 mp3 데이터 스트림을 s3으로 보내야하는지입니다. 내가 트랜스 코딩 된 스트림 params 객체의 "몸"속성에 추가 얻을 수있는, 위의 코드에 대한

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

     }); 

: 여기

내가 지금까지 가지고있는 코드는?

는 업데이트 : 오히려 내가 처리하는 것을 선호

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 - (Buffer, Typed Array, Blob, String, ReadableStream) Object 데이터를. 여기

은 일부 수정 예제 코드입니다 :

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

     }); 
    }) 

주 : 당신은 당신이 원하는 경우, AWS S3에 그 스트림을 fluent-ffmpeg에서 출력 스트림을 생성하고 업로드 할 수 있지만,이 것 논리 및 오류 처리가 복잡합니다.

+0

일시적으로 메모리 버퍼에 쓰고 Body 매개 변수에 버퍼를 보내는 방법이 있습니까? – user1790300

+0

일시적으로 파일을 파일 시스템에 쓰지 않아도되는 방법이 있습니까? – user1790300