如何实时转换上载的文件并将其直接流式传输到Amazon S3

adc06

我正在处理一个将音频文件发送到由sails.js驱动的服务器的应用程序。

我需要即时转换此音频文件,并使用节点流将转换后的数据发送到Amazon S3。

我不想将数据存储在服务器上,但是将上传文件转换后直接将其流式传输到S3。

你知道这样做的方法吗?

我尝试使用强大的功能,但无法正常工作。有人成功实现了这样的事情吗?

谢谢

编辑

正如jibsales所注意到的,如果我向您展示到目前为止我尝试过的内容,可能会更好。因此,基本上我的策略是对流使用强大,流畅的ffmpeg和knox。

我计划接收具有强大功能的文件流,并将接收到的数据块写入第一流(流1),这将是使用fluent-ffmpeg进行转换的入口。然后fluent-ffmpeg将输出流写入到stream2中,该流是Knox的入口点。

我要面对的第一个问题是,强大的功能似乎并没有发挥作用。但是我不确定我的策略是否正确...

到目前为止的代码如下所示:

upload : function(req,res){

  //to streams to transfer file data
  var stream1 = new stream.Stream(); //stream for the incoming file data
  var stream2 = new stream.Stream(); //stream for the converted file data

  var client = knox.createClient({
            key: 'APIKEY'
          , secret: 'SECRET'
          , bucket: 'bucket'
        });

  //Using formidable to acces data chunks
  var form = new formidable.IncomingForm();

  form.parse(req, function(err, fields, files){ //form.parse is not called
  if(err){
      return res.json(err);
  }else{
      return res.send('ok');       
  }
  });

  //overriding form.onPart to get the file data chunk
  form.onPart = function(part) { 
        sails.log('getting part...');

        if (!part.filename) {
            form.handlePart(part);
            return;
        }
        //we put the data chunk in stream1 to convert it
        part.on('data', function(chunk) {
            stream1.write(chunk[1]);
        });
  }

  form.on('error',function(err){
    return sails.log(err);
  });

  form.on('progress', function(bytesReceived, bytesExpected) {
    sails.log(bytesReceived);
  });

  //conversion process
  var proc = new ffmpeg({ source : stream1})
  .withAudioCodec('libfdk_aac')
  .toFormat('mp3')
  .writeToStream(stream2, {end:true}, function(retcode, error){ 
    console.log('file has been converted succesfully');
  });


client.putStream(stream2, '/file.mp3', headers, function(err, response){
  return res.send(response);
});

},
adc06

我想出了一种使用fluent-ffmpeg和强大工具即时转换文件的方法。但是,暂时无法将来自ffmpeg转换的转换后的数据块直接流式传输到亚马逊,因为您必须精确调整转换期间未知的“ Content-Length”标头...

对于第一部分(客户端上传),我首先必须在config / express.js文件的上传路由中禁用express bodyParser:

var express = require('sails/node_modules/express');

module.exports.express = {
   bodyParser: function() {
    return function (req, res, next){
        console.log(req.path);
        if (!(req.path === '/upload' && req.method === 'POST')) {
        return express.bodyParser()(req, res, next);
      } else {
        return next();
      }
    }
   }
}

对于实现,我使用了基本上不执行任何操作的转换流。它只是获取上传数据的正确部分(与文件数据相关的部分)。它将强大的解析器链接到fluent-ffmpeg。然后,我只能将转换后的文件保存到磁盘上,然后再将其发送到亚马逊...

upload : function(req,res){

  var Transform =  Stream.Transform; //stream for the incoming file data
  var client = knox.createClient({
            key: 'KEY'
          , secret: 'SECRET'
          , bucket: 'BUCKET',
          region : 'eu-west-1' //don't forget the region (My bucket is in Europe)
        });


  function InputStream(options) 
  {
          if(!(this instanceof InputStream))
          {
            return  new InputStream(options);
          }
          Transform.call(this,options);
          return;
  };

  util.inherits(InputStream, Transform);

  var inputDataStream = new InputStream;

  var form = new formidable.IncomingForm();

  form.parse(req, function(err, fields, files)
  { 
    if(err){
        return res.send(err);
    }else{
        return;     
    }
  });

    form.onPart = function(part) 
    { 
        if (!part.filename) 
        {
            form.handlePart(part);
            return;
        }
        //we put the data chunk in stream1 to convert it
        part.on('data', function (chunk) 
        {
           if(!inputDataStream.write(chunk));
            form.pause()
            inputDataStream.once('drain', function(){form.resume()});
        });

        part.on('end', function (chunk){
          inputDataStream.end(chunk);
        });

    }

  InputStream.prototype._transform = function (chunk, enc, cb)
  {
    this.push(chunk);
    cb();
  }

  var proc = new ffmpeg({ source : inputDataStream})
      .withAudioBitrate('64k')
      .withAudioCodec('libmp3lame')
      .toFormat('mp3')
      .saveToFile('file.mp3',  function (retcode, error){ 
        console.log('file has been converted successfully');
        res.send('ok');
          var upload = new MultiPartUpload(
          {
            client : client,
            objectName: 'file.mp3',
            file: 'file.mp3'
          }, function(err,body){
            if(err) {
              console.log(err);
              return;
            }
            console.log(body);
            return;
          });

      });
  },

编辑

实际上,使用knox-mpu可以直接将数据流传输到Amazon s3!您只需要创建另一个转换流,它将成为您上传的源,而knox-mpu就是魔术。谢谢大家!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用NodeJS + Express,aws-sdk将文件直接流式传输到s3

来自分类Dev

从Amazon S3流式传输文件

来自分类Dev

如何使用Knox将文件从NodeJS流传输到Amazon S3?

来自分类Dev

正在将文件流式传输到S3“错误:流意外终止”

来自分类Dev

如何即时转换上传的文件并将其直接流式传输到Amazon S3

来自分类Dev

Amazon s3或Cloudfront

来自分类Dev

不会从Amazon S3删除文件

来自分类Dev

使用可笑的内存量使用lambda将文件从URI直接流式传输到S3

来自分类Dev

Amazon S3存储敏感文件

来自分类Dev

如何使用nodejs在Amazon s3上上传图像并将其公开

来自分类Dev

Amazon S3压缩文件?

来自分类Dev

Android Amazon S3上载崩溃

来自分类Dev

将文件的FTP(CSV)自动传输到Amazon S3存储桶

来自分类Dev

使用Paramiko将文件从SFTP传输到S3

来自分类Dev

每当我向s3添加新文件时,如何将文件从s3传输到ec2实例?

来自分类Dev

Fineuploader:将大型文件传输到Amazon S3

来自分类Dev

正在将文件流式传输到S3“错误:流意外终止”

来自分类Dev

Amazon s3或Cloudfront

来自分类Dev

如何将图像流式传输到Amazon S3

来自分类Dev

从Web服务器将文件传输到Amazon S3

来自分类Dev

上载到AWS S3失败

来自分类Dev

使用 SimpleImage 调整图像大小并将其直接发送到 Amazon S3

来自分类Dev

如何从 Amazon S3 查询数据

来自分类Dev

无法使用请求从 Amazon s3 流式传输文件

来自分类Dev

用于将 FTP 文件从 Raspberry Pi 传输到 Amazon S3 的 Bash 脚本

来自分类Dev

应用程序关闭时将文件传输到 Amazon S3

来自分类Dev

Rails:无法从 URL 保存文件并将其保存到 Amazon S3 (S3::Error::ResponseError)

来自分类Dev

将“Azure Blob 存储”文件 URL 流式传输到 Amazon S3 存储桶

来自分类Dev

Python 将数据流式传输到 S3 但出现 104 错误是最好的方法

Related 相关文章

  1. 1

    使用NodeJS + Express,aws-sdk将文件直接流式传输到s3

  2. 2

    从Amazon S3流式传输文件

  3. 3

    如何使用Knox将文件从NodeJS流传输到Amazon S3?

  4. 4

    正在将文件流式传输到S3“错误:流意外终止”

  5. 5

    如何即时转换上传的文件并将其直接流式传输到Amazon S3

  6. 6

    Amazon s3或Cloudfront

  7. 7

    不会从Amazon S3删除文件

  8. 8

    使用可笑的内存量使用lambda将文件从URI直接流式传输到S3

  9. 9

    Amazon S3存储敏感文件

  10. 10

    如何使用nodejs在Amazon s3上上传图像并将其公开

  11. 11

    Amazon S3压缩文件?

  12. 12

    Android Amazon S3上载崩溃

  13. 13

    将文件的FTP(CSV)自动传输到Amazon S3存储桶

  14. 14

    使用Paramiko将文件从SFTP传输到S3

  15. 15

    每当我向s3添加新文件时,如何将文件从s3传输到ec2实例?

  16. 16

    Fineuploader:将大型文件传输到Amazon S3

  17. 17

    正在将文件流式传输到S3“错误:流意外终止”

  18. 18

    Amazon s3或Cloudfront

  19. 19

    如何将图像流式传输到Amazon S3

  20. 20

    从Web服务器将文件传输到Amazon S3

  21. 21

    上载到AWS S3失败

  22. 22

    使用 SimpleImage 调整图像大小并将其直接发送到 Amazon S3

  23. 23

    如何从 Amazon S3 查询数据

  24. 24

    无法使用请求从 Amazon s3 流式传输文件

  25. 25

    用于将 FTP 文件从 Raspberry Pi 传输到 Amazon S3 的 Bash 脚本

  26. 26

    应用程序关闭时将文件传输到 Amazon S3

  27. 27

    Rails:无法从 URL 保存文件并将其保存到 Amazon S3 (S3::Error::ResponseError)

  28. 28

    将“Azure Blob 存储”文件 URL 流式传输到 Amazon S3 存储桶

  29. 29

    Python 将数据流式传输到 S3 但出现 104 错误是最好的方法

热门标签

归档