2017-10-10 95 views
6

Tôi đang sử dụng thư viện fluent-ffmpeg với node.js để chuyển mã video ban đầu ở định dạng phim flash sang định dạng mp3 với nhiều độ phân giải, 1080p, v.v. Sau khi quá trình chuyển mã hoàn tất, Tôi muốn di chuyển video đã chuyển mã sang nhóm s3.Tải lên đầu ra FFmpeg trực tiếp lên Amazon S3

Tôi kéo tệp .flv gốc từ một thùng nguồn s3 và truyền luồng tới hàm hàm tạo ffmpeg. Vấn đề là sau khi quá trình chuyển mã hoàn tất, làm thế nào để tôi nhận được luồng dữ liệu mp4 để gửi tới s3.

Dưới đây là đoạn code tôi có cho đến nay:

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

     }); 

Đối với các mã trên, nơi tôi có thể nhận được dòng chuyển mã để thêm vào "Body" tài sản của đối tượng params?

Cập nhật:

Dưới đây là một phiên bản của những gì tôi đang cố gắng để làm:

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

Tôi muốn tránh sao chép các tập tin vào hệ thống tập tin địa phương từ s3, chứ không phải tôi muốn để xử lý các tập tin trong bộ nhớ và tải lên trở lại s3 khi hoàn thành. Fluent-ffmpeg có cho phép kịch bản này không?

Trả lời

2

Dường như bạn không lưu được đầu ra của quá trình chuyển mã ở bất kỳ đâu.

  1. Lưu đầu ra của quá trình chuyển mã (.flv tệp mới) sử dụng hệ thống tệp cục bộ của bạn.
  2. Cung cấp nội dung tệp mới của bạn cho putObject. Theo the putObject documentation, tham số Body chấp nhận:

    Body - (Buffer, Typed Array, Blob, String, ReadableStream) dữ liệu Object.

Dưới đây là một số mẫu mã sửa đổi:

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

     }); 
    }) 

Lưu ý: Bạn có thể tạo ra một output stream từ fluent-ffmpeg và tải lên đó dòng để AWS S3, nếu bạn thích, nhưng điều này sẽ làm phức tạp logic và xử lý lỗi.

+0

Có cách nào để ghi vào bộ đệm tạm thời, sau đó gửi bộ đệm trong tham số Body? – user1790300

+0

Có cách nào để tránh phải tạm thời ghi tệp vào hệ thống tệp không? – user1790300

Các vấn đề liên quan