使用FFMPEG转换文件并上传到AWS S3 Node.js

编程入门 行业动态 更新时间:2024-10-10 03:26:42

使用FFMPEG转换<a href=https://www.elefans.com/category/jswz/34/1771438.html style=文件并上传到AWS S3 Node.js"/>

使用FFMPEG转换文件并上传到AWS S3 Node.js

嘿大家这么快的问题,我想允许用户上传一个WebM文件,并使用FFmpeg将其转换为mp4。我正在使用Nodejs作为后端,并且已经有了将文件上传到Amazon S3文件存储的路由。但是,假设我想发送该文件,而不是将其存储在任何地方,而是可以从请求本身将其转换为mp4,这可能吗?如果不是,可以使用s3文件URL并将其转换为mp4吗?任何人都可以向我指出正确的方向,以了解可行的方法和最佳方法吗?

基本上我只想做

const objectUrl = createObjectURL(Blob);
ffmpeg -i objectURL S3OutputLocation

ffmpeg -i myS3InputLocation myS3OutputLocation
回答如下:

好的,要完成这项工作,您需要做几件事。1.您需要设置multer的本地实例,因为您需要在转到s3之前在本地上传文件。我尝试直接使用s3进行此操作,但是它似乎使用了许多昂贵且耗时的读取操作,而这些操作比将文件首先写入服务器要花费更长的时间。我发现这是最好的解决方案。

您这样做是:

const localStorage = multer.diskStorage({
  destination: function(req, file, cb) {
    const destination = __dirname + "\\canvas-uploads";
    console.log("destination", destination);
    cb(null, destination);
  },
  filename: function(req, file, cb) {
    const filename = req.body.id + "." + file.mimetype.toString().slice(file.mimetype.toString().lastIndexOf("/") + 1);
    console.log("filename", filename);
    cb(null, filename);
  }
});
  const uploadLocal = multer({
    storage: localStorage
  });
  1. 为了方便起见,您需要设置ffmpeg-fluent并将其包装在Promise中,以便可以确保所有处理都完成了(在同一路径中上载到s3等)。

您这样做是:

router.post('/upload-temp', uploadLocal.array("upload"), async(req, res, next) =>{
  res.json({id: req.body.id});
});

router.post('/ffmpeg', async(req, res, next) => {
    try {
    const reqPath = path.join(__dirname, '../upload/canvas-uploads/');
     const {id, type} = req.body;
    const localFileInput = `${reqPath}${id}.webm`;
    const localFileOutput = `${reqPath}${id}.${type}`;
    console.log("localInput", localFileInput);
    console.log("localOutput", localFileOutput);
    const key = `canvas/${id}.${type}`;
    await new Promise((resolve, reject) => {
        ffmpeg().input(localFileInput)
        .withOutputFormat(type)
        .output(localFileOutput)
        .on('end',async ()=> {
            const fileContent = await fs.readFileSync(localFileOutput);
             await fs.unlinkSync(localFileInput);
             await fs.unlinkSync(localFileOutput);
            const params = {
              Bucket: process.env.BUCKET_NAME,
              Key: key,
              Body: fileContent
            }
            await s3.putObject(params).promise();
            resolve();
            }).run();  
    })

    res.send("success")
} catch(error){
    console.log(error);
    res.send(error);
}
});

更多推荐

使用FFMPEG转换文件并上传到AWS S3 Node.js

本文发布于:2024-05-07 06:34:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1754849.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:文件   AWS   FFMPEG   js   Node

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!